openstreetmap en android

55
OpenStreetMap en Android ¿La alternativa a Google Maps?

Upload: jose-manuel-pereira-garcia

Post on 18-Dec-2014

2.332 views

Category:

Technology


3 download

DESCRIPTION

Ponencia para el GDG Barcelona sobre mi experiencia desarrollando aplicaciones Android que hacen uso de OpenStreetMap.

TRANSCRIPT

Page 1: OpenStreetMap en Android

OpenStreetMap en Android

¿La alternativa a Google Maps?

Page 2: OpenStreetMap en Android

2

Page 3: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Page 4: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Datos Abiertos

Page 5: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Datos Abiertos Mapas Offline

Page 6: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos Mapas Offline

Page 7: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

Page 8: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

Page 9: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

Page 10: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

Page 11: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

Page 12: OpenStreetMap en Android

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline OpenStreetMap NO es una alternativa a

Google Maps

Page 13: OpenStreetMap en Android

Resumen de mi experiencia

4

Page 14: OpenStreetMap en Android

Resumen de mi experiencia

4

Al empezar

Page 15: OpenStreetMap en Android

Resumen de mi experiencia

4

Al empezar Al terminar

Page 16: OpenStreetMap en Android

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

Page 17: OpenStreetMap en Android

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

Page 18: OpenStreetMap en Android

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

Mobile Atlas Creator

Tiles Baneados

Page 19: OpenStreetMap en Android

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

OSMDROID Rendimiento

y bugs

Mobile Atlas Creator

Tiles Baneados

Page 20: OpenStreetMap en Android

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

MapsForge La alternativa

OSMDROID Rendimiento

y bugs

Mobile Atlas Creator

Tiles Baneados

Page 21: OpenStreetMap en Android

Juan Palomo Themes y Límites

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

MapsForge La alternativa

OSMDROID Rendimiento

y bugs

Mobile Atlas Creator

Tiles Baneados

Page 22: OpenStreetMap en Android

Juan Palomo Themes y Límites

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

MapsForge La alternativa

OSMDROID Rendimiento

y bugs

Mobile Atlas Creator

Tiles Baneados

MapsForge Sin Bubbles

Page 23: OpenStreetMap en Android

Mapas Offline

Mapas Vectoriales Themes Bubbles Rendimiento Límites

de mapa Rutas Overlays Overlays Avanzados

OSMDROID Si No No Si* Malo No* Si* Si No

MapsForge Si Si Si* No Bueno No* No* Si Si

OSMDROID vs MapsForge

6

Page 24: OpenStreetMap en Android

Mapas Offline

Mapas Vectoriales Themes Bubbles Rendimiento Límites

de mapa Rutas Overlays Overlays Avanzados

OSMDROID Si No No Si* Malo No* Si* Si No

MapsForge Si Si Si* No Bueno No* No* Si Si

OSMDROID vs MapsForge

6

Con OsmdroidBonusPack (incompatible con el parche)

Page 25: OpenStreetMap en Android

Mapas Offline

Mapas Vectoriales Themes Bubbles Rendimiento Límites

de mapa Rutas Overlays Overlays Avanzados

OSMDROID Si No No Si* Malo No* Si* Si No

MapsForge Si Si Si* No Bueno No* No* Si Si

OSMDROID vs MapsForge

6

Con OsmdroidBonusPack (incompatible con el parche)

Parche de código de terceros

Page 26: OpenStreetMap en Android

Mapas Offline

Mapas Vectoriales Themes Bubbles Rendimiento Límites

de mapa Rutas Overlays Overlays Avanzados

OSMDROID Si No No Si* Malo No* Si* Si No

MapsForge Si Si Si* No Bueno No* No* Si Si

OSMDROID vs MapsForge

6

Con OsmdroidBonusPack (incompatible con el parche)

Parche de código de terceros

Con OsmdroidBonusPack (incompatible con el parche)

Podemos implementarlos gracias a los overlays avanzados

Page 27: OpenStreetMap en Android

Mapas Offline

Mapas Vectoriales Themes Bubbles Rendimiento Límites

de mapa Rutas Overlays Overlays Avanzados

OSMDROID Si No No Si* Malo No* Si* Si No

MapsForge Si Si Si* No Bueno No* No* Si Si

