2009-08-05 19 views

Antwort

0

Ich habe versucht, eine Methode zu machen, es funktioniert nicht perfekt, aber es scheint ausreichend (vielleicht sollte ich um den Quotienten auf den realen Wert haben):

private void adjustZoomToMarkers(ArrayList<GeoLocationFlag> flags) { 
    GeoPoint mapCenter = mapView.getMapCenter(); 
    int lat = mapCenter.getLatitudeE6(), lng = mapCenter.getLongitudeE6(); 
    int farestLat = 0, farestLng = 0; 
    for (GeoLocationFlag geoLocationFlag : flags) { 
     Log.d(LOG_TAG, "lat: " + geoLocationFlag.getLat()); 
     int flagLatDistance = Math.abs(geoLocationFlag.getLat() - lat); 
     if (farestLat < flagLatDistance) 
      farestLat = flagLatDistance; 

     Log.d(LOG_TAG, "lng: " + geoLocationFlag.getLng()); 
     int flagLngDistance = Math.abs(geoLocationFlag.getLng() - lng); 
     if (farestLng < flagLngDistance) 
      farestLng = flagLngDistance; 
    } 
    Log.d(LOG_TAG, "farest: " + farestLat + "," + farestLng); 
    Log.d(LOG_TAG, "spans: " + mapView.getLatitudeSpan() + "," + mapView.getLongitudeSpan()); 

    // compute how many times this screen we are far on lat 
    float latQuotient = (float) farestLat/((float) mapView.getLatitudeSpan()/2); 
    // compute how many times this screen we are far on lng 
    float lngQuotient = (float) farestLng/((float) mapView.getLongitudeSpan()/2); 

    int zoom = 0; 
    if (latQuotient > 1 || lngQuotient > 1) { 
     // must zoom out 
     float qutient = Math.max((int) latQuotient, (int) lngQuotient); 
     while ((qutient/2) > 1) { 
      qutient = qutient/2; 
      zoom--; 
     } 
    } else { 
     float qutient = Math.max((int) (1/(float) latQuotient), (int) (1/(float) lngQuotient)); 
     while ((qutient/2) > 1) { 
      qutient = qutient/2; 
      zoom++; 
     } 

    } 
    Log.d(LOG_TAG, "Zoom found " + zoom); 

    int zoomLevel = mapView.getZoomLevel(); 
    mapController.setZoom(zoomLevel + zoom); 
} 

Mit freundlichen Grüßen, Zied Hamdi

0

Wie erraten, wenn ich die Antwort oben schrieb: wenn der Quotient ist zB. 9, es bedeutet, dass Sie mehr als 4 Iterationen brauchen es, um zu sehen: so einfach correst beide Linien:

while ((qutient/2) > 0.5) { 

Mit besten Grüßen, Zied Hamdi

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)); 
+0

Ich habe es versucht, aber es scheint überhaupt nicht zu funktionieren, der Zoom ist riesig. –

+0

Hoppla, du hast Recht, dass die Version kaputt war. Ich habe die Antwort bearbeitet, um weniger temporäre Objekte zu verwenden und auch zu arbeiten :) – emmby

+0

Kann mir jemand sagen, was ist mit Punkten, was soll es sein? –

0

Ich mag deinen Code, der viel kürzer ist ;-), vielleicht sollte ich nur neue Instanzen in der for-Schleife zu schaffen vermeiden, dass die minimalen und maximalen Punkte zu haben ...

mit besten Grüßen, Zied Hamdi

Verwandte Themen