Coder Social home page Coder Social logo

volga-volga / react-native-yamap Goto Github PK

View Code? Open in Web Editor NEW
143.0 11.0 78.0 542 KB

React Native Yandex Maps | Яндекс Карты | Yandex.MapKit implementation for react native | YandexMaps

Ruby 0.24% Java 47.44% Objective-C 40.04% TypeScript 12.27%
map maps open-source react-native react-native-maps typescript yandex yandex-maps ymaps yandexmap

react-native-yamap's Introduction

React Native Yandex Maps (Яндекс Карты)

Библиотека для интеграции Yandex Maps (Яндекс Карт) в React Native.

Пример

Пример использования библиотеки

Установка

yarn add react-native-yamap

или

npm i react-native-yamap --save

Линковка

Если вы планируете использовать только API геокодера, то линковка библиотеки необязательна. В таком случае, можете отключить автолинкинг библиотеки для React Native >0.60.

Для использования Yandex MapKit необходима линковка (библиотека поддерживает автолинкинг).

Линковка в React Native <0.60

react-native link react-native-yamap

Использование карт

Инициализировать карты

Для этого лучше всего зайти в корневой файл приложения, например App.js, и добавить инициализацию:

import YaMap from 'react-native-yamap';

YaMap.init('API_KEY');

iOS

Обязательно инициализировать MapKit в функции didFinishLaunchingWithOptions в AppDelegate.m/AppDelegate.mm:

#import <YandexMapsMobile/YMKMapKitFactory.h>

...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  ...

  [YMKMapKit setLocale:@"ru_RU"];
  [YMKMapKit setApiKey:@"API_KEY"];

  return YES;
}

Изменение языка карт

import YaMap from 'react-native-yamap';

const currentLocale = await YaMap.getLocale();
YaMap.setLocale('en_US');  // 'ru_RU' или другие
YaMap.resetLocale();
  • getLocale(): Promise<string> - возвращает используемый язык карт;

  • setLocale(locale: string): Promise<void> - установить язык карт;

  • resetLocale(): Promise<void> - использовать для карт язык системы.

Каждый метод возвращает Promise, который выполняется при ответе нативного SDK. Promise может отклониться, если SDK вернет ошибку.

ВАЖНО!

  1. Для Android изменение языка карт вступит в силу только после перезапуска приложения.
  2. Для iOS методы изменения языка можно вызывать только до первого рендера карты. Также нельзя повторно вызывать метод, если язык уже изменялся (можно только после перезапуска приложения), иначе изменения приняты не будут, а в терминал будет выведено сообщение с пердупреждением. В коде при этом не будет информации об ошибке.

Использование компонента

import React from 'react';
import YaMap from 'react-native-yamap';

const Map = () => {
  return (
    <YaMap
      userLocationIcon={{ uri: 'https://www.clipartmax.com/png/middle/180-1801760_pin-png.png' }}
      initialRegion={{
        lat: 50,
        lon: 50,
        zoom: 10,
        azimuth: 80,
        tilt: 100
      }}
      style={{ flex: 1 }}
    />
  );
};

Основные типы

interface Point {
  lat: Number;
  lon: Number;
}

interface ScreenPoint {
  x: number;
  y: number;
}

interface MapLoaded {
  renderObjectCount: number;
  curZoomModelsLoaded: number;
  curZoomPlacemarksLoaded: number;
  curZoomLabelsLoaded: number;
  curZoomGeometryLoaded: number;
  tileMemoryUsage: number;
  delayedGeometryLoaded: number;
  fullyAppeared: number;
  fullyLoaded: number;
}

interface InitialRegion {
  lat: number;
  lon: number;
  zoom?: number;
  azimuth?: number;
  tilt?: number;
}


type MasstransitVehicles = 'bus' | 'trolleybus' | 'tramway' | 'minibus' | 'suburban' | 'underground' | 'ferry' | 'cable' | 'funicular';

type Vehicles = MasstransitVehicles | 'walk' | 'car';

type MapType = 'none' | 'raster' | 'vector';


interface DrivingInfo {
  time: string;
  timeWithTraffic: string;
  distance: number;
}

interface MasstransitInfo {
  time:  string;
  transferCount:  number;
  walkingDistance:  number;
}

interface RouteInfo<T extends(DrivingInfo | MasstransitInfo)> {
  id: string;
  sections: {
    points: Point[];
    sectionInfo: T;
    routeInfo: T;
    routeIndex: number;
    stops: any[];
    type: string;
    transports?: any;
    sectionColor?: string;
  }
}

