2010-01-16 12 views
12

Mam MapView, że wyświetlam "użyteczny promień" (myślę o dokładności współrzędnych). Używanie 's Projection' s metersToEquatorPixels, co jest wprawdzie tylko dla odległości równikowej) nie daje mi wystarczająco dokładnej odległości (w pikselach). Jak byś to obliczył, gdybyś chciał wyświetlić okrąg wokół swojej współrzędnej, z podanym promieniem?Jak obliczyć promień wokół punktu w Android MapView?

+2

Można to również prawdopodobnie stwierdzić jako: Mam współrzędne GPS i odległość, w jaki sposób mogę narysować okrąg, który obejmuje promień z punktu GPS? –

+0

Nie jestem pewien, czy rozumiem problem - co masz na myśli mówiąc, że nie zapewnia wystarczająco dokładnego dystansu? To, co miałeś na myśli to powiedzieć 100m, ale pokazuje tylko krąg na 50m czy coś w tym stylu? –

+0

Tak. Jest znacznie za dużo. –

Odpowiedz

28

Mapy Google używają numeru Mercator projection. Oznacza to, że im dalej dostaniesz się od równika, tym bardziej zniekształcone stają się odległości. Według this discussion, właściwy sposób przekonwertować na dystansach jest coś takiego:

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

Dziękuję za odpowiedź. Ale miałem pytanie dotyczące tego równania. Czy to równanie jest wystarczająco ciężkie, aby spowolnić działanie aplikacji? Po prostu ciekawy. – Ahmed

+2

Jedyna potencjalnie czasochłonna część formuły to Math.cos(). Możesz użyć funkcji android.util.FloatMath.cos(), aby przyspieszyć działanie lub nawet zachować tabelę wstępnie obliczonych czynników, np. za każdy pełny stopień. Następnie możesz po prostu powiedzieć return (int) (map.getProjection(). MetersToEquatorPixels (metry) * współczynnik [(int) szerokość geograficzna). – Ridcully

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

Spróbuj i zobacz ... Używałem go na moim MapRadius i wydaje się działać

+0

Jeśli zobaczysz moją odpowiedź, zobaczysz dokładnie, dlaczego to nie zadziała we wszystkich przypadkach –

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

Odpowiedź wymaga sformatowania i dodaje trochę więcej kontekstu na temat działania twojego kodu i jak rozwiązuje problem OP! – abhiarora

Powiązane problemy