Come convertire un LatLng e un raggio in un LatLngBounds in Android Google Maps API v2?

Credo che questa sia una limitazione della recente API v2 di Google Maps. Recentemente hanno aggiunto la possibilità di disegnare un cerchio a terra, ma se si desidera posizionare la camera in modo che visualizzi l'integer cerchio, non esiste alcun modo per farlo.

Si può call CameraUpdateFactory # newLatLngBounds (limiti, riempimento) where "limiti" sono LatLngBounds e "imbottitura" è una distanza in pixel. Il problema è che non c'è modo di creare un LatLng e un raggio in un LatLngBounds.

  • ListView le righe con layout diversi
  • Calendario Android: modifica del giorno di inizio della settimana
  • Visualizza al di fuori di un margine di dialogo
  • La sovrapposizione dello schermo ha bloccato le autorizzazioni di Android
  • È ansible avere gli attributi personalizzati nei tag di AndroidManifest.xml?
  • Perché è ansible scrivere un arrays boolean in un pacchetto, ma non un boolean?
  • Il constructor per LatLngBounds richiede solo 2 istanze LatLng e genera un rettangolo in cui sono gli angoli NW e SE.

  • Utilizza il servizio per get la posizione GPS, Android?
  • Come get la risoluzione dello schermo di un dispositivo Android usando LIBGDX?
  • È ansible eseguire il debug di C / C ++ in Android Studio?
  • Durata del cassetto di navigazione su Android
  • Conversione del discorso al text
  • Tema Holo e API 8
  • 5 Solutions collect form web for “Come convertire un LatLng e un raggio in un LatLngBounds in Android Google Maps API v2?”

    Proprio come ha detto il presidente di Risadinha , si può facilmente raggiungere questo con android-maps-utils . Basta aggiungere:

     compile 'com.google.maps.android:android-maps-utils:0.4.4' 

    alle dependencies gradle, utilizzare il seguente codice:

     public LatLngBounds toBounds(LatLng center, double radiusInMeters) { double distanceFromCenterToCorner = radiusInMeters * Math.sqrt(2.0); LatLng southwestCorner = SphericalUtil.computeOffset(center, distanceFromCenterToCorner, 225.0); LatLng northeastCorner = SphericalUtil.computeOffset(center, distanceFromCenterToCorner, 45.0); return new LatLngBounds(southwestCorner, northeastCorner); } 

    EDIT:

    Il nostro objective è calcolare due punti ( LatLngs ): southwestCorner e northeastCorner . Dal javadoc dello SphericalUtil si può leggere che 225 e 45 sono i valori di heading , e la distanceFromCenterToCorner è la distance . Ulteriori spiegazioni sui valori riportti nell'image qui sotto:

    spiegazione visiva

    Questo è totalmente fattibile.

    Il LatLng è il centro del tuo cerchio corretto? Quello che vuoi fare è inscrivere il tuo cerchio all'interno del LatLngBounds (Cerchio all'interno di un problema Square), quindi l'intera cosa verrà visualizzata sulla mappa.

    Se si disegna su carta si può vedere che hai tutto il necessario per calcolare i tuoi LatLngBounds .

    Ricorda come trovare le lunghezze dei lati di un triangolo destro ?

     a² + b² = c² 

    Se tracciate una linea dal centro del cerchio all'angolo NW (in alto a sinistra) e un altro diritto nella panetworking occidentale (linea retta dal centro, a sinistra) della piazza, hai un triangolo. Ora è ansible utilizzare l'equazione sopra per risolvere per c perché si conosce la lunghezza degli altri lati del triangolo (il raggio del cerchio).

    Così ora la tua equazione diventa

     r² + r² = c² 

    che si riduce a

    2r² = c²

    che si riduce ulteriormente

    c = squareRoot (2) * r

    Ora hai la distanza. Questo è ovviamente una sovrapplicazione, perché la Terra non è piatta. Se le distanze non sono enormi, è ansible utilizzare la stessa equazione sopra, ma modificata per proiettare una terra sferica su un piano:

    http://en.wikipedia.org/wiki/Geographical_distance#Flat-surface_formulae

    Notate anche questo usa il teorema pitagorico , come abbiamo fatto sopra.

    Successivamente dovrai calcolare i tuoi punti finali (angoli NW e SE) dal punto centrale fornito da un cuscinetto e dalla distanza che hai trovato sopra.

    immettere qui la descrizione dell'immagine

    Questo post può aiutare: Calcola l'endpoint dato dalla distanza, dal cuscinetto, dal punto di partenza

    Non dimenticare di convertire i tuoi gradi in radianti quando usa l'equazione dal post collegato sopra! (Moltiplica gradi per pi/180 )

    Con la libreria javascript è ansible disegnare un cerchio con un centro e un raggio e quindi get i suoi limiti.

     centerSfo = new google.maps.LatLng(37.7749295, -122.41941550000001); circle = new google.maps.Circle({radius: 5000, center: centerSfo}); bounds = circle.getBounds(); 

    Potresti fare lo stesso con l'api android.

    Per questo c'è una libreria di utilità di Google:

    http://googlemaps.github.io/android-maps-utils/

    Consigliato da Google per questo task e il codice di esempio: http://code.google.com/p/gmaps-api-issues/issues/detail?id=5704

    Mentre la risposta di Bartek Lipinski è corretta se i tuoi LatLngBounds definiscono un quadrato, la maggior parte dei LatLngBounds definirà rettangoli e come tali i cuscinetti del nord-est e del sud-ovest dal centro non saranno sempre 45 e 255 gradi.

    Pertanto, se stai cercando di get i LatLngBounds di un raggio da un centro per each frameworkslatero, usa le coordinate dei tuoi bounds.northeast iniziali. bounds.northeast e bounds.southwest come questo (utilizzando SphericalUtils):

     LatLng northEast = SphericalUtil.computeOffset(center, radius * Math.sqrt(2.0), SphericalUtil.computeHeading(center, bounds.northeast)); LatLng southWest = SphericalUtil.computeOffset(center, radius * Math.sqrt(2.0), (180 + (180 + SphericalUtil.computeHeading(center, bounds.southwest)))); 

    (180 + (180 + x) calcola il cuscinetto del punto Sud-Ovest dal centro in senso orario.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.