【问题标题】:How to get longitude and latitude from flutter_map after tapping somewhere in the map?在地图中点击某处后如何从flutter_map获取经度和纬度?
【发布时间】:2022-01-05 11:11:46
【问题描述】:

在地图内选择一个地点后,我需要返回经度和纬度,所以我点击地图中的某个位置,它会返回经纬度信息,我可以启动地图,添加地点,但我只是无法选择地点并使用该信息进行回调,我找到了 googlemaps 的解决方案,但不是 flutter_map,非常感谢!!

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';

import 'package:latlong2/latlong.dart' as latlng;
import 'package:flutter_map_tappable_polyline/flutter_map_tappable_polyline.dart';

class MapScreen extends StatefulWidget {
  @override
  _MapScreenState createState() => _MapScreenState();
}

class _MapScreenState extends State<MapScreen> {
    @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Your Map'),
      ),
      body: FlutterMap(
        options: new MapOptions(
          center: latlng.LatLng(-23.5732052, -46.6331934),
          zoom: 18.0,
          plugins: [
            TappablePolylineMapPlugin(),
          ],
        ),
        layers: [
          TileLayerOptions(
            urlTemplate: "https://api.mapbox.com/styles/v1/dxxx/ckwii7q6bxxrauou3d/tiles/256/{z}/{x}/{y}@2x?access_token=pk.eyJ1IjoiZGVtaWFuMjAyMSIsImEiOiJjxxxxxxxxxxxxxxxxxxxaWs1In0.2x2m7ka-KZwzBR5XXgYkXQ",
            subdomains: ['a', 'b', 'c'],
            additionalOptions: {
              'accessToken':'pk.eyJ1IjoiZGVxxxxxxxxxxxxxxxxxxxxxxxxxxcHgxNXZoMnB1dGVvOWViaWs1In0.2x2m7ka-KZwzBR5XXgYkXQ',
              'id': 'mapbox.mapbox-streets-v8',
            },
            attributionBuilder: (_) {
              return Text("© OpenStreetMap contributors");
            },
          ),
          TappablePolylineLayerOptions(
            // Will only render visible polylines, increasing performance
              polylineCulling: true,
              polylines: [
                TaggedPolyline(
                  points: [latlng.LatLng(-22.5732052, -47.6331934), latlng.LatLng(-22.5732052, -47.6331934)],

                  tag: "My Polyline", // An optional tag to distinguish polylines in callback
                  // ...all other Polyline options
                ),
              ],
              onTap: (polylines, tapPosition) => print('Tapped: ' +
                  polylines.map((polyline) => polyline.tag).join(',') +
                  ' at ' +
                  tapPosition.globalPosition.toString()),

              onMiss: (tapPosition) {
                print('No polyline was tapped at position ' +
                    tapPosition.globalPosition.toString());
              }
          ),
          MarkerLayerOptions(
            markers: [
              Marker(
                width: 40.0,
                height: 40.0,
                point:  latlng.LatLng(-23.5732052, -46.6331934),
                builder: (ctx) =>
                    Container(
                      child: FlutterLogo(),
                    ),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

【问题讨论】:

    标签: android flutter flutter-dependencies


    【解决方案1】:

    我正在使用package:google_maps_flutter 包,但如果您不想使用该包,程序应该仍然相同。只需将 ontap() 添加到地图小部件。

    child: GoogleMap(
            onTap: (latLng) {
              print('${latLng.latitude}, ${latLng.longitude}');
            },
    

    你的包好像是这样的:

    options: MapOptions(
                        center: LatLng(45.5231, -122.6765),
                        zoom: 13.0,
                        onTap: _handleTap),
    

    【讨论】:

    • 好朋友,成功了
    • 如果它对你有用,请接受答案:)
    【解决方案2】:

    感谢您的帮助,它奏效了,有一件事我不明白,但无论如何都奏效了,就是第一个参数说:

    无效函数(TapPosition,LatLng)?点按,

    但是如果我尝试在上面的函数中将该类型设置为传入输入,将无法正常工作,不知道为什么,所以我不得不使用动态!?

        void _retPositionMap(dynamic positio, latlng.LatLng direct) {
        
          print(positio.runtimeType);
          // print(direct.latitude);
          // print(direct.longitude);
        }
    
    class _MapScreenState extends State<MapScreen> {
      @override
      Widget build(BuildContext context) {
        return FlutterMap(
          options: MapOptions(
            center: latlng.LatLng(-23.569953, -46.635863),
            zoom: 14.0,
            //onTap: _handleTap,
              onTap: _retPositionMap,
    
          ),
          layers: [
            TileLayerOptions(
              urlTemplate: "https://api.mapbox.com/styles/v1/dxx2021/ckwii7q6b284d14s0jrauou3d/tiles/256/{z}/{x}/{y}@2x?access_token=pk.exxjoiZGVtaWFuMjAyxxxxx2cHgxNXZoMnB1dGVvOWViaWs1In0.2x2m7ka-KZwzBR5XXgYkXQ",
             // subdomains: ['a', 'b', 'c'],
              additionalOptions: {
                'accessToken':'pk.eyJ1IjoiZGVtxxxxxxxxiOiJja3dpOGc2cHgxNXZoMnB1dGVvOWViaWs1In0.2x2m7ka-KZwzBR5XXgYkXQ',
                'id': 'mapbox.mapbox-streets-v8',
              },
              // attributionBuilder: (_) {
              //   return Text("© OpenStreetMap contributors");
              // },
            ),
            MarkerLayerOptions(
              markers: [
                Marker(
                  width: 80.0,
                  height: 80.0,
                  point: latlng.LatLng(-23.569953, -46.635863),
                  builder: (ctx) =>
                      Container(
                        child: FlutterLogo(),
                      ),
                ),
              ],
            ),
          ],
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多