Работа с геоданными
Олег Годовых
Возможности Android
Работа с кучей сенсоров (если есть на устройстве).
Картографический движок (если установлены дополнения
Google Play — нет только на Kindle и чрезмерно китайских
устройствах).
Всё богатство вебсервисов.
2 Работа с геоданными
Получение местоположения
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
— разрешает получать информацию из сети (на базе
вышек сотовой связи, wi-fi, и т.д.), соответствует
LocationManager.NETWORK_PROVIDER.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
— использование GPS, соответствует
LocationManager.GPS_PROVIDER.
Когда мы используем ACCESS_FINE_LOCATION, использование
ACCESS_COARSE_LOCATION включается неявно.
3 Работа с геоданными
Получение местоположения
Добавляем в Activity необходимые Listener-ы:
public class MainActivity extends FragmentActivity implements
LocationListener,
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener
{ ...
Реализуем их методы:
public interface LocationListener {
void onLocationChanged(Location location);
}
static interface OnConnectionFailedListener {
void onConnectionFailed(ConnectionResult connectionResult);
}
static interface ConnectionCallbacks {
void onConnected(Bundle bundle);
void onDisconnected();
}
Создаём подключение:
public LocationClient( Context context,
GooglePlayServicesClient.ConnectionCallbacks connectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener failedListener) {
LocationClient client = new LocationClient(this, this, this);
}
4 Работа с геоданными
Получение местоположения
Создаём запрос:
LocationRequest request = LocationRequest.create();
request.setInterval(5 * 1000); // в мс
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
request.setFastestInterval(1 * 1000);
Управляем в пределах времени жизни:
client.connect(); // в onStart
client.disconnect(); // в onStop
client.requestLocationUpdates(request, this);
// стартуем запрос обновлений, получаем через callback
client.removeLocationUpdates(this);
// останавливаем запрос обновлений, нужно делать в onStop
Location currentLocation = client.getLastLocation(); // получаем самое свежее
5 Работа с геоданными
Особенности геолокации
Геолокация очень затратна по работе с аккумулятором.
Рекомендуется устанавливать разумные таймауты и
отключать геолокационные сервисы на время бездействия
приложения.
Геолокация не всегда отдаёт точное положение, особенно
для статичного объекта (погрешность GPS — порядка 50
метров, GSM — до километров).
Google специально из соображений безопасности отдаёт
положение в случае определения по GSM с большой
погрешностью.
Холодный старт довольно долгий.
В Китае сложно пользоваться.
6 Работа с геоданными
Что есть ещё
Через Geocoding можно узнать не только координаты, но и
текущий адрес.
Geofencing — вам будут присылаться обновления, когда
пользователь находится в определённом месте.
Activity Recognition — определяется вид активности
(ходьба, бег, велосипед, транспорт)
7 Работа с геоданными
Как отобразить
Google API for Android, компонент MapView.
Google Play Services, компонент MapFragment.
Yandex maps.
WebView ← Google maps, Bing maps, Yandex maps,
whatever you want.
3rd-party libraries (OsmDroid, Mapsforge) —
OpenStreetMaps, другие движки, можно написать
коннектор к любому сервису.
Внешнее приложение.
8 Работа с геоданными
Внешнее приложение
String uri = String.format("geo:%.6f,%.6f?z=%d", latitude, longitude, zoom);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);
9 Работа с геоданными
WebView
Перед нами всё богатство всяческих вебсервисов.
Загружаем нужную страницу, если необходимо —
передаём через параметры позицию.
Минусы — вся работа через JavaScript. WebView позволяет
прицепить обработчики на Java к коду на JavaScript, но это
ухудшает быстродействие.
Сложнее писать свои дополнительные слои.
10 Работа с геоданными
Google Maps
Подключаем Google Play Services.
Получаем ключ для Google Maps API.
Добавляем описание использования карт в манифест.
Подробнее — https://developers.google.com/
maps/documentation/android/start
11 Работа с геоданными
Google Maps
Начиная с API v2, карты отображаются в фрагментах.
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"/>
private GoogleMap map =
((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
12 Работа с геоданными
Google Maps
Можем включить отображение спутниковой карты,
траффика или Street View (всё это, если эти прелести есть
для данной локации).
Не надо беспокоиться насчёт памяти — MapFragment
аллоцирует память под картинки нативно, использует
Bitmap pool. Так что если оно и решит сломаться, вы
сможете только соболезновать.
Можно делать оверлеи!
13 Работа с геоданными
Маркеры
Отображаем какую-либо точку на экране, по нажатию — баббл
с информацией.
static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298);
Marker melbourne = map.addMarker(new MarkerOptions()
.position(MELBOURNE)
.title("Melbourne")
.snippet("Population: 4,137,400"));
14 Работа с геоданными
Маркеры
Можно переопределить:
GoogleMap.setOnMarkerClickListener(OnMarkerClickListener) —
вместо показа баббла своё действие
GoogleMap.setOnMarkerDragListener(OnMarkerDragListener) —
на перетаскивание (по умолчанию не работает)
GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener)
— нажатие на баббл
15 Работа с геоданными
Google Maps
Можно очень классно управлять наклоном, поворотом,
местоположением и анимацией.
private static final LatLng SYDNEY = new LatLng(-33.88,151.21);
private static final LatLng MOUNTAIN_VIEW = new LatLng(37.4, - 122.1);
private GoogleMap map;
map.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 15));
map.animateCamera(CameraUpdateFactory.zoomIn());
map.animateCamera(CameraUpdateFactory.zoomTo(10), null, 2000);
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(MOUNTAIN_VIEW)
.zoom(17)
.bearing(90)
.tilt(30)
.build();
map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
16 Работа с геоданными
Google Maps не всесильны
Ограничения на бесплатное использование
Закрытый исходный код
Привязано к гуглокартам
Не всё можно модифицировать.
17 Работа с геоданными
Google Maps не всесильны
Сторонние библиотеки Mapsforge, OsmDroid, другие.
Идут в комплекте с коннекторами для других источников
карт (OpenStreetMaps).
Стараются повторять контракт гуглокарт (легче миграция).
Можно подключить свой источник.
18 Работа с геоданными
Тайловые карты
Карта разбивается на квадратики
В зависимости от уровня зума общее число квадратиков
больше-меньше (пропорционально степеням двойки)
В общих словах, мы должны просто реализовать метод,
позволяющий для уровня зума N предоставить картинку
для квадрата с координатами (X, Y).
Движок сам управляет подгрузкой, пока более детальные
изображения не загрузились, ресэмплит картинки другого
масштаба.
19 Работа с геоданными
Полезные ссылки
http://developer.android.com/training/
location/index.html
http://developer.android.com/google/
play-services/location.html
http://developer.android.com/google/
play-services/maps.html
https://github.com/osmdroid/osmdroid
https://code.google.com/p/mapsforge
20 Работа с геоданными