interface RoutesFoundEvent<T extends(DrivingInfo | MasstransitInfo)> {
  nativeEvent:  {
    status: 'success' | 'error';
    id: string;
    routes: RouteInfo<T>[];
  };
}

interface CameraPosition {
  zoom: number;
  tilt: number;
  azimuth: number;
  point: Point;
}

type VisibleRegion = {
  bottomLeft: Point;
  bottomRight: Point;
  topLeft: Point;
  topRight: Point;
}


type YamapSuggest = {
  title: string;
  subtitle?: string;
  uri?: string;
}

type YamapCoords = {
  lon: number;
  lat: number;
}

type YamapSuggestWithCoords = {
  lon: number;
  lat: number;
  title: string;
  subtitle?: string;
  uri?: string;
}

type YandexLogoPosition = {
  horizontal: 'left' | 'center' | 'right';
  vertical: 'top' | 'bottom';
}

type YandexLogoPadding = {
  horizontal?: number;
  vertical?: number;
}

Доступные props для компонента MapView:

Название Тип Стандартное значение Описание
showUserPosition boolean true Отслеживание геоданных и отображение позиции пользователя
followUser boolean true слежение камеры за пользователем
userLocationIcon ImageSource false Иконка для позиции пользователя. Доступны те же значения что и у компонента Image из React Native
userLocationIconScale number 1 Масштабирование иконки пользователя
initialRegion InitialRegion Изначальное местоположение карты при загрузке
interactive boolean true Интерактивная ли карта (перемещение по карте, отслеживание нажатий)
nightMode boolean false Использование ночного режима
onMapLoaded function Колбек на загрузку карты
onCameraPositionChange function Колбек на изменение положения камеры
onCameraPositionChangeEnd function Колбек при завершении изменения положения камеры
onMapPress function Событие нажития на карту. Возвращает координаты точки на которую нажали
onMapLongPress function Событие долгого нажития на карту. Возвращает координаты точки на которую нажали
userLocationAccuracyFillColor string Цвет фона зоны точности определения позиции пользователя
userLocationAccuracyStrokeColor string Цвет границы зоны точности определения позиции пользователя
userLocationAccuracyStrokeWidth number Толщина зоны точности определения позиции пользователя
scrollGesturesEnabled boolean true Включены ли жесты скролла
zoomGesturesEnabled boolean true Включены ли жесты зума
tiltGesturesEnabled boolean true Включены ли жесты наклона камеры двумя пальцами
rotateGesturesEnabled boolean true Включены ли жесты поворота камеры
fastTapEnabled boolean true Убрана ли задержка в 300мс при клике/тапе
clusterColor string 'red' Цвет фона метки-кластера
maxFps number 60 Максимальная частота обновления карты
logoPosition YandexLogoPosition {} Позиция логотипа Яндекса на карте
logoPadding YandexLogoPadding {} Отступ логотипа Яндекса на карте
mapType string 'vector' Тип карты
mapStyle string {} Стили карты согласно документации

Доступные методы для компонента MapView:

  • fitMarkers(points: Point[]): void - подобрать положение камеры, чтобы вместить указанные маркеры (если возможно);
  • fitAllMarkers(): void - подобрать положение камеры, чтобы вместить все маркеры (если возможно);
  • setCenter(center: { lon: number, lat: number }, zoom: number = 10, azimuth: number = 0, tilt: number = 0, duration: number = 0, animation: Animation = Animation.SMOOTH) - устанавливает камеру в точку с заданным zoom, поворотом по азимуту и наклоном карты (tilt). Можно параметризовать анимацию: длительность и тип. Если длительность установить 0, то переход будет без анимации. Возможные типы анимаций Animation.SMOOTH и Animation.LINEAR;
  • setZoom(zoom: number, duration: number, animation: Animation) - изменить текущий zoom карты. Параметры duration и animation работают по аналогии с setCenter;
  • getCameraPosition(callback: (position: CameraPosition) => void) - запрашивает положение камеры и вызывает переданный колбек с текущим значением;
  • getVisibleRegion(callback: (region: VisibleRegion) => void) - запрашивает видимый регион и вызывает переданный колбек с текущим значением;
  • findRoutes(points: Point[], vehicles: Vehicles[], callback: (event: RoutesFoundEvent) => void) - запрос маршрутов через точки points с использованием транспорта vehicles. При получении маршрутов будет вызван callback с информацией обо всех маршрутах (подробнее в разделе "Запрос маршрутов");
  • findMasstransitRoutes(points: Point[], callback: (event: RoutesFoundEvent<MasstransitInfo>) => void): void - запрос маршрутов на любом общественном транспорте;
  • findPedestrianRoutes(points: Point[], callback: (event: RoutesFoundEvent<MasstransitInfo>) => void): void - запрос пешеходного маршрута;
  • findDrivingRoutes(points: Point[], callback: (event: RoutesFoundEvent<DrivingInfo>) => void): void - запрос маршрута для автомобиля;
  • setTrafficVisible(isVisible: boolean): void - включить/отключить отображение слоя с пробками на картах;
  • getScreenPoints(point: Point[], callback: (screenPoints: ScreenPoint[]) => void) - получить кооординаты на экране (x и y) по координатам маркеров;
  • getWorldPoints(screenPoint: ScreenPoint[], callback: (worldPoints: Point[]) => void) - получить координаты точек (lat и lon) по координатам на экране.

