1

Ich habe eine Liste von LatLng Punkten, die ich als Markierungen auf einer GoogleMap anzeigen möchte. mir derzeit Berechnung eine Kameraansicht, die die folgende Art und Weise all meine Punkte paßt:Erstellen von CameraUpdate von Punkten und Auffüllen, um Markierungen schön anzuzeigen

  1. Zuerst habe ich berechnen eine LatLngBounds mit allen meinen Punkten.

    Iterator<LatLng> i = items.iterator(); 
    LatLngBounds.Builder builder = LatLngBounds.builder(); 
    while (i.hasNext()) { 
        builder.include(i.next()); 
    } 
    LatLngBounds bounds = builder.build(); 
    
  2. Dann benutze ich die entsprechende Methode:

    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(bounds, padding); 
    

Das Update bietet einen guten Blick auf alle meine Punkte, mit einigen netten Polsterung.

Frage

Ich möchte verschiedene Werte für paddingTop, paddingBottom, paddingLeft und paddingRight anzuwenden. Nämlich, ich habe nichts auf beiden Seiten, dann habe ich oben eine schwebende Werkzeugleiste (ca. 50dp) und eine schwebende Karte unten (ca. 200dp).

Wenn ich keine Polsterung hinzufüge, werden einige der Punkte von der oberen Symbolleiste oder von der unteren Karte abgedeckt.

Wenn ich die maximale Füllung hinzufügen (200dp), dann gibt es große Lücken oben, links und rechts. Irgendeine Idee?

__________________________ 
| ___________o__________ | 
| |     | | 
| |____________________|o| 
|   o    | 
|     o  | 
| o     | 
|   MAP   | 
|  o     | 
|     o | 
| ______________________ | 
| |     | | 
|o|     | | 
| |     |o| 
| |____________________| | 
|____________________o___| 

Meine einzige Idee ist gerade erhalten die Karte Breite in Pixel, die Karte Breite in Lng (nicht gut definiert) erhalten, finden die Pixel/lng-Verhältnis, gewünschte Polsterung aus Pixeln zu lng konvertieren und recompute LatLngBounds fügt einen falschen Punkt (einen für jede Seite) hinzu, der von meinen ursprünglichen Grenzen entfernt ist.

Antwort

1

Dies scheint zu funktionieren, aber ich werde auf eine bessere Lösung warten, wenn überhaupt.

Sie müssen die Breite und Höhe (in Pixeln) der Ansicht mit der Karte übergeben, damit wir einen Koeffizienten für die Koeffizienten der Pixel berechnen können. Dann übergeben Sie gewünschte Polsterung in einem Rect Objekt.

Wenn Sie viele Punkte haben, ist dies wahrscheinlich am besten geeignet, um eine Hintergrundaufgabe auszuführen.

public static CameraUpdate computeCameraView(final List<LatLng> items, 
              final GoogleMap map, final Rect padding, 
              final int viewWidth, final int viewHeight) { 

    // Compute bounds without padding 
    Iterator<LatLng> i = items.iterator(); 
    LatLngBounds.Builder builder = LatLngBounds.builder(); 
    while (i.hasNext()) { 
     builder.include(i.next()); 
    } 
    LatLngBounds bounds = builder.build(); 

    // Create a first CameraUpdate and apply 
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(bounds, 0); 
    map.moveCamera(cameraUpdate); 

    // Convert padding to lat/lng based on current projection 
    bounds = map.getProjection().getVisibleRegion().latLngBounds; 
    double mapWidth = bounds.northeast.longitude - bounds.southwest.longitude; 
    double mapHeight = bounds.northeast.latitude - bounds.southwest.latitude; 
    double pixelToLng = mapWidth/viewWidth; 
    double pixelToLat = mapHeight/viewHeight; 
    padding.top = (int) (padding.top * pixelToLat); 
    padding.bottom = (int) (padding.bottom * pixelToLat); 
    padding.left = (int) (padding.left * pixelToLng); 
    padding.right = (int) (padding.right * pixelToLng); 

    // Now padding holds insets in lat/lng values. 
    // Let's create two fake points and bound 
    LatLng northEast = new LatLng(bounds.northeast.latitude + padding.top, 
      bounds.northeast.longitude + padding.right); 
    LatLng southWest = new LatLng(bounds.southwest.latitude - padding.bottom, 
      bounds.southwest.longitude - padding.left); 
    LatLngBounds newBounds = new LatLngBounds.Builder() 
      .include(northEast).include(southWest).build(); 

    return CameraUpdateFactory.newLatLngBounds(newBounds, 0); 
} 

Der Schwachpunkt hier ist double mapWidth = bounds.northeast.longitude - bounds.southwest.longitude. Sie können den Längengrad nicht so berechnen, da es sich um eine kreisförmige Variable handelt (d. H., Es gibt Probleme, wenn der sichtbare Bereich den 180-Meridian kreuzt). Ich werde es untersuchen.

Dies sollte genug sein:

public static double computeLngDistance(LatLng east, LatLng west) { 
    if (east.longitude <= 0 && west.longitude >= 0) { 
     // We are crossing the 180 line. 
     return (east.longitude + 180d) + (180d - west.longitude); 
    } else { 
     return east.longitude - west.longitude; 
    } 
}