Выяснить широту и долготу

Я пытаюсь разработать приложение для Android, которое может выполнять задачу в соответствии с широтой/долготой. Это что-то вроде того, что если я нахожусь в определенном пригороде (допустим, я нахожусь в Белконнене, ACT Австралия, я хотел бы автоматически получать информацию об этом месте) - если я выезжаю за границу Белконнена, мне нужно показать некоторые другие детали. .

Если вы проверите эту ссылку на Google Maps: http://goo.gl/4mItcF, вы увидите, что красная рамка только пригород Белконнен.

Мой вопрос заключается в том, как мне указать границы в моем приложении (имеется в виду, как мне сообщить моему приложению, что я сейчас нахожусь в belconnen, ACT? Получая широту/долготу вдоль границ, сохраняйте их в БД и проверяйте, требуется ли мне внутри широта/долгота, если это так, в БД будут огромные числа только для Белконнена, ACT, верно?

Или есть более простой способ получить границы?

Дайте мне знать!

Спасибо!


person TheDevMan    schedule 22.12.2014    source источник
comment
перейдите по этой ссылке: tutorialspoint.com/android/android_location_based_services.htm   -  person krunal patel    schedule 05.01.2015
comment
Вы проверили геофенсинг?   -  person MysticMagicϡ    schedule 05.01.2015
comment
@MagicalPhoenixϡ Думаю, для этого нужен интернет. Я ищу решение, которое работает в автономном режиме, а не через Интернет.   -  person TheDevMan    schedule 06.01.2015


Ответы (4)


Есть способ, он называется Reverse Geocoding. Вы можете использовать его двумя способами:

<сильный>1. Использование Geocoder класса Android -

Geocoder gcd = new Geocoder(context, Locale.getDefault());
List<Address> addresses = gcd.getFromLocation(lat, lng, 1);
if (addresses.size() > 0) 
    System.out.println(addresses.get(0).getLocality());

Здесь вы используете lat = -35.2374551 и lng = 149.0672515 для Belconnen, ACT Australia. Ознакомьтесь с функцией getFromLocation для получения дополнительной информации.

<сильный>2. Использование веб-служб Google REST:

https://maps.googleapis.com/maps/api/geocode/json?latlng=-35.2374551,149.0672515 (JSON)

https://maps.googleapis.com/maps/api/geocode/xml?latlng=-35.2374551,149.0672515 (XML)

передайте широту и долготу, разделенные запятыми, и вы получите наиболее точное местоположение для этого в ответ. Дополнительную информацию можно найти здесь API Google для обратного геокодирования

Как только вы выйдете из Белконнена, ACT Australia, адрес в ответе больше не будет содержать это и вы сможете вложить некоторую логику, чтобы получить желаемое поведение.

person Bhavit S. Sengar    schedule 05.01.2015
comment
Ваша точка 2 требует интернета. Я ищу решение, которое может работать, даже если интернет не работает. - person TheDevMan; 06.01.2015

Насколько я понимаю, вы хотели бы создать приложение с учетом местоположения.

Согласно документации Android, API-интерфейсы определения местоположения сервисов Google Play предпочтительнее, чем API-интерфейсы определения местоположения платформы Android (android.location), поскольку это способ добавления информации о местоположении в ваше приложение.

Шаг 1. Определение текущего местоположения пользователя

Google рекомендует использовать для этой цели FusionProvider API. Это один из API-интерфейсов определения местоположения в сервисах Google Play, где вы можете указывать требования на высоком уровне, такие как высокая точность или низкое энергопотребление. Это также оптимизирует использование устройством заряда батареи.

https://developer.android.com/reference/com/google/android/gms/location/FusedLocationProviderApi.html

Шаг 2. Основываясь на информации о широте и долготе, полученной в объекте местоположения, вы можете использовать указанную ниже веб-службу Google, чтобы получить почтовый индекс местоположения.

http://maps.googleapis.com/maps/api/geocode/json?latlng=широта,долгота&sensor=true

Шаг 3. Как часто мы можем получать информацию о местоположении

Постоянное включение слушателей сильно влияет на заряд батареи устройства. Итак, чтобы избежать этого, нам нужно минимизировать частоту получения информации о местоположении.

Я бы рекомендовал измерять расстояние, пройденное пользователем, и на его основе устанавливать триггер обновления следующего местоположения. Поскольку вас интересует только граница, мы можем установить высокое значение на основе ускорения устройства. Обратитесь к ссылкам ниже для получения более подробной информации о том, как реализовать это эффективно. https://stackoverflow.com/a/11644809/623517

Надеюсь это поможет.

person Prem    schedule 05.01.2015
comment
Я не всегда проверяю местоположение. Это делается только тогда, когда пользователь открывает мое приложение. У меня есть несколько важных деталей, хранящихся в локальной БД. Все, что мне нужно, это когда я открываю приложение в соответствии с местоположением, я хочу указать детали и показать их. Для чего мне нужно знать местоположение и его границы? GEO FENCING хорошо работает на небольших участках, но как я могу разместить его на больших участках? - person TheDevMan; 08.01.2015

Вы можете получить полный адрес от lat long, а затем найти свой город или местоположение. Этот ответ объясняет, как это сделать: Как получить полный адрес из широта и долгота?

Если вам нужна дополнительная гибкость, вы можете использовать геозону: http://developer.android.com/training/location/geofencing.html

person Karioki    schedule 22.12.2014
comment
Формат адреса - идеальная идея, которая уже реализована, но что, если у меня нет интернета, я бы хотел показать ограниченные данные. - person TheDevMan; 23.12.2014
comment
Для геозоны: у меня есть широта и долгота, чтобы сравнить мою текущую широту и долготу, для которых у меня будут огромные наборы широты и долготы только для Белконнена, Австралия, верно? - person TheDevMan; 23.12.2014
comment
В геозонах вы в основном предоставляете круг, а остальное обрабатывается андроидом, вам не нужно сравнивать себя. Для офлайн-вещей вы должны попробовать, как я не знаю. - person Karioki; 23.12.2014

Вы можете приблизить регион с помощью LatLngBounds (com.google.android.gms.maps.model.LatLngBounds). Используйте это так:

LatLngBounds.Builder builder = new Builder();
for (int i=0; i<points.length; i++) {
    builder.include(points[i]);
}
LatLngBounds bounds = builder.build();

А затем проверьте, попадает ли ваше местоположение в него:

if (bounds.contains(myLatLng)) {
    //your implementation
}

Я знаю, что этот подход не может дать идеальных результатов, но он кажется более эффективным, чем использование геозон.

person dev.bmax    schedule 01.01.2015