Поместите местоположения на карте вокруг пользователя с определенным радиусом - Android - PullRequest
1 голос
/ 02 апреля 2011

Я работаю над приложением GPS и играю над идеей размещения маркеров вокруг пользователя, как в Zombie Run и SpecTrek , но совершенно не понимаю, как найтиместоположения вокруг пользователя.

Я искал документацию для класса Location и использовал функцию distanceTo () для других целей, а также функции MapView latitudeSpan (), longitudeSpan () и getProjection (), ноЯ не могу придумать, как определиться с местоположениями, которые находятся, например, в 100 метрах от пользователя.

Поскольку я знаю положение пользователей, я собираюсь размещать маркеры, которые находятся на расстоянии ~ 1 км отПользователь, самое большее, может ли я рассматривать область как плоскую, а не эллипсоидальную, и поэтому просто может взять долготу и широту пользователя и +/- из них, чтобы нанести вокруг них маркер (используя некоторую базовую тригонометрию, такую ​​как x = cos (radius) и y = sin (радиус), чтобы держать его в пределах круга с радиусом вокруг игрока)?

Не знаюпонять, как долго / широта соответствует фактическим скалярным расстояниям, как если бы 100long 100lat находилось в 10 метрах от 90long 100lat?(Я знаю, что эти значения абсолютно неверны, но просто использую их для иллюстрации моего вопроса).

Спасибо за ваше время,

Infinitifizz

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Расстояние между двумя точками долготы / широты рассчитывается по формуле haversine.Вот ссылка с теорией: http://www.movable -type.co.uk / scripts / latlong.html

Я бы использовал метод distanceTo, который вы уже упоминали для своих целей.У вас есть ваше текущее местоположение и все ваши достопримечательности.Просто вызовите Location.distanceTo (Poi) для каждой точки интереса, и если расстояние превышает 1000 метров, вы можете нарисовать точку на своей карте.

Если у вас нет ваших PoI в качестве объектов Location, просто создайтеони вот так:

poiLocation = new Location(LocationManager.PASSIVE_PROVIDER);
poiLocation.setLatitude(latitude);
poiLocation.setLongitude(longitude);

Я использовал метод distanceTo в приложении, похожем на радар, и работал просто отлично.

1 голос
/ 03 апреля 2011

Чуть ближе к нижней части страницы формуляр описан чуть лучше.Там вы можете увидеть, что он пересчитал в радианы, прежде чем рассчитывать.Также крайне важно, чтобы вы использовали правильные типы данных, чтобы избежать ложного округления чисел.Вот небольшой фрагмент кода, который должен работать:

double lat1 = 52.104636;
double lon1 = 0.356324;

double R = 6371.0;
double d = 1.0;
double dist = d / R;
double brng = Math.toRadians(1.0);
lat1 = Math.toRadians(lat1);
lon1 = Math.toRadians(lon1);

double lat2 = Math.asin( Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng));
double lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1),            Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2));
lon2 = (lon2+3*Math.PI)%(2*Math.PI) - Math.PI;

System.out.println("lat2: " + Math.toDegrees(lat2));
System.out.println("lon2: " + Math.toDegrees(lon2));
...