【问题标题】:How to draw polyline in google maps flutter between user location and a marker?如何在谷歌地图中绘制折线在用户位置和标记之间颤动?
【发布时间】:2022-01-10 22:48:36
【问题描述】:

这是我在这个网站上的第一篇文章,所以我希望能得到我需要的帮助。

我是 Flutter 的新手,我正在尝试使用 flutter_polyline_points 插件在用户位置和用户指定的标记之间绘制折线或路线。我在网上搜索并查看了许多教程,但我一直收到错误,或者它不适用于我的代码。

那么有人可以帮我实现这个目标吗?

提前致谢!

这些是我的代码:

const LatLng dest_location = LatLng(26.0667, 50.5577);

class _NavPageScreenState extends State<NavPage> {
  Completer<GoogleMapController> _controllerGoogleMap = Completer();
  late GoogleMapController newGoogleMapController;
  late Position currentPosition;
  var geoLocator = Geolocator();
  Map<MarkerId, Marker> markers = {};
  Map<PolylineId, Polyline> polylines = {};
  List<LatLng> polylineCoordinates = [];
  PolylinePoints polylinePoints = PolylinePoints();

  void locatePosition() async {
    Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    currentPosition = position;
    LatLng latlatposition = LatLng(position.latitude, position.longitude);
    CameraPosition cameraPosition =
        new CameraPosition(target: latlatposition, zoom: 16);
    newGoogleMapController
        .animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
  }

  static final CameraPosition _UserLocation = CameraPosition(
    target: LatLng(26.0667, 50.5577),
    zoom: 16,
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Maps'),
        backgroundColor: Colors.redAccent,
        leading: new IconButton(
            icon: new Icon(Icons.arrow_back),
            onPressed: () {
              Navigator.push(
                  context, MaterialPageRoute(builder: (context) => HomePage()));
            }),
      ),
      body: GoogleMap(
        mapType: MapType.normal,
        myLocationButtonEnabled: true,
        initialCameraPosition: _UserLocation,
        polylines: Set<Polyline>.of(polylines.values),
        markers: Set<Marker>.of(markers.values),
        myLocationEnabled: true,
        zoomGesturesEnabled: true,
        zoomControlsEnabled: true,
        onMapCreated: (GoogleMapController controller) {
          _controllerGoogleMap.complete(controller);
          newGoogleMapController = controller;
          _getPolyline();
          locatePosition();
          setState(() {});
        },
      ),
    );
  }

  _addMarker(LatLng position, String id, BitmapDescriptor descriptor) {
    MarkerId markerId = MarkerId(id);
    Marker marker =
        Marker(markerId: markerId, icon: descriptor, position: position);
    markers[markerId] = marker;
  }

  _addPolyLine(List<LatLng> polylineCoordinates) {
    PolylineId id = PolylineId("poly");
    Polyline polyline = Polyline(
      polylineId: id,
      points: polylineCoordinates,
      width: 8,
    );
    polylines[id] = polyline;
    setState(() {});
  }

  void _getPolyline() async {
    /// add origin marker origin marker
    _addMarker(
      LatLng(currentPosition.latitude, currentPosition.longitude),
      "origin",
      BitmapDescriptor.defaultMarker,
    );

    // Add destination marker
    _addMarker(
      LatLng(dest_location.latitude, dest_location.longitude),
      "destination",
      BitmapDescriptor.defaultMarkerWithHue(90),
    );

    List<LatLng> polylineCoordinates = [];

    PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
      "API_KEY",
      PointLatLng(currentPosition.latitude, currentPosition.longitude),
      PointLatLng(dest_location.latitude, dest_location.longitude),
      travelMode: TravelMode.walking,
    );
    if (result.points.isNotEmpty) {
      result.points.forEach((PointLatLng point) {
        polylineCoordinates.add(LatLng(point.latitude, point.longitude));
      });
    } else {
      print(result.errorMessage);
    }
    _addPolyLine(polylineCoordinates);
  }
}

【问题讨论】:

  • 你能把你收到的错误信息贴在这里吗?
  • @NelsonJr。您好尼尔森,感谢您的回复!我尝试了许多不同的方法,但我得到了不同的错误,所以为了让事情变得更容易,我用你的一种方法来编辑我的代码来绘制折线,因为我看到了你对类似问题的回答,我的没有错误使用您的方法编写代码,但我无法添加标记或绘制折线。我只看到地图。我试图做的是让用户通过在地图上放置一个标记来选择任何目的地,然后导航到它,其中一条折线将被绘制到指定的位置/标记(目的地和原点不固定)
  • 感谢您更新代码 @Aziz!让我检查一下