OSMDROID vs MapsForge

6

Con OsmdroidBonusPack (incompatible con el parche)

Parche de código de terceros

Con OsmdroidBonusPack (incompatible con el parche)

Podemos implementarlos gracias a los overlays avanzados

Page 28: OpenStreetMap en Android

Mapas Offline

Mapas Vectoriales Themes Bubbles Rendimiento Límites

de mapa Rutas Overlays Overlays Avanzados

OSMDROID Si No No Si* Malo No* Si* Si No

MapsForge Si Si Si* No Bueno No* No* Si Si

OSMDROID vs MapsForge

6

Con OsmdroidBonusPack (incompatible con el parche)

Parche de código de terceros

Con OsmdroidBonusPack (incompatible con el parche)

Podemos implementarlos gracias a los overlays avanzados

Page 29: OpenStreetMap en Android

Mapas Offline

Mapas Vectoriales Themes Bubbles Rendimiento Límites

de mapa Rutas Overlays Overlays Avanzados

OSMDROID Si No No Si* Malo No* Si* Si No

MapsForge Si Si Si* No Bueno No* No* Si Si

OSMDROID vs MapsForge

6

Con OsmdroidBonusPack (incompatible con el parche)

Parche de código de terceros

Con OsmdroidBonusPack (incompatible con el parche)

Podemos implementarlos gracias a los overlays avanzados

Page 30: OpenStreetMap en Android

Mapas Offline

Mapas Vectoriales Themes Bubbles Rendimiento Límites

de mapa Rutas Overlays Overlays Avanzados

OSMDROID Si No No Si* Malo No* Si* Si No

MapsForge Si Si Si* No Bueno No* No* Si Si

OSMDROID vs MapsForge

6

Con OsmdroidBonusPack (incompatible con el parche)

Parche de código de terceros

Con OsmdroidBonusPack (incompatible con el parche)

Podemos implementarlos gracias a los overlays avanzados

Page 31: OpenStreetMap en Android

Un poco de código

7

Page 32: OpenStreetMap en Android

Un poco de código

7

<org.osmdroid.views.MapView android:id="@+id/openmapview" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Insertando nuestro mapa

Page 33: OpenStreetMap en Android

Un poco de código

7

<org.osmdroid.views.MapView android:id="@+id/openmapview" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Insertando nuestro mapa

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Manifest - Permisos necesarios

Page 34: OpenStreetMap en Android

Un poco de código

7

<org.osmdroid.views.MapView android:id="@+id/openmapview" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Insertando nuestro mapa

myOpenMapView = (MapView)findViewById(R.id.openmapview); myOpenMapView.setBuiltInZoomControls(true); myMapController = myOpenMapView.getController(); myMapController.setZoom(4);

En tiempo de ejecución

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Manifest - Permisos necesarios

Page 35: OpenStreetMap en Android

Un poco de código

7

<org.osmdroid.views.MapView android:id="@+id/openmapview" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Insertando nuestro mapa

myOpenMapView = (MapView)findViewById(R.id.openmapview); myOpenMapView.setBuiltInZoomControls(true); myMapController = myOpenMapView.getController(); myMapController.setZoom(4);

En tiempo de ejecución

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Manifest - Permisos necesarios

Multitouch (desactivado por defecto) myOpenMapView.setMultiTouchControls(true);

Page 36: OpenStreetMap en Android

Un poco de código

8

ArrayList<OverlayItem> myPoisArray = new ArrayList<OverlayItem>(); misPoisArray.add(new OverlayItem("Sevilla", "Capital", new GeoPoint(37.388436, -5.987257))); ItemizedOverlayWithFocus<OverlayItem> myOverlay = new ItemizedOverlayWithFocus<OverlayItem>(this, myPoisArray, myOnItemGestureListener); myOpenMapView.getOverlays().add(myOverlay); OnItemGestureListener<OverlayItem> myOnItemGestureListener = new OnItemGestureListener<OverlayItem>() { @Override public boolean onItemLongPress(int index, OverlayItem item) { return false; } @Override public boolean onItemSingleTapUp(int index, OverlayItem item) { Toast.makeText( TestOSMActivity.this, item.mDescription + "\n" + item.mTitle + "\n" + item.mGeoPoint.getLatitudeE6() + " : " + item.mGeoPoint.getLongitudeE6(), Toast.LENGTH_LONG).show(); return true; } };

