我在圆圈中有一个
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
的函数是什么样的?
我能够生成一个适合我的情况的函数。但是我不能向您保证它的工作原理完全相同,因为我必须使用
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;
}