ВАЖНО

  • Компонент карт стилизуется, как и View из React Native. Если карта не отображается, после инициализации с валидным ключем API, вероятно необходимо прописать стиль, который опишет размеры компонента (height + width или flex);
  • При использовании изображений из JS (через require('./img.png')) в дебаге и релизе на Android могут быть разные размеры маркера. Рекомендуется проверять рендер в релизной сборке.

Отображение примитивов

Marker

import { Marker } from 'react-native-yamap';

<YaMap>
  <Marker point={{ lat: 50, lon: 50 }}/>
</YaMap>

Доступные props для примитива Marker:

Название Тип Описание
point Point Координаты точки для отображения маркера
scale number Масштабирование иконки маркера. Не работает если использовать children у маркера
source ImageSource Данные для изображения маркера
children ReactElement Рендер маркера как компонента
onPress function Действие при нажатии/клике
anchor { x: number, y: number } Якорь иконки маркера. Координаты принимают значения от 0 до 1
zIndex number Отображение элемента по оси Z
visible boolean Отображение маркера на карте

Доступные методы для примитива Marker:

  • animatedMoveTo(point: Point, duration: number) - плавное изменение позиции маркера;
  • animatedRotateTo(angle: number, duration: number) - плавное вращение маркера.

Circle

import { Circle } from 'react-native-yamap';

<YaMap>
  <Circle center={{ lat: 50, lon: 50 }} radius={300} />
</YaMap>

Доступные props для примитива Circle:

Название Тип Описание
center Point Координаты центра круга
radius number Радиус круга в метрах
fillColor string Цвет заливки
strokeColor string Цвет границы
strokeWidth number Толщина границы
onPress function Действие при нажатии/клике
zIndex number Отображение элемента по оси Z

Polyline

import { Polyline } from 'react-native-yamap';

<YaMap>
  <Polyline
    points={[
      { lat: 50, lon: 50 },
      { lat: 50, lon: 20 },
      { lat: 20, lon: 20 },
    ]}
  />
</YaMap>

Доступные props для примитива Polyline:

Название Тип Описание
points Point[] Массив точек линии
strokeColor string Цвет линии
strokeWidth number Толщина линии
outlineColor string Цвет обводки
outlineWidth number Толщина обводки
dashLength number Длина штриха
dashOffset number Отступ первого штриха от начала полилинии
gapLength number Длина разрыва между штрихами
onPress function Действие при нажатии/клике
zIndex number Отображение элемента по оси Z

Polygon

import { Polygon } from 'react-native-yamap';

<YaMap>
  <Polygon
    points={[
      { lat: 50, lon: 50 },
      { lat: 50, lon: 20 },
      { lat: 20, lon: 20 },
    ]}
  />
</YaMap>

Доступные props для примитива Polygon:

Название Тип Описание
points Point[] Массив точек линии
fillColor string Цвет заливки
strokeColor string Цвет границы
strokeWidth number Толщина границы
innerRings (Point[])[] Массив полилиний, которые образуют отверстия в полигоне
onPress function Действие при нажатии/клике
zIndex number Отображение элемента по оси Z

Запрос маршрутов

Маршруты можно запросить используя метод findRoutes компонента YaMap (через ref).

findRoutes(points: Point[], vehicles: Vehicles[], callback: (event: RoutesFoundEvent) => void) - запрос маршрутов через точки points с использованием транспорта vehicles. При получении маршрутов будет вызван callback с информацией обо всех маршрутах.

