Javascript 在使用map.fitBounds之前,如何确定LatLngBounds的缩放级别?

Javascript 在使用map.fitBounds之前,如何确定LatLngBounds的缩放级别?,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,在调用Map.fitBounds()之前,我试图找出一种确定贴图缩放级别的方法,但似乎找不到方法 在APIv2中有一个方法,但我在APIv3文档中找不到等效的方法 是否有一种非谷歌算法可以事先确定缩放级别?尼克是对的,本讨论概述了一种可行的方法: 然而,它是用Javascript编写的。对于需要使用Android GMaps v3执行此操作的用户,以下是一个翻译: private static final double LN2 = 0.6931471805599453; private sta

在调用Map.fitBounds()之前,我试图找出一种确定贴图缩放级别的方法,但似乎找不到方法

在APIv2中有一个方法,但我在APIv3文档中找不到等效的方法


是否有一种非谷歌算法可以事先确定缩放级别?

尼克是对的,本讨论概述了一种可行的方法:

然而,它是用Javascript编写的。对于需要使用Android GMaps v3执行此操作的用户,以下是一个翻译:

private static final double LN2 = 0.6931471805599453;
private static final int WORLD_PX_HEIGHT = 256;
private static final int WORLD_PX_WIDTH = 256;
private static final int ZOOM_MAX = 21;

public int getBoundsZoomLevel(LatLngBounds bounds, int mapWidthPx, int mapHeightPx){

    LatLng ne = bounds.northeast;
    LatLng sw = bounds.southwest;

    double latFraction = (latRad(ne.latitude) - latRad(sw.latitude)) / Math.PI;

    double lngDiff = ne.longitude - sw.longitude;
    double lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360;

    double latZoom = zoom(mapHeightPx, WORLD_PX_HEIGHT, latFraction);
    double lngZoom = zoom(mapWidthPx, WORLD_PX_WIDTH, lngFraction);

    int result = Math.min((int)latZoom, (int)lngZoom);
    return Math.min(result, ZOOM_MAX);
}

private double latRad(double lat) {
    double sin = Math.sin(lat * Math.PI / 180);
    double radX2 = Math.log((1 + sin) / (1 - sin)) / 2;
    return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2;
}
private double zoom(int mapPx, int worldPx, double fraction) {
    return Math.floor(Math.log(mapPx / worldPx / fraction) / LN2);
}
private static final double LN2=0.6931471805599453;
专用静态最终int WORLD_PX_高度=256;
私有静态最终int WORLD_PX_WITH=256;
私有静态最终整数缩放_MAX=21;
public int getBoundsZoomLevel(LatLngBounds边界、int mapWidthPx、int mapHeightPx){
LatLng ne=边界。东北方向;
LatLng西南=边界西南;
双纬度=(纬度(东北纬度)-纬度(西南纬度))/Math.PI;
双lngDiff=东北经度-西南经度;
双lngFraction=((lngDiff<0)?(lngDiff+360):lngDiff)/360;
双latZoom=缩放(地图高度PX,世界高度PX,latFraction);
双lngZoom=缩放(地图宽度PX,世界宽度PX,lngFraction);
int result=Math.min((int)latZoom,(int)lngZoom);
返回Math.min(结果,缩放最大值);
}
私人双车床(双车床){
双正弦=数学正弦(lat*Math.PI/180);
double radX2=Math.log((1+sin)/(1-sin))/2;
返回Math.max(Math.min(radX2,Math.PI),-Math.PI)/2;
}
专用双缩放(int mapPx、int worldPx、双分数){
返回数学楼层(数学日志(mapPx/worldPx/fraction)/LN2);
}

标准库中没有等效的库。你想达到什么目标?您不再需要将缩放级别传递到
setCenter
setCenter
的v3版本只需要一个参数,一个
google.maps.LatLng
.google API doc()表示“整个世界大约有256dp宽”——注意:“dp”,而不是“px”。因此,上述出色的计算应转换为“dp”(例如,通过显示度量,“缩放密度”)。我使用了:双latZoom=zoom(mapHeightPx,WORLD_DP_HEIGHT*mDisplayMetrics.scaledDensity,latFraction);双lngZoom=缩放(mapWidthPx,WORLD_DP_WIDTH*mDisplayMetrics.scaledDensity,lngFraction);除了
WORLD\u PX\u HEIGHT*density
这件事之外,我还需要删除
zoom
函数上的
Math.floor
,让它返回
float
,并将
int result
设置为
float result
,否则直接用delta使用边界时,我会有更大的填充。当然,所有受影响的调用都必须更改,不要忘记
getBoundsZoomLevel
也必须返回
float