如何根据 Flutter 中的地图大小和距离(以米为单位)计算 Google 地图的缩放级别?

问题描述 投票:0回答:1

我在圆圈中有一个

Google Map
小部件。用户位置始终位于中心。在地图上有一个标记,用户应该在地图边缘看到该标记,但完全可见。

这些是我的变量:

LatLng userPosition = LatLng(37.799165198213664, -122.44392812532321);
LatLng markerPosition = LatLng(37.80201081904288, -122.41954944718842);
double defaultZoomLevel = 17.0;
double distanceToMarkerInMeters = 2165.0;
double mapWidth = 400.0; 

我的问题是

计算查看地图边缘标记所需的

zoomLevel
的函数是什么样的?

flutter dart google-maps google-maps-markers distance
1个回答
0
投票

我能够生成一个适合我的情况的函数。但是我不能向您保证它的工作原理完全相同,因为我必须使用

zoomConstant
zoomExponent
变量。

这是代码,希望对某人有帮助:

  void _onMapCreated(GoogleMapController controller) {
    setState(() {
      _controller = controller;

      getDistanceToMarker(target: markerPosition);

      double newZoomLevel = _calculateZoomLevel(distanceToMarker);

      _controller
          .moveCamera(CameraUpdate.newLatLngZoom(userPosition, newZoomLevel));
    });
  }

  void getDistanceToMarker({required LatLng target}) async {
    LatLng latLng = LatLng(target.latitude, target.longitude);
    double targetLat = latLng.latitude;
    double targetLng = latLng.longitude;
    double userLat = userPosition.latitude;
    double userLng = userPosition.longitude;

    var p = 0.017453292519943295;
    var a = 0.5 -
        cos((targetLat - userLat) * p) / 2 +
        cos(userLat * p) *
            cos(targetLat * p) *
            (1 - cos((targetLng - userLng) * p)) /
            2;

    setState(() {
      distanceToMarker = ((12742 * asin(sqrt(a))) * 1000);
    });
  }

  double _calculateZoomLevel(double distance) {
    const double zoomConstant = 125.0; //ChatGPT made it 1000.0
    const double zoomExponent = 1.0; //ChatGPT made it 2.0

    double newZoomLevel =
        zoomLevel - (log(distance / zoomConstant) / log(2.0)) * zoomExponent;

    return newZoomLevel;
  }
© www.soinside.com 2019 - 2024. All rights reserved.