Доступны следующие роутеры из Yandex MapKit:

  • masstransit - для маршрутов на общественном транспорте;
  • pedestrian - для пешеходных маршрутов;
  • driving - для маршрутов на автомобиле.

Тип роутера зависит от переданного в функцию массива vehicles:

  • Если передан пустой массив (this.map.current.findRoutes(points, [], () => null);), то будет использован PedestrianRouter;
  • Если передан массив с одним элементом 'car' (this.map.current.findRoutes(points, ['car'], () => null);), то будет использован DrivingRouter;
  • Во всех остальных случаях используется MasstransitRouter.

Также можно использовать нужный роутер, вызвав соответствующую функцию

findMasstransitRoutes(points: Point[], callback: (event: RoutesFoundEvent) => void): void;
findPedestrianRoutes(points: Point[], callback: (event: RoutesFoundEvent) => void): void;
findDrivingRoutes(points: Point[], callback: (event: RoutesFoundEvent) => void): void;

Замечание

В зависимости от типа роутера информация о маршутах может незначительно отличаться.

Использование API геокодера

Инициализация

import { Geocoder } from 'react-native-yamap';

Geocoder.init('API_KEY');

API_KEY для API геокодера и для карт отличаются. Инициализировать надо оба класса и каждый со своим ключем.

Прямое геокодирование

Geocoder.geocode(geocode: Point, kind?: ObjectKind, results?: number, skip?: number, lang?: Lang);

Документация по запросу к геокодеру Документация по ответу геокодера

Упрощенный вызов

Geocoder.geoToAddress(geo: Point);

Вернет null или объект адреса (строковое значение, почтовый индекс и массив компонентов адреса) первого из предложений геокодера.

interface Address {
  country_code: string;
  formatted: string;
  postal_code: string;
  Components: {
    kind: string,
    name: string
  }[];
}

Обратное геокодирование

Geocoder.reverseGeocode(geocode: string, kind?: ObjectKind, results?: number,  skip?: number, lang?: Lang, rspn?: 0 | 1, ll?: Point, spn?: [number, number],  bbox?: [Point, Point]);

Документация по запросу к геокодеру Документация по ответу геокодера

Упрощенный вызов

Geocoder.addressToGeo(address: string);

Вернет null или координаты { lat: number, lon: number } первого объекта из предложений геокодера.

Поиск по гео с подсказсками (GeoSuggestions)

Для поиска с геоподсказками нужно воспользоваться модулем Suggest:

import { Suggest } from 'react-native-yamap';

const find = async (query: string, options?: SuggestOptions) => {
  const suggestions = await Suggest.suggest(query, options);

  // suggestion = [{
  //   subtitle: "Москва, Россия"
  //   title: "улица Льва Толстого, 16"
  //   uri: "ymapsbm1://geo?ll=37.587093%2C55.733974&spn=0.001000%2C0.001000&text=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F%2C%20%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0%2C%20%D1%83%D0%BB%D0%B8%D1%86%D0%B0%20%D0%9B%D1%8C%D0%B2%D0%B0%20%D0%A2%D0%BE%D0%BB%D1%81%D1%82%D0%BE%D0%B3%D0%BE%2C%2016"
  // }, ...]

  const suggestionsWithCoards = await Suggest.suggestWithCoords(query, options);

  // suggestionsWithCoards = [{
  //   subtitle: "Москва, Россия"
  //   title: "улица Льва Толстого, 16"
  //   lat: 55.733974
  //   lon: 37.587093
  //   uri: "ymapsbm1://geo?ll=37.587093%2C55.733974&spn=0.001000%2C0.001000&text=%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F%2C%20%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0%2C%20%D1%83%D0%BB%D0%B8%D1%86%D0%B0%20%D0%9B%D1%8C%D0%B2%D0%B0%20%D0%A2%D0%BE%D0%BB%D1%81%D1%82%D0%BE%D0%B3%D0%BE%2C%2016"
  // }, ...]

  // After searh session is finished
  Suggest.reset();
}

Использование компонента ClusteredYamap

import React from 'react';
import { ClusteredYamap } from '../../react-native-yamap/src';

const Map = () => {
  return (
    <ClusteredYamap
      clusterColor="red"
      clusteredMarkers={[
        {
          point: {
            lat: 56.754215,
            lon: 38.622504,
          },
          data: {},
        },
        {
          point: {
            lat: 56.754215,
            lon: 38.222504,
          },
          data: {},
        },
      ]}
      renderMarker={(info, index) => (
        <Marker
          key={index}
          point={info.point}
        />
      )}
      style={{flex: 1}}
    />
  );
};

