2010-01-16 13 views
12

Ho un MapView che sto visualizzando un "raggio utile" (penso alla precisione delle coordinate) pollici. L'utilizzo diProjectionmetersToEquatorPixels, che è ammesso solo per la distanza equatoriale) non mi sta dando una distanza sufficientemente precisa (in pixel). Come lo calcoleresti se volessi visualizzare un cerchio attorno alle tue coordinate, dato il raggio?Come calcolare un raggio attorno a un punto in un MapView Android?

+2

Questo potrebbe anche, probabilmente, essere dichiarato come: Ho una coordinata GPS e una distanza, come posso disegnare un cerchio che comprende il raggio dal punto GPS? –

+0

Non sono sicuro di aver capito il problema - cosa intendi quando dici che non ti sta dando una distanza sufficientemente precisa? Che intendevi dire per 100m ma mostra solo un cerchio a 50m o qualcosa del genere? –

+0

Sì. È fuori da una quantità significativa. –

risposta

28

Quindi, Google Maps utilizza uno Mercator projection. Ciò significa che più si ottiene dall'equatore più le distanze diventano distorte. Secondo this discussion, il modo corretto per convertire per le distanze è qualcosa di simile:

public static int metersToRadius(float meters, MapView map, double latitude) { 
    return (int) (map.getProjection().metersToEquatorPixels(meters) * (1/ Math.cos(Math.toRadians(latitude))));   
} 
+0

Grazie per la risposta. Ma avevo una domanda su questa equazione. Questa equazione è abbastanza pesante da rallentare le prestazioni di un'app? Solo curioso. – Ahmed

+2

L'unica parte che può richiedere molto tempo della formula è Math.cos(). Puoi utilizzare la funzione android.util.FloatMath.cos() per velocizzare le cose, o anche mantenere una tabella di fattori precomputi, ad es. per ogni grado. Quindi potresti semplicemente dire return (int) (map.getProjection(). MetersToEquatorPixels (metri) * factor [(int) latitude]. – Ridcully

-1
projection.toPixels(GeoP, pt); 
float radius = projection.metersToEquatorPixels(50); 

Provate questo e vedere ... ho usato sul mio MapRadius e sembra funzionare

+0

Se vedi la mia risposta vedrai esattamente perché questo non funzionerà in tutti i casi –

0
mMap.addCircle(
    new CircleOptions().center(
     new LatLng(
      bounds.getCenter().latitude, 
      bounds.getCenter().longitude 
     ) 
    ) 
    .radius(50000) 
    .strokeWidth(0f) 
    .fillColor(0x550000FF) 
); 
+2

La risposta richiede formattazione e aggiunge un po 'più di contesto su come funziona il tuo codice e come risolve il problema di OP! – abhiarora

Problemi correlati