Как в YandexMap получить координаты ручного выбора локации и добавить там маркер?

Рейтинг: 0Ответов: 2Опубликовано: 18.06.2023

Столкнулся с необходимостью ручного выбора локации на карте и передачи этих координат в другой виджет. Также при касании экрана требуется маркер. Сейчас вывожу карту с некоторой локацией, и теперь два вопроса: как получить координаты новой локации при касании и как в этом месте показать маркер?

class _MapScreenState extends State<MapScreen> {
  YandexMapController? _yaMapController;
  static const Point _startPoint = Point(latitude: 50, longitude: 50);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Ваша карта'),
      ),
      body: YandexMap(
        onMapCreated: (YandexMapController controller) async {
          _yaMapController = controller;
          await _yaMapController!.moveCamera(
            CameraUpdate.newCameraPosition(
              CameraPosition(
                target: _startPoint,
                zoom: 10,
              ),
            ),
            animation: const MapAnimation(
              type: MapAnimationType.smooth,
              duration: 2.0,
            ),
          );
        },
        onMapTap: (selectedPoint) {
        // ?????
        },
      ),
    );
  }
}

Ответы

▲ 1

Более вкрадчивое изучение примеров Yandex MapKit на GitHub позволило скомпоновать вот такой рабочий вариант.

class _MapScreenState extends State<MapScreen> {
  late YandexMapController controller;
  final List<MapObject> mapObjects = [];
  final MapObjectId mapObjectId = const MapObjectId('selPoint');
  final animation = MapAnimation(type: MapAnimationType.smooth, duration: 2.0);
  static const Point _startPoint = Point(latitude: 50, longitude: 50);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Ваша карта'),
      ),
      body: YandexMap(
        mapObjects: mapObjects,
        onMapCreated: (YandexMapController yandexMapController) async {
          controller = yandexMapController;
          await controller.moveCamera(
            CameraUpdate.newCameraPosition(
              CameraPosition(
                target: _startPoint,
                zoom: 10,
              ),
            ),
            animation: animation,
          );
        },
        onMapTap: (Point selectedPoint) async {
          print('Tapped map at $selectedPoint'); // для проверки
          final placemark = PlacemarkMapObject(
            mapId: mapObjectId,
            point: (await controller.getCameraPosition()).target,
            opacity: 0.8,
            icon: PlacemarkIcon.single(
              PlacemarkIconStyle(
                image: BitmapDescriptor.fromAssetImage(
                  'lib/assets/location_icon.png',
                ),
                scale: 0.25,
              ),
            ),
          );

          setState(() {
            mapObjects.removeWhere((el) => el.mapId == MapObjectId);
            mapObjects.add(placemark);
          });
        },
      ),
    );
  }
}

▲ 0

Отлавливать нажатие должен InputListener, добавить метку на полученные координаты – PlacemarkMapObject.

Если с реализацией возникают какие-то сложности, приводите пример кода и опишите, что не так.