OpenStreetMap en Android

Post on 18-Dec-2014

2.323 views 3 download

description

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

Transcript of OpenStreetMap en Android

OpenStreetMap en Android

¿La alternativa a Google Maps?

2

3

¿Porque usar OpenStreetMap

en Android?

3

¿Porque usar OpenStreetMap

en Android?

Datos Abiertos

3

¿Porque usar OpenStreetMap

en Android?

Datos Abiertos Mapas Offline

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos Mapas Offline

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline

3

¿Porque usar OpenStreetMap

en Android?

Servicio Gratuito

Datos Abiertos

Librerías OpenSource

Mapas Offline OpenStreetMap NO es una alternativa a

Google Maps

Resumen de mi experiencia

4

Resumen de mi experiencia

4

Al empezar

Resumen de mi experiencia

4

Al empezar Al terminar

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

Mobile Atlas Creator

Tiles Baneados

OSMDROIDBonusPack Bubbles y límites

Mi viaje por OpenStreetMap

5

OSMDROID Mi primera elección

OSMDROID Rendimiento

y bugs

Mobile Atlas Creator

Tiles Baneados

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

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

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

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

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)

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

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

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

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

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

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

Un poco de código

7

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

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

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

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);

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

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);

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)

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Mapas Offline

10

/sdcard/osmdroid

Basta con colocarlos en esta carpeta

¿Cómo los obtenemos?

Mobile Atlas Creator

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/

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

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

MapsForge: La alternativa

12

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

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

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

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

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

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

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/

17

FIN

¡GRACIAS!