Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OpenStreetMap en Android

OpenStreetMap en Android

Ponencia sobre mi experiencia desarrollando aplicaciones Android que hacen uso de OpenStreetMap.

http://media.fib.upc.edu/fibtv/streamingmedia/view/2/665

More Decks by José Manuel Pereira García

Other Decks in Programming

Transcript

  1. 2

  2. 3 ¿Porque usar OpenStreetMap en Android? Servicio Gratuito Datos Abiertos

    Librerías OpenSource Mapas Offline OpenStreetMap NO es una alternativa a Google Maps
  3. OSMDROIDBonusPack Bubbles y límites Mi viaje por OpenStreetMap 5 OSMDROID

    Mi primera elección Mobile Atlas Creator Tiles Baneados
  4. OSMDROIDBonusPack Bubbles y límites Mi viaje por OpenStreetMap 5 OSMDROID

    Mi primera elección OSMDROID Rendimiento y bugs Mobile Atlas Creator Tiles Baneados
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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)
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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);
  19. 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
  20. 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);
  21. 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)
  22. 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/
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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/
  31. 17