Использование с Expo

Для подключения нативного модуля в приложение с expo используйте expo prebuild. Он выполнит eject и сгенерирует привычные папки android и ios с нативным кодом. Это позволит использовать любую библиотеку так же, как и приложение с react native cli.

Для корректной работы на iOS react-native-yamap требует обновить AppDelegate.mm и инициализировать YMKMapKit при запуске приложения. prebuild не гарантирует сохранности папок android и ios, их нет смысла включать в Git. Чтобы напрямую менять нативный код есть config plugins.

Обновите app.json на app.config.ts и используйте этот пример модификации AppDelegate:

import { type ExpoConfig } from "@expo/config-types";
import { withAppDelegate, type ConfigPlugin } from "expo/config-plugins";

const config: ExpoConfig = {
  name: "Example",
  slug: "example-app",
  version: "1.0.0",
  extra: {
    mapKitApiKey: "bla-bla-bla",
  },
};

const withYandexMaps: ConfigPlugin = (config) => {
  return withAppDelegate(config, async (config) => {
    const appDelegate = config.modResults;

    // Add import
    if (!appDelegate.contents.includes("#import <YandexMapsMobile/YMKMapKitFactory.h>")) {
      // Replace the first line with the intercom import
      appDelegate.contents = appDelegate.contents.replace(
        /#import "AppDelegate.h"/g,
        `#import "AppDelegate.h"\n#import <YandexMapsMobile/YMKMapKitFactory.h>`
      );
    }

    const mapKitMethodInvocations = [
      `[YMKMapKit setApiKey:@"${config.extra?.mapKitApiKey}"];`,
      `[YMKMapKit setLocale:@"ru_RU"];`,
      `[YMKMapKit mapKit];`,
    ]
      .map((line) => `\t${line}`)
      .join("\n");

    // Add invocation
    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
    if (!appDelegate.contents.includes(mapKitMethodInvocations)) {
      appDelegate.contents = appDelegate.contents.replace(
        /\s+return YES;/g,
        `\n\n${mapKitMethodInvocations}\n\n\treturn YES;`
      );
    }

    return config;
  });
};

export default withYandexMaps(config);

react-native-yamap's People

Contributors

aamagda avatar artymir avatar ch3rn1k avatar dazzlingfame avatar densakhon avatar easyscripter avatar gkopylovdev avatar imsnow avatar justblender avatar kirgudkov avatar kt00s avatar lucky10 avatar muvka avatar ownikss avatar reeywhaar avatar schusovskoy avatar segrey-profi avatar vodetina avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-native-yamap's Issues

View вместо Image

Можно ли сделать вместо image передавать компонент реакт

Не отображается карта

RN 0.61.5
react-native-yamap: 1.0.20

В результате вижу серую сетку с логотипом яндекса

`
import React from 'react';
import { YANDEX_API_KEY } from 'react-native-dotenv';
import YaMap from 'react-native-yamap';

YaMap.init(YANDEX_API_KEY);

const Map = () => {
return <YaMap style={{ flex: 1, height: 200 }} />;
};

export default Map;
`

Окружность вокруг маркера с местоположением пользователя

Привет. Есть возможность изменять цвет у окружности, которая появляется вокруг маркера с местоположением пользователя, во время слабого соединения с интернетом? Или же вообще отключить появление этой окружности?

[Пожелание] Добавить события onMapPressIn и onMapPressOut

Добавить события onMapPressIn и onMapPressOut
При использовании onMapPressLong, карта реагирует на нажатие в одной точке с задержкой. То есть если пользователь нажал на карту, скроллит и не отпускает, то событие не срабатывает.

Yamap.init

image

помогите, в чем проблема?

Back to map screen

Когда возвращаешься на экран с картой, перестает работать клик на маркеры

Ошибка при инициализации карты

Использую react-native cli
Код взял из примера, ключ рабочий
`import React from 'react';
import YaMap from 'react-native-yamap';

YaMap.init('ххх');

class Map extends React.Component {

handleOnRouteFound(event: any) {
console.log(event.nativeEvent.routes);
}

render() {
return (
<YaMap
userLocationIcon={{
uri: 'https://www.clipartmax.com/png/middle/180-1801760_pin-png.png',
}}
style={{ flex: 1 }}
/>
);
}
}

export default Map;`

