java - osm - openstreetmap android studio
¿Cómo crear mosaicos de mapas de OpenStreetMap sin conexión, mostrarlos en Android? (3)
Lo que quiero es mostrar un mapa sin conexión simple usando OpenStreetMap. No puedo encontrar en la web las herramientas adecuadas para crear mosaicos de mapas y utilizarlos para mostrar un mapa en Android. He descargado diferentes recursos, pero parece que no tengo idea de por dónde empezar. Quiero integrar imágenes de OpenStreetMap usando JOSM, pero no sé si puedo usarlas en Android.
¿Puedo usar Mapnik? Su ayuda será un gran agradecimiento.
Actualmente estoy desarrollando (mi primera) aplicación de Android usando la API de OpenStreetMap (OSM), así que mientras no puedo ayudarte con el JSOM, puedo intentar ayudarte con la parte de OSM:
Suponiendo que desea crear una nueva actividad en su aplicación de Android que simplemente muestra un mapa OSM, podría comenzar con algo como esto:
package example..osmdroid;
import android.app.Activity;
import android.os.Bundle;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
public class YourMap extends Activity {
// The MapView variable:
private MapView m_mapView;
// Default map zoom level:
private int MAP_DEFAULT_ZOOM = 15;
// Default map Latitude:
private double MAP_DEFAULT_LATITUDE = 38.535350;
// Default map Longitude:
private double MAP_DEFAULT_LONGITUDE = -121.753807;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Specify the XML layout to use:
setContentView(R.layout.osm_map);
// Find the MapView controller in that layout:
m_mapView = (MapView) findViewById(R.id.mapview);
// Setup the mapView controller:
m_mapView.setBuiltInZoomControls(true);
m_mapView.setMultiTouchControls(true);
m_mapView.setClickable(true);
m_mapView.setUseDataConnection(false);
m_mapView.getController().setZoom(MAP_DEFAULT_ZOOM);
m_mapView.getController().setCenter(
new GeoPoint(MAP_DEFAULT_LATITUDE, MAP_DEFAULT_LONGITUDE));
m_mapView.setTileSource(TileSourceFactory.MAPNIK);
} // end onCreate()
} // end class YourMap
Donde su diseño osm_map.xml puede verse algo como esto:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<org.osmdroid.views.MapView
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:enabled="true"
android:clickable="true"
/>
</RelativeLayout>
En cuanto a los mosaicos de mapas reales, hay un programa realmente genial llamado Mobile Atlas Creator , que le permite generar los mosaicos de mapas necesarios para el mapa de Android sin conexión implementado anteriormente.
Una vez que haya instalado la aplicación y desee crear un nuevo atlas, se le pedirá que seleccione su "formato de alto deseado". Cuando aparezca, selecciona "Osmdroid zip".
Una vez que todo se cargue, seleccione una región en el mapa para la que desea crear mosaicos, seleccione los niveles de zoom para los que desea los mosaicos y presione el botón "Agregar selección" en la columna de la izquierda, seguido de "Crear Atlas".
Ah, y dependiendo de la fuente, es posible que deba marcar la casilla de verificación "Crear / Ajustar mosaicos de mapas" para forzar que los mosaicos se exporten como PNG. ¿Alguien sabe si es posible usar JPG con OSM?
Una vez que se generó el ZIP, lo cambié de nombre a "Mapnik.zip" y lo moví a una carpeta recién creada llamada "mosaicos" en el área de trabajo de mi proyecto Eclipse para Android. Para que funcione, también tuve que abrir el archivo zip y cambiar el nombre de la carpeta de nivel superior de algo como "Google Earth" (según la fuente del mapa que usaste), a "Mapnik", para que el mosaico Mostrar en mi aplicación de Android.
Sin embargo, para poder cargar los mosaicos en su teléfono, necesitará usar la herramienta ADB del terminal. En su directorio de herramientas ADB, querrá ejecutar algo como esto (cada línea es un comando nuevo):
./adb shell rm -r /sdcard/osmdroid/
./adb shell mkdir /sdcard/osmdroi/
./adb push ~/path/to/your/mapnik.zip /sdcard/osmdroid
Según el tamaño del mapa y la velocidad del bus de memoria del teléfono, este último paso puede tardar entre varios minutos y una hora en completarse. Una vez hecho esto, su mapa debería funcionar - ¡espero!
Como mencioné, esta es la primera vez que uso la API de OSM, así que no soy un experto en eso, y solo puedo comentar sobre lo que funcionó para mí.
Espero que esto te ayude a comenzar!
EDITAR:
No tuve la oportunidad de ejecutar realmente el código que escribí ayer, así que no detecté algunos de los errores. Acabo de crear un nuevo proyecto en Eclipse, descargué mi código allí, arreglé algunas cosas y lo puse en marcha. ¡Todos los cambios que hice se reflejan en el código anterior! Olvidé varias de las declaraciones de importación básicas y olvidé agregar permisos al archivo manifest.xml.
Las últimas líneas de mi manifest.xml ahora se ven así:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<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>
Y también es posible que desee agregar esto al manifiesto, aunque ciertamente no es crítico:
<supports-screens
android:anyDensity="true"
android:resizeable="false"
android:largeScreens="true"
android:normalScreens="true"
/>
Agregue esto justo después de la parte <uses-sdk ... />
.
Además, asegúrese de importar las siguientes dos bibliotecas JAR:
osmdroid-android-3.0.3.jar // Or whatever version you''re using...
y
slf4j-android-1.5.8.jar // Or whatever the latest version is...
Sin este último JAR, mi código siguió fallando hasta que recordé incluirlo.
Asegúrate de modificar las coordenadas predeterminadas para que apunten a una ubicación para la que realmente tengas mosaicos de mapas, de lo contrario no verás mucho de nada, aparte de un lienzo en blanco.
Lo siento por no ejecutar el código en mi final primero!
Alternativamente, para mapear mosaicos , también puede usar datos vectoriales para su mapa offline, por ejemplo mapsforge o el SDK de Mapbox para Android. Para obtener más información, consulte la wiki de OSM sobre bibliotecas de OSM y Android sin conexión .
Aquí hay una solución paso a paso:
En breve:
1- Debes descargar los mosaicos de mapas usando Mobile Atlas Creator . He explicado los pasos HERE
2- Mueva el archivo zip resultante a /mnt/sdcard/osmdroid/
en su dispositivo.
3- Agregar osmdroid-android-XXX.jar y slf4j-android-1.5.8.jar en la ruta de compilación de su proyecto
4- Agregar MapView: puedes agregar un MapView a tu diseño xml
<org.osmdroid.views.MapView
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"
tilesource="Mapnik"
/>
O crea un MapView programáticamente:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
mResourceProxy = new ResourceProxyImpl(inflater.getContext().getApplicationContext());
mMapView = new MapView(inflater.getContext(), 256, mResourceProxy);
return mMapView;
}
No olvides agregar estos permisos a tu Manifiesto:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<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" />
Este es un buen proyecto de muestra . Espero eso ayude ;)
Importante
Como mencionó @Scai: recientemente, Open Street Map anunció que esta herramienta no es buena y tuvo algunos problemas:
Esta herramienta genera un gran tráfico para los servidores de mosaicos OSM y es probable que se bloquee. Por favor no lo uses.