2010-01-16 16 views
12

Tengo un MapView que estoy mostrando un "radio útil" (piense en la precisión de la coordenada) pulg Utilizando MapViewmetersToEquatorPixels, que es sólo por la distancia ecuatorial) no me está dando una distancia lo suficientemente precisa (en píxeles). ¿Cómo calcularías esto si quisieras mostrar un círculo alrededor de tu coordenada, dado el radio?Cómo calcular un radio alrededor de un punto en un Android MapView?

+2

Esto también podría, probablemente, establecerse como: Tengo una coordenada GPS y una distancia, ¿cómo puedo dibujar un círculo que abarque el radio del punto GPS? –

+0

No estoy seguro de entender el problema. ¿Qué quiere decir cuando dice que no le está dando una distancia lo suficientemente precisa? ¿A qué te refieres? Di 100m pero solo muestra un círculo a 50m o algo así? –

+0

Sí. Está apagado por una cantidad significativa. –

Respuesta

28

Entonces, Google Maps usa un Mercator projection. Esto significa que cuanto más te alejas del ecuador, más distorsionadas se vuelven las distancias. De acuerdo con this discussion, la forma correcta de convertir para distancias es algo así como:

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

Gracias por la respuesta. Pero tenía una consulta sobre esta ecuación. ¿Es esta ecuación lo suficientemente pesada como para ralentizar el rendimiento de una aplicación? Sólo curioso. – Ahmed

+2

La única parte que posiblemente consume mucho tiempo de la fórmula es Math.cos(). Puede usar la función android.util.FloatMath.cos() para acelerar las cosas, o incluso mantener una tabla de factores precalculados, p. por cada grado completo. Entonces podría simplemente decir return (int) (map.getProjection(). MetersToEquatorPixels (meters) * factor [(int) latitude]. – Ridcully

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

Intenta lo siguiente y ... lo usé en mi MapRadius y parece estar funcionando

+0

Si ve mi respuesta, verá exactamente por qué esto no funcionará en todos los casos . –

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

La respuesta requiere formateo y agrega un poco más de contexto sobre cómo funciona tu código y cómo resuelve el problema de OP. – abhiarora

Cuestiones relacionadas