Uploading Снимок экрана 2021-08-13 в 15.05.51.png…

Adding theme for maps

Hi! I would like to know about adding theme for maps. Do you plan to add prop for this feature?

Крашится приложение при открытии страницы карт

Крашится приложение при открытии страницы карт. Помогает это: (где была добавлена проверка на null) npm install git://github.com/volga-volga/react-native-yamap.git#2c55ee41aea

Но это я так понимаю очень старая версия, где например нельзя убрать отображение текущего местоположения пользователя (пропс не работает)

Помогите пожалуйста

Scroll Map

Если YaMap помещен в ScrollView, то управлять картой невозможно, у react-native-maps такого нет

Use of undeclared identifier 'YMKMapKit'

Пытаюсь выполнить вот эту рекомендацию:

Рекомендуется инициализировать MapKit в функции didFinishLaunchingWithOptions в AppDelegate.m

#import <YandexMapKit/YMKMapKitFactory.h>
...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ...
    [YMKMapKit setApiKey: @"API_KEY"];
    return YES;
}

при этом не билдится релизная сборка с ошибкой: Use of undeclared identifier 'YMKMapKit', в дебаге все нормально.

В чем может быть причина?

Rebuild from Bitcode

Screenshot from 2021-04-24 08-12-02
When packing .ipa, if additional option "Rebuild from Bitecode" is checked then i get error: "ipatool failed with an exception: #<CmdSpec::NonZeroExitException". When unchecked everything is fine.

"react": "16.13.1",
"react-native": "0.63.2",
"react-native-yamap": "1.0.20"
Xcode version 11.2.1.

Is it problem with my settings or this library?

Не работает на ios

Под последние версии ios(симулятор, реальный девайс) не грузится карта вообще, белый холст(хотя другая интерактивность присутствует например выставление центра и зум), на android через раз грузиться.

Краш приложения при инициализации карты на планшете Samsung Galaxy Tab A

При добавлении инициализации с помощью YaMap.init() приложение падает без ошибки. Единственное что удалось найти в логах:

02-09 14:15:04.687 25376 31284 E ReactNativeJNI: logMarker RUN_JS_BUNDLE_END
02-09 14:15:04.701 25376 31284 I ReactNativeJS: Running "BazhenMP" with {"rootTag":1}
02-09 14:15:04.812  3987  8704 D ActivityTaskManager: setRequestedOrientation(1) from com.bazhenmp
02-09 14:15:04.837 25376 25376 F libc    : Fatal signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xf23aebf0 in tid 25376 (com.bazhenmp), pid 25376 (com.bazhenmp)
02-09 14:15:04.970 31325 31325 E crash_dump32: unknown process state: t
02-09 14:15:05.013 31325 31325 I crash_dump32: obtaining output fd from tombstoned, type: kDebuggerdTombstone
02-09 14:15:05.014  3692  3692 I /system/bin/tombstoned: received crash request for pid 25376
02-09 14:15:05.016 31325 31325 I crash_dump32: performing dump of process 25376 (target tid = 25376)
02-09 14:15:05.058 31325 31325 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
02-09 14:15:05.058 31325 31325 F DEBUG   : Build fingerprint: 'samsung/gta3xlwifiser/gta3xlwifi:10/QP1A.190711.020/T510XXU3BTK1:user/release-keys'
02-09 14:15:05.058 31325 31325 F DEBUG   : Revision: '4'
02-09 14:15:05.058 31325 31325 F DEBUG   : ABI: 'arm'
02-09 14:15:05.060 31325 31325 F DEBUG   : Timestamp: 2021-02-09 14:15:05+0300
02-09 14:15:05.060 31325 31325 F DEBUG   : pid: 25376, tid: 25376, name: com.bazhenmp  >>> com.bazhenmp <<<
02-09 14:15:05.060 31325 31325 F DEBUG   : uid: 10242
02-09 14:15:05.060 31325 31325 F DEBUG   : signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xf23aebf0 (*pc=0xd4d4defe)
02-09 14:15:05.060 31325 31325 F DEBUG   :     r0  00000008  r1  ffe46940  r2  ffe46998  r3  f23aebf1
02-09 14:15:05.060 31325 31325 F DEBUG   :     r4  ffe46998  r5  00000008  r6  ffe46940  r7  af3d3bfc
02-09 14:15:05.061 31325 31325 F DEBUG   :     r8  ffe46bdc  r9  00000000  r10 00000000  r11 f2f3b000
02-09 14:15:05.061 31325 31325 F DEBUG   :     ip  af8dd700  sp  ffe46940  lr  f23b1e48  pc  f23aebf0
02-09 14:15:05.067 31325 31325 F DEBUG   :
02-09 14:15:05.067 31325 31325 F DEBUG   : backtrace:
02-09 14:15:05.067 31325 31325 F DEBUG   :       #00 pc 000a9bf0  /apex/com.android.runtime/lib/bionic/libc.so (__aeabi_unwind_cpp_pr0) (BuildId: 011453e9eae384071507fdee556c1474)
02-09 14:15:05.067 31325 31325 F DEBUG   :       #01 pc 000ace44  /apex/com.android.runtime/lib/bionic/libc.so (__gnu_Unwind_Backtrace+160) (BuildId: 011453e9eae384071507fdee556c1474)
02-09 14:15:05.067 31325 31325 F DEBUG   :       #02 pc 000ad778  /apex/com.android.runtime/lib/bionic/libc.so (_Unwind_Backtrace+20) (BuildId: 011453e9eae384071507fdee556c1474)
02-09 14:15:05.067 31325 31325 F DEBUG   :       #03 pc 00000034  <unknown>

