2010-01-16 4 views
12

У меня есть MapView, что я показываю «полезный радиус» (думаю, точность координаты). Используя MapViewProjectionmetersToEquatorPixels, который, по общему признанию, только для экваториального расстояния) не дает мне достаточно точного расстояния (в пикселях). Как бы вы вычислили это, если бы вы хотели отображать круг вокруг вашей координаты, учитывая радиус?Как вычислить радиус вокруг точки в Android MapView?

+2

Возможно, это также можно назвать следующим: у меня есть координата GPS и расстояние, как я могу нарисовать круг, который охватывает радиус от точки GPS? –

+0

Я не уверен, что понимаю проблему - что вы имеете в виду, когда говорите, что это не дает вам достаточно точного расстояния? То, что вы имели в виду для него, говорит 100 м, но он показывает только круг в 50 м или что-то еще? –

+0

Да. Это на значительную сумму. –

ответ

28

Таким образом, Карты Google используют Mercator projection. Это означает, что чем дальше вы выходите от экватора, тем больше искажается расстояние. Согласно this discussion, правильному способу преобразования для расстояний нечто вроде:

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

Благодарим вас за ответ. Но у меня был запрос об этом уравнении. Является ли это уравнение достаточно тяжелым, чтобы замедлить работу приложения? Просто любопытно. – Ahmed

+2

Единственной возможной частью формулы является Math.cos(). Вы можете использовать функцию android.util.FloatMath.cos(), чтобы ускорить работу или даже сохранить таблицу с заранее вычисленными факторами, например. для каждой полной степени. Тогда вы можете просто сказать return (int) (map.getProjection(). MetersToEquatorPixels (meters) * factor [(int) latitude]. – Ridcully

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

Попробуйте это увидеть ... я использовал его на моей MapRadius и это, кажется, работает

+0

Если вы увидите мой ответ, вы точно увидите, почему это не будет работать во всех случаях . –

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

Ответ требует форматирования и добавить немного больше контекста о том, как работает ваш код и как он решает проблему OP! – abhiarora

Смежные вопросы