android - 14 - geodata

20
Работа с геоданными Олег Годовых

Upload: noveo

Post on 26-Jun-2015

257 views

Category:

Technology


0 download

DESCRIPTION

Location and maps basics

TRANSCRIPT

Page 1: Android - 14 - Geodata

Работа с геоданными

Олег Годовых

Page 2: Android - 14 - Geodata

Возможности Android

I Работа с кучей сенсоров (если есть на устройстве).I Картографический движок (если установлены дополненияGoogle Play — нет только на Kindle и чрезмерно китайскихустройствах).

I Всё богатство вебсервисов.

2 Работа с геоданными

Page 3: Android - 14 - Geodata

Получение местоположения

I <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

— разрешает получать информацию из сети (на базевышек сотовой связи, wi-fi, и т.д.), соответствуетLocationManager.NETWORK_PROVIDER.

I <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

— использование GPS, соответствуетLocationManager.GPS_PROVIDER.

I Когда мы используем ACCESS_FINE_LOCATION, использованиеACCESS_COARSE_LOCATION включается неявно.

3 Работа с геоданными

Page 4: Android - 14 - Geodata

Получение местоположенияДобавляем в 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 Работа с геоданными

Page 5: Android - 14 - Geodata

Получение местоположения

Создаём запрос:LocationRequest request = LocationRequest.create();request.setInterval(5 * 1000); // в мсrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);request.setFastestInterval(1 * 1000);

Управляем в пределах времени жизни:client.connect(); // в onStartclient.disconnect(); // в onStopclient.requestLocationUpdates(request, this);

// стартуем запрос обновлений, получаем через callbackclient.removeLocationUpdates(this);

// останавливаем запрос обновлений, нужно делать в onStop

Location currentLocation = client.getLastLocation(); // получаем самое свежее

5 Работа с геоданными

Page 6: Android - 14 - Geodata

Особенности геолокации

I Геолокация очень затратна по работе с аккумулятором.I Рекомендуется устанавливать разумные таймауты иотключать геолокационные сервисы на время бездействияприложения.

I Геолокация не всегда отдаёт точное положение, особеннодля статичного объекта (погрешность GPS — порядка 50метров, GSM — до километров).

I Google специально из соображений безопасности отдаётположение в случае определения по GSM с большойпогрешностью.

I Холодный старт довольно долгий.I В Китае сложно пользоваться.

6 Работа с геоданными

Page 7: Android - 14 - Geodata

Что есть ещё

I Через Geocoding можно узнать не только координаты, но итекущий адрес.

I Geofencing — вам будут присылаться обновления, когдапользователь находится в определённом месте.

I Activity Recognition — определяется вид активности(ходьба, бег, велосипед, транспорт)

7 Работа с геоданными

Page 8: Android - 14 - Geodata

Как отобразить

I Google API for Android, компонент MapView.I Google Play Services, компонент MapFragment.I Yandex maps.I WebView← Google maps, Bing maps, Yandex maps,whatever you want.

I 3rd-party libraries (OsmDroid, Mapsforge) —OpenStreetMaps, другие движки, можно написатьконнектор к любому сервису.

I Внешнее приложение.

8 Работа с геоданными

Page 9: Android - 14 - Geodata

Внешнее приложение

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 Работа с геоданными

Page 10: Android - 14 - Geodata

WebView

I Перед нами всё богатство всяческих вебсервисов.I Загружаем нужную страницу, если необходимо —передаём через параметры позицию.

I Минусы — вся работа через JavaScript. WebView позволяетприцепить обработчики на Java к коду на JavaScript, но этоухудшает быстродействие.

I Сложнее писать свои дополнительные слои.

10 Работа с геоданными

Page 11: Android - 14 - Geodata

Google Maps

I Подключаем Google Play Services.I Получаем ключ для Google Maps API.I Добавляем описание использования карт в манифест.I Подробнее — https://developers.google.com/maps/documentation/android/start

11 Работа с геоданными

Page 12: Android - 14 - Geodata

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 Работа с геоданными

Page 13: Android - 14 - Geodata

Google Maps

I Можем включить отображение спутниковой карты,траффика или Street View (всё это, если эти прелести естьдля данной локации).

I Не надо беспокоиться насчёт памяти — MapFragmentаллоцирует память под картинки нативно, используетBitmap pool. Так что если оно и решит сломаться, высможете только соболезновать.

I Можно делать оверлеи!

13 Работа с геоданными

Page 14: Android - 14 - Geodata

Маркеры

Отображаем какую-либо точку на экране, по нажатию — бабблс информацией.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 Работа с геоданными

Page 15: Android - 14 - Geodata

Маркеры

Можно переопределить:I GoogleMap.setOnMarkerClickListener(OnMarkerClickListener) —вместо показа баббла своё действие

I GoogleMap.setOnMarkerDragListener(OnMarkerDragListener) —на перетаскивание (по умолчанию не работает)

I

GoogleMap.setOnInfoWindowClickListener(OnInfoWindowClickListener)

— нажатие на баббл

15 Работа с геоданными

Page 16: Android - 14 - Geodata

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 Работа с геоданными

Page 17: Android - 14 - Geodata

Google Maps не всесильны

I Ограничения на бесплатное использованиеI Закрытый исходный кодI Привязано к гуглокартамI Не всё можно модифицировать.

17 Работа с геоданными

Page 18: Android - 14 - Geodata

Google Maps не всесильны

Сторонние библиотеки Mapsforge, OsmDroid, другие.I Идут в комплекте с коннекторами для других источниковкарт (OpenStreetMaps).

I Стараются повторять контракт гуглокарт (легче миграция).I Можно подключить свой источник.

18 Работа с геоданными

Page 19: Android - 14 - Geodata

Тайловые карты

I Карта разбивается на квадратикиI В зависимости от уровня зума общее число квадратиковбольше-меньше (пропорционально степеням двойки)

I В общих словах, мы должны просто реализовать метод,позволяющий для уровня зума N предоставить картинкудля квадрата с координатами (X, Y).

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

19 Работа с геоданными

Page 20: Android - 14 - Geodata

Полезные ссылки

I http://developer.android.com/training/location/index.html

I http://developer.android.com/google/play-services/location.html

I http://developer.android.com/google/play-services/maps.html

I https://github.com/osmdroid/osmdroidI https://code.google.com/p/mapsforge

20 Работа с геоданными