Download - Android - 14 - Geodata
Работа с геоданными
Олег Годовых
Возможности Android
I Работа с кучей сенсоров (если есть на устройстве).I Картографический движок (если установлены дополненияGoogle Play — нет только на Kindle и чрезмерно китайскихустройствах).
I Всё богатство вебсервисов.
2 Работа с геоданными
Получение местоположения
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 Работа с геоданными
Получение местоположенияДобавляем в 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(); // в onStartclient.disconnect(); // в onStopclient.requestLocationUpdates(request, this);
// стартуем запрос обновлений, получаем через callbackclient.removeLocationUpdates(this);
// останавливаем запрос обновлений, нужно делать в onStop
Location currentLocation = client.getLastLocation(); // получаем самое свежее
5 Работа с геоданными
Особенности геолокации
I Геолокация очень затратна по работе с аккумулятором.I Рекомендуется устанавливать разумные таймауты иотключать геолокационные сервисы на время бездействияприложения.
I Геолокация не всегда отдаёт точное положение, особеннодля статичного объекта (погрешность GPS — порядка 50метров, GSM — до километров).
I Google специально из соображений безопасности отдаётположение в случае определения по GSM с большойпогрешностью.
I Холодный старт довольно долгий.I В Китае сложно пользоваться.
6 Работа с геоданными
Что есть ещё
I Через Geocoding можно узнать не только координаты, но итекущий адрес.
I Geofencing — вам будут присылаться обновления, когдапользователь находится в определённом месте.
I Activity Recognition — определяется вид активности(ходьба, бег, велосипед, транспорт)
7 Работа с геоданными
Как отобразить
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 Работа с геоданными
Внешнее приложение
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
I Перед нами всё богатство всяческих вебсервисов.I Загружаем нужную страницу, если необходимо —передаём через параметры позицию.
I Минусы — вся работа через JavaScript. WebView позволяетприцепить обработчики на Java к коду на JavaScript, но этоухудшает быстродействие.
I Сложнее писать свои дополнительные слои.
10 Работа с геоданными
Google Maps
I Подключаем Google Play Services.I Получаем ключ для Google Maps API.I Добавляем описание использования карт в манифест.I Подробнее — 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
I Можем включить отображение спутниковой карты,траффика или Street View (всё это, если эти прелести естьдля данной локации).
I Не надо беспокоиться насчёт памяти — MapFragmentаллоцирует память под картинки нативно, используетBitmap pool. Так что если оно и решит сломаться, высможете только соболезновать.
I Можно делать оверлеи!
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 Работа с геоданными
Маркеры
Можно переопределить:I GoogleMap.setOnMarkerClickListener(OnMarkerClickListener) —вместо показа баббла своё действие
I GoogleMap.setOnMarkerDragListener(OnMarkerDragListener) —на перетаскивание (по умолчанию не работает)
I
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 не всесильны
I Ограничения на бесплатное использованиеI Закрытый исходный кодI Привязано к гуглокартамI Не всё можно модифицировать.
17 Работа с геоданными
Google Maps не всесильны
Сторонние библиотеки Mapsforge, OsmDroid, другие.I Идут в комплекте с коннекторами для других источниковкарт (OpenStreetMaps).
I Стараются повторять контракт гуглокарт (легче миграция).I Можно подключить свой источник.
18 Работа с геоданными
Тайловые карты
I Карта разбивается на квадратикиI В зависимости от уровня зума общее число квадратиковбольше-меньше (пропорционально степеням двойки)
I В общих словах, мы должны просто реализовать метод,позволяющий для уровня зума N предоставить картинкудля квадрата с координатами (X, Y).
I Движок сам управляет подгрузкой, пока более детальныеизображения не загрузились, ресэмплит картинки другогомасштаба.
19 Работа с геоданными
Полезные ссылки
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 Работа с геоданными