ItemizedIconOverlay o ItemizedOverlayWithFocus

Page 37: OpenStreetMap en Android

Un poco de código

8

ArrayList<OverlayItem> myPoisArray = new ArrayList<OverlayItem>(); misPoisArray.add(new OverlayItem("Sevilla", "Capital", new GeoPoint(37.388436, -5.987257))); ItemizedOverlayWithFocus<OverlayItem> myOverlay = new ItemizedOverlayWithFocus<OverlayItem>(this, myPoisArray, myOnItemGestureListener); myOpenMapView.getOverlays().add(myOverlay); OnItemGestureListener<OverlayItem> myOnItemGestureListener = new OnItemGestureListener<OverlayItem>() { @Override public boolean onItemLongPress(int index, OverlayItem item) { return false; } @Override public boolean onItemSingleTapUp(int index, OverlayItem item) { Toast.makeText( TestOSMActivity.this, item.mDescription + "\n" + item.mTitle + "\n" + item.mGeoPoint.getLatitudeE6() + " : " + item.mGeoPoint.getLongitudeE6(), Toast.LENGTH_LONG).show(); return true; } };

ItemizedIconOverlay o ItemizedOverlayWithFocus

anotherItemizedIconOverlay.setFocusItemsOnTap(true);

Page 38: OpenStreetMap en Android

Un poco de código

9

@Override public void draw(Canvas canvas, MapView mapview, boolean arg2) { super.draw(canvas, mapview, arg2); if (this.size() > 0) { for (int i = 0; i < this.size(); i++) { GeoPoint in = getItem(i).getPoint(); Point out = new Point(); mapview.getProjection().toPixels(in, out); Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.myIcon); canvas.drawBitmap(bm, out.x - bm.getWidth() / 2, out.y - bm.getHeight() / 2, null); } } }

Cambiando iconos (sobreescribimos ItemizedIconOverlay)

Page 39: OpenStreetMap en Android

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Page 40: OpenStreetMap en Android

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Page 41: OpenStreetMap en Android

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Page 42: OpenStreetMap en Android

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Mobile Atlas Creator

Page 43: OpenStreetMap en Android

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Mobile Atlas Creator

osmdroid-packager http://androcode.es/2012/09/tiles-bloqueados-en-openstreetmap/

Page 44: OpenStreetMap en Android

Mapas Offline

10

Modificación en MapView.java DESCARGA DIRECTA https://docs.google.com/open?id=0B32Wy3J0YZ9SWnc0YmFhSm82REE INSTRUCCIONES http://androcode.es/2012/06/osmdroid-%E2%80%93-mapas-offline-con-openstreetmap-osm-parte-ii/ BoundingBoxE6 bbox = new BoundingBoxE6(limit north, limit east, limit south, limit west); mapView.setScrollableAreaLimit(bbox); public class ZoomLimitMapView extends MapView { @Override public int getMaxZoomLevel() { return 15; } @Override public int getMinZoomLevel() { return 4; } }

Limitando el Scroll y Zoom

Page 45: OpenStreetMap en Android

OSMDROID Funcionalidad

extra

11

• Geocoding and Reverse Geocoding, • Directions (routes) • Points of Interests (directory services): Wikipedia,

Flickr, Picasa... • Overlays with nice and flexible "cartoon-bubbles"

NOTA: Incompatibilidad con el parche de límites de scroll.

Más info http://androcode.es/2012/10/osmbonuspack-anadiendo-funcionalidad-a-osmdroid-osm-parte-iii

Page 46: OpenStreetMap en Android

MapsForge: La alternativa

12

Page 47: OpenStreetMap en Android

MapsForge: La alternativa

12

<org.mapsforge.android.maps.MapView android:id="@+id/openmapview" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Insertando nuestro mapa

Page 48: OpenStreetMap en Android

MapsForge: La alternativa

12

<org.mapsforge.android.maps.MapView android:id="@+id/openmapview" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Insertando nuestro mapa

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Manifest - Permisos necesarios

Page 49: OpenStreetMap en Android

MapsForge: La alternativa

12

