0

Flutter我使用 google_maps_flutter,google_directions_apiflutter_polyline_points包中有一个具有以下功能的地图;

在当前位置目的地点之间绘制路线,获取它们之间的距离和持续时间,必须通知司机left/right在开车到目的地时采取。

我已经完成了所有这些,但是当当前位置在地图上不断更新时,我正在调用direction api它返回大量数据,legs并且steps这个api调用几乎每秒一次,谷歌会向我收取很多费用。

是否有人面临同样的问题,我非常感谢您的帮助。

到目前为止,我已经完成了部分代码

  void _getCurrentLocation(context) {
    showGeneralDialog(
        context: context,
        barrierDismissible: false,
        barrierColor: Colors.black45,
        pageBuilder: (BuildContext buildContext, Animation animation,
            Animation secondaryAnimation) {
          return Center(
            child: Container(
              width: MediaQuery.of(context).size.width - 10,
              height: MediaQuery.of(context).size.height - 80,
              padding: EdgeInsets.all(20),
              color: Tingsapp.transparent,
              child: CurrentLocation(),
            ),
          );
        }).then((location) {
      if (location != null) {
        _addMoverMarker(location, 'mover');
        //updateFirebase(location);
        _animateCameraToCurrentLocation(location);
      }
    });
  }

目的地点已经设置好了。在上面的代码中,我获取用户当前位置并添加如下标记

  void _addMoverMarker(newLocationData, String id) async {
    Uint8List imageData = await getMarker();
    //LatLng latlng = LatLng(newLocationData.latitude, newLocationData.longitude);
    LatLng latlng = LatLng(_moverLatitude!, _moverLongitude!);
    MarkerId markerId = MarkerId(id);
    Marker marker = Marker(
      markerId: markerId,
      position: latlng,
      zIndex: 2,
      icon: BitmapDescriptor.fromBytes(imageData),
      infoWindow: InfoWindow(
        title: "Mover location",
      ),
    );
    markers[markerId] = marker;
    circle = Circle(
      circleId: CircleId("circle"),
      radius: 20,
      zIndex: 1,
      center: latlng,
      strokeColor: Colors.orange.withAlpha(60),
      fillColor: Colors.orange.withAlpha(300),
    );
    _getMoverPolyline(newLocationData);
  }

在这里我为相机设置动画

  _animateCameraToCurrentLocation(newLocationData) {
    if (_locationSubscription != null) {
      _locationSubscription!.cancel();
    }
    _locationSubscription =
        _locationTracker.onLocationChanged.listen((newLocationData) {
      if (_mapController != null) {
        _addMoverMarker(newLocationData, 'mover');
        _animateCamera(_moverLatitude, _moverLongitude, 16.0);
        //updateFirebase(newLocationData);
      }
    });
  }

当我绘制折线时,我directions api 在这里调用我的问题开始了

_getMoverPolyline(LocationData locationData) async {
    PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
      mapKey,
      PointLatLng(_originLatitude!, _originLongitude!),
      PointLatLng(_moverLatitude!, _moverLongitude!),
      //PointLatLng(locationData.latitude!, locationData.longitude!),
      travelMode: TravelMode.driving,
    );

    if (result.points.isNotEmpty) {
      moverPolylineCoordinates = [];
      result.points.forEach((PointLatLng point) {
        moverPolylineCoordinates.add(LatLng(point.latitude, point.longitude));
      });
    }
    _addMoverPolyLine();
    _getDirections(_moverLatitude, _moverLongitude, _originLatitude,
        _originLongitude).then((data){
         _updateData(data);
    });
  }


  _getDirections(_moverLatitude, _moverLongitude, _originLatitude, _originLongitude) async {
    Api api = Api();
    var res = await api.getDirections(
        _moverLatitude, _moverLongitude, _originLatitude, _originLongitude);
    var jsonData = jsonDecode(res.body);
    print(jsonData['routes'][0]['legs'][0]);
    return jsonData['routes'][0]['legs'][0];
  }

在上面的代码中,_getDirections方法每秒调用一次。

directions api不能一次打电话吗?

_updateData方法更新数据,如燕鸥right/leftHead south我的地图

4

0 回答 0