UPD: падает при MapKitFactory.initialize(reactContext)

Некорректно отрабатывает fitAllMarkers на IOS

При вызове метода fitAllMarkers на андроид точки к которым применяется фит имеют отступы от краев карты, в отличие от IOS, где точки отображаются на самых границах

Не отображается Marker

image
На скриншоте показано, что не все иконки отображаются.

Использую компонент Marker, children={} (Обычная картинка, добавил заливку для наглядности)

export const MarkerImage = () => {
  return (
    <Image
      style={{
        width: 25,
        height: 25,
        backgroundColor: 'blue',
      }}
      source={require('../../../assets/icons/marker.png')}
    />
  );
};

Как сделать корректный рендер? Есть ли другой способ задать иконку маркера?

Дополнительно:

markersToRender.map((point, key) => (
            <Marker
              key={key}
              point={{
                lon: point.Coordinates.Longitude,
                lat: point.Coordinates.Latitude,
              }}
              onPress={() => onMarkerPress(point)}>
              <MarkerImage />
            </Marker>
          ))
        )}

Как получить координаты экрана при клике на Marker?

Могу ли я получить x и y координаты экрана при клике по Marker. Или может есть возможность выводить дополнительное окно для отображения в нем информации по объекту рядом с маркером при клике по нему?

Активный маркер

Необходимо сделать чтобы активный маркер был поверх других иначе активный маркер перекрывается
image

UserLocation Image

При переходе на экран с картой, затем вернутся на предыдущий экран и снова на экран карты, появляется ошибка, при удалении userLocationIcon={userLocation}, все норм.

Снимок экрана 2019-12-17 в 15 36 00

Метод setZoom()

Привет! Очень не хватает метода setZoom(). Например, пользователь пролистал карту до определенной точки и хочет с помощью кнопки приблизить || отдалить ее

Не видит ключ карты на Android

При запуске падает с ошибкой:
Версия последняя beta

