openstreetmap en android
DESCRIPTION
Ponencia para el GDG Barcelona sobre mi experiencia desarrollando aplicaciones Android que hacen uso de OpenStreetMap.TRANSCRIPT
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!