Android 如何根据返回的标记计算缩放级别?

Android 如何根据返回的标记计算缩放级别?,android,Android,我想知道是否已经有一种方法可以从一组给定的标记中知道我应该应用于地图的缩放,还是我必须自己做?(这取决于分辨率,因此我希望在MapView中找到它,因为它知道它的边界。)我尝试自己使用一种方法,虽然效果不理想,但似乎已经足够(也许我应该将商四舍五入以获得实际值): private void adjustZoomToMarkers(ArrayList标志){ GeoPoint mapCenter=mapView.getMapCenter(); int-lat=mapCenter.getLatitu

我想知道是否已经有一种方法可以从一组给定的标记中知道我应该应用于地图的缩放,还是我必须自己做?(这取决于分辨率,因此我希望在MapView中找到它,因为它知道它的边界。)

我尝试自己使用一种方法,虽然效果不理想,但似乎已经足够(也许我应该将商四舍五入以获得实际值):

private void adjustZoomToMarkers(ArrayList标志){
GeoPoint mapCenter=mapView.getMapCenter();
int-lat=mapCenter.getLatitudeE6(),lng=mapCenter.getLongitudeE6();
int farestLat=0,farestLng=0;
用于(GeoLocationFlag GeoLocationFlag:flags){
Log.d(Log_标签,“lat:+geoLocationFlag.getLat());
int flagLatDistance=Math.abs(geoLocationFlag.getLat()-lat);
if(farestLat1 | | lngQuotient>1){
//必须缩小
float qutient=Math.max((int)latQuotient,(int)lngQuotient);
而((数量/2)>1){
数量=数量/2;
缩放--;
}
}否则{
float qutient=Math.max((int)(1/(float)latQuotient),(int)(1/(float)lngQuotient));
而((数量/2)>1){
数量=数量/2;
zoom++;
}
}
Log.d(日志标签,“找到缩放”+缩放);
int zoomLevel=mapView.getZoomLevel();
mapController.setZoom(zoomLevel+zoom);
}
致以最良好的祝愿,
Zied Hamdi

正如我在上面写答案时猜测的那样:当商为例如9时,这意味着您需要4次以上的迭代才能看到它:
int minLat = Integer.MAX_VALUE;
int minLong = Integer.MAX_VALUE;
int maxLat = Integer.MIN_VALUE;
int maxLong = Integer.MIN_VALUE;

for( GeoPoint l : points ) {
    minLat  = Math.min( l.getLatitudeE6(), minLat );
    minLong = Math.min( l.getLongitudeE6(), minLong);
    maxLat  = Math.max( l.getLatitudeE6(), maxLat );
    maxLong = Math.max( l.getLongitudeE6(), maxLong );
}

mapView.getController().zoomToSpan(Math.abs( minLat - maxLat ), Math.abs( minLong - maxLong ));
因此,只需将两条线对应起来:

while ((qutient / 2) > 0.5) {
致以最良好的祝愿,
Zied Hamdi

我喜欢你的代码短得多;-),也许我应该避免在for循环中创建新实例,以获得最小和最大点

int minLat = Integer.MAX_VALUE;
int minLong = Integer.MAX_VALUE;
int maxLat = Integer.MIN_VALUE;
int maxLong = Integer.MIN_VALUE;

for( GeoPoint l : points ) {
    minLat  = Math.min( l.getLatitudeE6(), minLat );
    minLong = Math.min( l.getLongitudeE6(), minLong);
    maxLat  = Math.max( l.getLatitudeE6(), maxLat );
    maxLong = Math.max( l.getLongitudeE6(), maxLong );
}

mapView.getController().zoomToSpan(Math.abs( minLat - maxLat ), Math.abs( minLong - maxLong ));
致以最良好的祝愿,
Zied Hamdi

我试过了,但似乎根本不起作用。变焦太大了。哎呀,你说得对,那个版本坏了。我对答案进行了编辑,以减少临时对象的使用,同时也起到了作用:)有人能告诉我关于点的情况吗?假设是什么?如果你正在处理GPS点,那么你需要通过
(int)Math.round(lat*1E6)
int minLat = Integer.MAX_VALUE;
int minLong = Integer.MAX_VALUE;
int maxLat = Integer.MIN_VALUE;
int maxLong = Integer.MIN_VALUE;

for( GeoPoint l : points ) {
    minLat  = Math.min( l.getLatitudeE6(), minLat );
    minLong = Math.min( l.getLongitudeE6(), minLong);
    maxLat  = Math.max( l.getLatitudeE6(), maxLat );
    maxLong = Math.max( l.getLongitudeE6(), maxLong );
}

mapView.getController().zoomToSpan(Math.abs( minLat - maxLat ), Math.abs( minLong - maxLong ));