‼️  Uncaught Exception: You need to set the API key before using MapKit!
{"activityRecognitionInterval":10000,"allowIdenticalLocations":false,"authorization":{},"autoSync":true,"autoSyncThreshold":0,"backgroundPermissionRationale":{"title":"Allow {applicationName} to access this device's location even when closed or not in use?","message":"[CHANGEME] This app collects location data for FEATURE X and FEATURE Y.","positiveAction":"Change to \"{backgroundPermissionOptionLabel}\"","negativeAction":""},"batchSync":false,"configUrl":"","debug":false,"deferTime":0,"desiredAccuracy":0,"desiredOdometerAccuracy":100,"disableAutoSyncOnCellular":false,"disableElasticity":false,"disableLocationAuthorizationAlert":false,"disableMotionActivityUpdates":false,"disableStopDetection":false,"distanceFilter":10,"elasticityMultiplier":1,"enableHeadless":false,"enableTimestampMeta":false,"extras":{},"fastestLocationUpdateInterval":-1,"foregroundService":true,"geofenceInitialTriggerEntry":true,"geofenceModeHighAccuracy":false,"geofenceProximityRadius":1000,"geofenceTemplate":"","headers":{},"headlessJobService":"com.transistorsoft.rnbackgroundgeolocation.HeadlessTask","heartbeatInterval":-1,"httpRootProperty":"location","httpTimeout":60000,"isMoving":false,"locationAuthorizationRequest":"Always","locationTemplate":"","locationTimeout":60,"locationUpdateInterval":1000,"locationsOrderDirection":"ASC","logLevel":0,"logMaxDays":3,"maxBatchSize":-1,"maxDaysToPersist":1,"maxRecordsToPersist":-1,"method":"POST","minimumActivityRecognitionConfidence":75,"motionTriggerDelay":0,"notification":{"layout":"","title":"","text":"Location Service activated","color":"","channelName":"TSLocationManager","smallIcon":"","largeIcon":"","priority":0,"sticky":false,"strings":{},"actions":[]},"params":{},"persist":true,"persistMode":2,"schedule":[],"scheduleUseAlarmManager":false,"speedJumpFilter":300,"startOnBoot":false,"stationaryRadius":25,"stopAfterElapsedMinutes":0,"stopOnStationary":false,"stopOnTerminate":true,"stopTimeout":5,"triggerActivities":"in_vehicle, on_bicycle, on_foot, running, walking","url":"","useSignificantChangesOnly":false,"enabled":false,"schedulerEnabled":false,"trackingMode":1,"odometer":0,"isFirstBoot":false,"didLaunchInBackground":false,"didDeviceReboot":false}
java.lang.AssertionError: You need to set the API key before using MapKit!
	at com.yandex.mapkit.MapKitFactory.checkApiKey(MapKitFactory.java:67)
	at com.yandex.mapkit.MapKitFactory.initialize(MapKitFactory.java:24)
	at com.yandex.mapkit.mapview.MapView.<init>(MapView.java:53)
	at com.yandex.mapkit.mapview.MapView.<init>(MapView.java:41)
	at ru.vvdev.yamap.view.YamapView.<init>(YamapView.java:80)
	at ru.vvdev.yamap.YamapViewManager.createViewInstance(YamapViewManager.java:118)
	at ru.vvdev.yamap.YamapViewManager.createViewInstance(YamapViewManager.java:26)
	at com.facebook.react.uimanager.ViewManager.createViewInstance(ViewManager.java:139)
	at com.facebook.react.uimanager.ViewManager.createView(ViewManager.java:83)
	at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(NativeViewHierarchyManager.java:281)
	at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(UIViewOperationQueue.java:188)
	at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.dispatchPendingNonBatchedOperations(UIViewOperationQueue.java:1103)
	at com.facebook.react.uimanager.UIViewOperationQueue$DispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:1074)
	at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:29)
	at com.facebook.react.modules.core.ReactChoreographer$ReactChoreographerDispatcher.doFrame(ReactChoreographer.java:175)
	at com.facebook.react.modules.core.ChoreographerCompat$FrameCallback$1.doFrame(ChoreographerCompat.java:85)

При использовании геокодера запрос возвращает ошибку

При использовании Geocoder.geoToAddress() запрос возвращает null

Код:

const Map = () => {
    YaMap.init(YAMAP_API);
    Geocoder.init(GEO_API);
    YaMap.setLocale('ru_RU');
    const [activePoint, setPoint] = useState({"lat": 0, "lon": 0});
    const [activeZoom, setZoom] = useState(10)
    
    const _onMapPress = (point: any) => {  
      console.log(point.nativeEvent)
      console.log(Geocoder.geoToAddress(p.nativeEvent))
      setPoint(point.nativeEvent)
    }

    return (
      <YaMap
        onMapPress={(point) => {_onMapPress(point)}}
        style={{ flex: 1, }}
      >
        <Marker point={activePoint}/>
      </YaMap>
    )
}

Лог:

 LOG  {"lat": 51.82748814030343, "lon": 101.08263667140687}
 LOG  {"_40": 0, "_55": null, "_65": 0, "_72": null}
 LOG  {"lat": 51.965713775394576, "lon": 101.18359310286388}
 LOG  {"_40": 0, "_55": null, "_65": 0, "_72": null}

Полученный API-ключ:

изображение

Marker не работает

при добавлении Маркера на карту вылезает ошибка
photo_2021-07-09 14 24 17

`
import YaMap, { Marker } from 'react-native-yamap';
YaMap.init(Config.YAMAP_KEY);

                 <YaMap
                    ref={(map) => {
                        this.map = map;
                    }}
                    style={{ height: this.state.height }}
                >
                    <Marker point={{lat: 55.606783, lon: 37.589589}} />
                </YaMap>

`

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.