Android - 14 - Geodata

  • 1.
  • 2.
    Возможности Android Работа скучей сенсоров (если есть на устройстве). Картографический движок (если установлены дополнения Google Play — нет только на Kindle и чрезмерно китайских устройствах). Всё богатство вебсервисов. 2 Работа с геоданными
  • 3.
    Получение местоположения <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> —разрешает получать информацию из сети (на базе вышек сотовой связи, wi-fi, и т.д.), соответствует LocationManager.NETWORK_PROVIDER. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> — использование GPS, соответствует LocationManager.GPS_PROVIDER. Когда мы используем ACCESS_FINE_LOCATION, использование ACCESS_COARSE_LOCATION включается неявно. 3 Работа с геоданными
  • 4.
    Получение местоположения Добавляем вActivity необходимые Listener-ы: public class MainActivity extends FragmentActivity implements LocationListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener { ... Реализуем их методы: public interface LocationListener { void onLocationChanged(Location location); } static interface OnConnectionFailedListener { void onConnectionFailed(ConnectionResult connectionResult); } static interface ConnectionCallbacks { void onConnected(Bundle bundle); void onDisconnected(); } Создаём подключение: public LocationClient( Context context, GooglePlayServicesClient.ConnectionCallbacks connectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener failedListener) { LocationClient client = new LocationClient(this, this, this); } 4 Работа с геоданными
  • 5.
    Получение местоположения Создаём запрос: LocationRequestrequest = LocationRequest.create(); request.setInterval(5 * 1000); // в мс request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); request.setFastestInterval(1 * 1000); Управляем в пределах времени жизни: client.connect(); // в onStart client.disconnect(); // в onStop client.requestLocationUpdates(request, this); // стартуем запрос обновлений, получаем через callback client.removeLocationUpdates(this); // останавливаем запрос обновлений, нужно делать в onStop Location currentLocation = client.getLastLocation(); // получаем самое свежее 5 Работа с геоданными
  • 6.
    Особенности геолокации Геолокация оченьзатратна по работе с аккумулятором. Рекомендуется устанавливать разумные таймауты и отключать геолокационные сервисы на время бездействия приложения. Геолокация не всегда отдаёт точное положение, особенно для статичного объекта (погрешность GPS — порядка 50 метров, GSM — до километров). Google специально из соображений безопасности отдаёт положение в случае определения по GSM с большой погрешностью. Холодный старт довольно долгий. В Китае сложно пользоваться. 6 Работа с геоданными
  • 7.
    Что есть ещё ЧерезGeocoding можно узнать не только координаты, но и текущий адрес. Geofencing — вам будут присылаться обновления, когда пользователь находится в определённом месте. Activity Recognition — определяется вид активности (ходьба, бег, велосипед, транспорт) 7 Работа с геоданными
  • 8.
    Как отобразить Google APIfor Android, компонент MapView. Google Play Services, компонент MapFragment. Yandex maps. WebView ← Google maps, Bing maps, Yandex maps, whatever you want. 3rd-party libraries (OsmDroid, Mapsforge) — OpenStreetMaps, другие движки, можно написать коннектор к любому сервису. Внешнее приложение. 8 Работа с геоданными
  • 9.
    Внешнее приложение String uri= String.format("geo:%.6f,%.6f?z=%d", latitude, longitude, zoom); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); startActivity(intent); 9 Работа с геоданными
  • 10.
    WebView Перед нами всёбогатство всяческих вебсервисов. Загружаем нужную страницу, если необходимо — передаём через параметры позицию. Минусы — вся работа через JavaScript. WebView позволяет прицепить обработчики на Java к коду на JavaScript, но это ухудшает быстродействие. Сложнее писать свои дополнительные слои. 10 Работа с геоданными
  • 11.
    Google Maps Подключаем GooglePlay Services. Получаем ключ для Google Maps API. Добавляем описание использования карт в манифест. Подробнее — https://developers.google.com/ maps/documentation/android/start 11 Работа с геоданными
  • 12.
    Google Maps Начиная сAPI v2, карты отображаются в фрагментах. <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.google.android.gms.maps.MapFragment"/> private GoogleMap map = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap(); map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 12 Работа с геоданными
  • 13.
    Google Maps Можем включитьотображение спутниковой карты, траффика или Street View (всё это, если эти прелести есть для данной локации). Не надо беспокоиться насчёт памяти — MapFragment аллоцирует память под картинки нативно, использует Bitmap pool. Так что если оно и решит сломаться, вы сможете только соболезновать. Можно делать оверлеи! 13 Работа с геоданными
  • 14.
    Маркеры Отображаем какую-либо точкуна экране, по нажатию — баббл с информацией. static final LatLng MELBOURNE = new LatLng(-37.81319, 144.96298); Marker melbourne = map.addMarker(new MarkerOptions() .position(MELBOURNE) .title("Melbourne") .snippet("Population: 4,137,400")); 14 Работа с геоданными
  • 15.
    Маркеры Можно переопределить: GoogleMap.setOnMarkerClickListener(OnMarkerClickListener) — вместопоказа баббла своё действие GoogleMap.setOnMarkerDragListener(OnMarkerDragListener) — на перетаскивание (по умолчанию не работает) GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener) — нажатие на баббл 15 Работа с геоданными
  • 16.
    Google Maps Можно оченьклассно управлять наклоном, поворотом, местоположением и анимацией. private static final LatLng SYDNEY = new LatLng(-33.88,151.21); private static final LatLng MOUNTAIN_VIEW = new LatLng(37.4, - 122.1); private GoogleMap map; map.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 15)); map.animateCamera(CameraUpdateFactory.zoomIn()); map.animateCamera(CameraUpdateFactory.zoomTo(10), null, 2000); CameraPosition cameraPosition = new CameraPosition.Builder() .target(MOUNTAIN_VIEW) .zoom(17) .bearing(90) .tilt(30) .build(); map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 16 Работа с геоданными
  • 17.
    Google Maps невсесильны Ограничения на бесплатное использование Закрытый исходный код Привязано к гуглокартам Не всё можно модифицировать. 17 Работа с геоданными
  • 18.
    Google Maps невсесильны Сторонние библиотеки Mapsforge, OsmDroid, другие. Идут в комплекте с коннекторами для других источников карт (OpenStreetMaps). Стараются повторять контракт гуглокарт (легче миграция). Можно подключить свой источник. 18 Работа с геоданными
  • 19.
    Тайловые карты Карта разбиваетсяна квадратики В зависимости от уровня зума общее число квадратиков больше-меньше (пропорционально степеням двойки) В общих словах, мы должны просто реализовать метод, позволяющий для уровня зума N предоставить картинку для квадрата с координатами (X, Y). Движок сам управляет подгрузкой, пока более детальные изображения не загрузились, ресэмплит картинки другого масштаба. 19 Работа с геоданными
  • 20.