标签: flutter google-maps routes polyline direction


【解决方案1】:

当我运行您的代码时,我在 _addMarker 方法上收到以下错误

NoSuchMethodError (NoSuchMethodError: The getter 'latitude' was called on null.
Receiver: null

那是因为currentPosition 没有被分配正确的position,它来自Geolocator.getCurrentPosition 方法的结果

这就是折线没有出现的原因。

我修复了代码并且能够显示折线。请看下面的代码和截图

const LatLng dest_location = LatLng(37.42796133580664, -122.085749655962);

class _NavPageScreenState extends State<NavPage> {
  Completer<GoogleMapController> _controllerGoogleMap = Completer();
  GoogleMapController newGoogleMapController;
  Position currentPosition;
  var geoLocator = Geolocator();
  Map<MarkerId, Marker> markers = {};
  Map<PolylineId, Polyline> polylines = {};
  List<LatLng> polylineCoordinates = [];
  PolylinePoints polylinePoints = PolylinePoints();

      
  void locatePosition() async {
    Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    currentPosition = position;
  }

  static final CameraPosition _UserLocation = CameraPosition(
    target: LatLng(37.42796133580664, -122.085749655962),
    //target: LatLng(26.0667, 50.5577),
    zoom: 16,
  );
  @override
  void initState() {
    super.initState();
    locatePosition();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Maps'),
        backgroundColor: Colors.redAccent,
        leading: new IconButton(
            icon: new Icon(Icons.arrow_back),
            onPressed: () {
               Navigator.push(
                 context, MaterialPageRoute(builder: (context) => HomePage()));
            }),
      ),
      body: GoogleMap(
        mapType: MapType.normal,
        myLocationButtonEnabled: true,
        initialCameraPosition: _UserLocation,
        polylines: Set<Polyline>.of(polylines.values),
        markers: Set<Marker>.of(markers.values),
        myLocationEnabled: true,
        zoomGesturesEnabled: true,
        zoomControlsEnabled: true,
        onMapCreated: (GoogleMapController controller) {
          _controllerGoogleMap.complete(controller);
          newGoogleMapController = controller;
          _getPolyline();

          setState(() {});
        },
      ),
    );
  }

  _addMarker(LatLng position, String id, BitmapDescriptor descriptor) {
    MarkerId markerId = MarkerId(id);
    Marker marker =
        Marker(markerId: markerId, icon: descriptor, position: position);
    markers[markerId] = marker;
  }

  _addPolyLine(List<LatLng> polylineCoordinates) {
    PolylineId id = PolylineId("poly");
    Polyline polyline = Polyline(
      polylineId: id,
      points: polylineCoordinates,
      width: 8,
    );
    polylines[id] = polyline;
    setState(() {});
  }

  void _getPolyline() async {
    /// add origin marker origin marker
    _addMarker(
      LatLng(currentPosition.latitude, currentPosition.longitude),
      "origin",
      BitmapDescriptor.defaultMarker,
    );

    // Add destination marker
    _addMarker(
      LatLng(dest_location.latitude, dest_location.longitude),
      "destination",
      BitmapDescriptor.defaultMarkerWithHue(90),
    );

    List<LatLng> polylineCoordinates = [];

    PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
      "Your_key",
      PointLatLng(currentPosition.latitude, currentPosition.longitude),
      PointLatLng(dest_location.latitude, dest_location.longitude),
      travelMode: TravelMode.walking,
    );
    if (result.points.isNotEmpty) {
      result.points.forEach((PointLatLng point) {
        polylineCoordinates.add(LatLng(point.latitude, point.longitude));
      });
    } else {
      print(result.errorMessage);
    }
    _addPolyLine(polylineCoordinates);
  }
}

【讨论】:

  • 非常感谢@NelsonJr。它现在正在工作并且折线正在显示,但目的地是固定的,是否可以修改代码以使目的地标记在点击时出现变化?因此,例如,用户可以通过点击(作为目的地)来选择地图上的任何地方,然后会显示一个标记(目的地标记),并且一条折线将被绘制到该目的地?
猜你喜欢
  • 2022-11-02
  • 2019-10-03
  • 2021-09-23
  • 2017-05-13
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多