<org.mapsforge.android.maps.MapView android:id="@+id/openmapview" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

Insertando nuestro mapa

mapView.setClickable(true); mapView.setBuiltInZoomControls(true); mapView.setCenter(new GeoPoint(41.38, 2.15)); mapView.getController().setZoom(13);

En tiempo de ejecución

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Manifest - Permisos necesarios

Page 50: OpenStreetMap en Android

MapsForge: La alternativa

13

Drawable defaultMarker = getResources().getDrawable(R.drawable.marker); ArrayItemizedOverlay itemizedOverlay = new ArrayItemizedOverlay(defaultMarker); GeoPoint geoPoint = new GeoPoint(41.38, 2.15); OverlayItem item = new OverlayItem(geoPoint, "Mi punto", "Un punto de prueba"); itemizedOverlay .addItem(item); mapView.getOverlays().add(itemizedOverlay); También podemos si lo deseamos añadir un marker propio a cada OverlayItem pasándoselo como parámetro en el constructor. Para este caso será obligatorio configurar los drawables: ItemizedOverlay.boundCenter(drawable); ItemizedOverlay.boundCenterBottom(drawable);

Personalizando los markers

Page 51: OpenStreetMap en Android

MapsForge: La alternativa

14

public class MyCustomOverlay extends ArrayItemizedOverlay { private Context mContext; public MyCustomOverlay(Context context, Drawable marker) { super(marker); this.mContext = context; } @Override protected boolean onTap(int index) { OverlayItem item = createItem(index); Toast.makeText(mContext, "Tap: " + item.getTitle(), Toast.LENGTH_LONG).show(); } @Override protected boolean onLongPress(int index) { OverlayItem item = createItem(index); Toast.makeText(mContext, "LongPress: " + item.getTitle(), Toast.LENGTH_LONG).show(); } }

Capturando eventos

Page 52: OpenStreetMap en Android

MapsForge: La alternativa

15

• Usando Osmosis o Instalación: http://androcode.es/2012/12/mapsforge-openstreetmap-en-android-33/ o Nota: Debido a conflictos con terceras aplicaciones la ejecución de Osmosis en mi equipo se

hizo imposible. Lo solucioné instalando en un entorno virtual linux limpio. • Descarga de mapas o osmosis --ra left=--6.0497 bottom=36.9059 right=--6.0998 top=36.9326 --write-xml

lebrija.osm o Nota: La descarga de datos desde OpenStreetMap está limitada 0.25 grados o 50000 nodos, por lo

tanto en la mayoría de los casos este sistema se nos quedará corto. o geofabrik http://download.geofabrik.de/openstreetmap/ • Recortando o osmosis --read-xml spain.osm --bb left=-6.0497 bottom=36.9059 right=-6.0998

top=36.9326 --write-xml lebrija.osm • Convertir formato (de .osm a .map) o Plugin para convertir formato mapsforge-map-writer-0.3.0-jar-with-dependencies.jar o osmosis --read-xml lebrija.osm --mapfile-writer file=lebrija.map

bbox=minLat,minLon,maxLat,maxLon • Seleccionando los mapas o mapView.setMapFile(new File(filepath));

Mapas Offline

Page 53: OpenStreetMap en Android

Más información

16

http://androcode.es/2012/12/mapsforge-openstreetmap-en-android-13/ http://androcode.es/2012/12/mapsforge-openstreetmap-en-android-23/ http://androcode.es/2012/12/mapsforge-openstreetmap-en-android-33/

Tutoriales MapsForge

http://androcode.es/2012/06/osmdroid-introduccion-a-openstreetmap-en-android-osm-parte-i/ http://androcode.es/2012/06/osmdroid-%E2%80%93-mapas-offline-con-openstreetmap-osm-parte-ii/ http://androcode.es/2012/09/tiles-bloqueados-en-openstreetmap/ http://androcode.es/2012/10/osmbonuspack-anadiendo-funcionalidad-a-osmdroid-osm-parte-iii/

Tutoriales OSMDROID

Site oficiales https://code.google.com/p/osmdroid/ http://code.google.com/p/osmbonuspack/ http://code.google.com/p/mapsforge/

Page 54: OpenStreetMap en Android

17

Page 55: OpenStreetMap en Android

FIN

¡GRACIAS!