2011-03-16 28 views
14

Estoy intentando crear una aplicación que utiliza mapas sin conexión y mosaicos personalizados. Para esto he decidido usar OSMDroid y he incluido el jar dentro de mi proyecto. Crearé mis mosaicos personalizados usando MOBAC.OSMDroid ejemplo simple requerido

Se me ha dirigido a estos ejemplos: http://code.google.com/p/osmdroid/source/browse/#svn%2Ftrunk%2FOpenStreetMapViewer%2Fsrc%2Forg%2Fosmdroid%2Fsamples

pero estoy luchando para seguir a ellos como yo soy nuevo en Java y Android.

He creado un archivo de clase denominado test (que he creado siguiendo un ejemplo!):

public class test extends Activity { 
/** Called when the activity is first created. */ 

protected static final String PROVIDER_NAME = LocationManager.GPS_PROVIDER; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    MapView map = (MapView) findViewById(R.id.map); 
    map.setTileSource(TileSourceFactory.MAPQUESTOSM); 

    map.setBuiltInZoomControls(true); 
    map.setMultiTouchControls(true); 
    map.getController().setZoom(16); 
    map.getController().setCenter(new GeoPoint(30266000, -97739000)); 

} 

}

con un archivo de diseño:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <org.osmdroid.views.MapView android:id="@+id/map" 
     android:layout_width="fill_parent" android:layout_height="fill_parent" 
     tilesource="MapquestOSM" android:layout_weight="1" /> 
</LinearLayout> 

cuando corro esto no veo ningún mapa, solo una cuadrícula vacía. Creo que esto se debe a mi fuente de datos, pero no estoy seguro de a qué tengo que cambiarlo.

ACTUALIZACIÓN: También tengo el siguiente en mi archivo de 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" /> 

¿Alguien puede ayudar?

Bex

Solución Asegúrese de que la posición de los permisos está en el lugar correcto en el manifiesto!

+0

¿Puedo preguntarle algo @Bex, .... es esto usted consigue el mapa fuera de línea quiero decir, realmente sin Android ¿conectado a internet? – gumuruh

+0

@gumuruh Esta es una publicación muy antigua, pero sí, el mapa estaba realmente fuera de línea (una vez que se descargó inicialmente). Sin embargo, sospecho que hay una nueva forma de hacer las cosas ahora. – Bex

+0

veo entonces, muchas gracias @Bex, ... pero desafortunadamente la forma más nueva es usar otro SDK que se llama nutiteq pero terminé sin éxito para la parte fuera de línea. – gumuruh

Respuesta

10

Ésta funcionó para mí:

setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE); 

al igual que:

setTileSource(TileSourceFactory.MAPNIK); 

yo no necesitan tener nada en el XML

Se va a volver a ser ahora, Tuve que agregar uno de estos:

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

al manifest.xml.

No recuerdo cuál fue necesario, pero si coloca las 3, debería funcionar.

Bueno aquí está toda mi fuente, que acabo de correr en el emulador:

package com.nbt.osmdroidtest; 

import org.osmdroid.tileprovider.tilesource.TileSourceFactory; 
import org.osmdroid.util.GeoPoint; 
import org.osmdroid.views.MapController; 
import org.osmdroid.views.MapView; 
import android.app.Activity; 
import android.os.Bundle; 

public class OsmDroidTest extends Activity { 
    /** Called when the activity is first created. */ 
    private MapController mapController; 
    private MapView mapView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mapView = (MapView) findViewById(R.id.mapview); 
     mapView.setTileSource(TileSourceFactory.MAPNIK); 
     mapView.setBuiltInZoomControls(true); 
     mapController = mapView.getController(); 
     mapController.setZoom(15); 
     GeoPoint point2 = new GeoPoint(51496994, -134733); 
     mapController.setCenter(point2); 
    } 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 
} 

darle un minuto más o menos a la carga, como en un principio podría ser bastante lento en la construcción de una memoria caché. Esas coordenadas deberían ponerlo en el centro de Londres. Si todavía tiene problemas, vea si hay algo iluminador en el logcat.

Y el main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<org.osmdroid.views.MapView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mapview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" 

/> 
</LinearLayout> 
+0

@NickT gracias por la respuesta! ¡He intentado ambos pero con el mismo resultado! Definitivamente me falta algo. ¿Alguna idea? – Bex

+0

He editado la respuesta con la probable solución – NickT

+0

@NickT .. eso es algo que la documentación fue muy clara acerca de agregar al manifiesto. http://code.google.com/p/osmdroid/wiki/HowToUseJar ¡así que de nuevo no es el problema! :( – Bex

0

pienso de mirar a otras muestras, que se olvida de permisos. , a menos que el mapa ya esté almacenado en la memoria caché de su dispositivo, definitivamente necesita acceder a INTERNET. tratar este conjunto:

buena suerte

+1

lea la pregunta – Bex

1
final MapView mapView = new MapView(this, 256); 

    mapView.setBuiltInZoomControls(true);//显示缩放按钮 //display the zoom button 
    mapView.setMultiTouchControls(true);//开启多点触控 //turn on the multiple touch feature 
    mapView.getController().setZoom(13); 


    mapView.setTileSource(TileSourceFactory.MAPQUESTOSM); 
    mapView.getController().setCenter(new GeoPoint(39.9,116.3));//设置中心点 //set the center 
    //定位当前位置 // locate to current position 
    myLocationOverlay = new MyLocationOverlay(getApplicationContext(), mapView); 
    mapView.getOverlays().add(myLocationOverlay); 
    myLocationOverlay.enableCompass(); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableFollowLocation(); 
+2

Debe traducir su comentario al inglés. –

+0

Además, si pudiera agregar una declaración de bried sobre cómo su código aborda el problema, sería bueno. La línea superior de tu código también está fuera del bloque de código. – Ren

+0

@zhengfazhen ..... es un programador chino – gumuruh

0

** Tenga en cuenta que si se dirigen a los dispositivos Android> = 6.0 (SDK> = 23), usted tiene que comprobar si hay permisos "peligrosos" en tiempo de ejecución. Los permisos peligrosos que necesita osmdroid son: WRITE_EXTERNAL_STORAGE y ACCESS_COARSE_LOCATION/ACCESS_FINE_LOCATION. Consulte este implementation

toma de: "Cómo utilizar la biblioteca osmdroid" - link

0

He integrado el mapa de OSM en mi solicitud. clase A raíz se utiliza actividad 1.OSMMap 2.OSMMap ItemizedOverlay Tres frasco tiene que copiar en la carpeta de la liberación del Proyecto-> App-> lib OSMBonusPack-v5.8.1-sources (1) .jar osmdroid-Android- 4.3.jar slf4j-android-1.5.8.jar 1.OSMmap Actividad

public class OSMMap extends Activity 
    { 
    MapView mapView; 
    MapController mapController; 
    private double latitude; 
    private double longitude; 
    String date,time,vname; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_osmmap2); 

     //Coming Parameter is from vehicleinfo activity 
     Intent intent=getIntent(); 
     Bundle bundle=intent.getExtras(); 
     latitude = Double.parseDouble(bundle.getString("lat")); 
     Log.i("CPA","In the OSM map method"+latitude); 
     longitude = Double.parseDouble(bundle.getString("lng")); 
     Log.i("CPA","In the OSM map method"+longitude); 
     date = bundle.getString("date"); 
     Log.i("CPA","In the OSM map method"+date); 
     time = bundle.getString("time"); 
     Log.i("CPA","In the OSM map method"+time); 
     vname = bundle.getString("vname"); 
     Log.i("CPA","In the OSM map method"+vname); 
     mapView= (MapView) findViewById(R.id.mapview); 
     mapView.setTileSource(TileSourceFactory.MAPNIK); 
//  mapView.setTileSource(TileSourceFactory.BASE_OVERLAY_NL); 

//  mapView.setTileSource(TileSourceFactory.CYCLEMAP); 
//  mapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE); 
//  mapView.setTileSource(TileSourceFactory.BASE); 
//  mapView.setTileSource(TileSourceFactory.MAPQUESTOSM); 
//  mapView.setTileSource(TileSourceFactory.MAPQUESTAERIAL); 
     mapView.setBuiltInZoomControls(true); 
     mapView.setMultiTouchControls(true); 
     mapController= (MapController) mapView.getController(); 
     Log.i("CPA","In the map view"+mapView); 

//  GeoPoint geoPoint=new GeoPoint(40.712784,-74.005941); 
     GeoPoint geoPoint=new GeoPoint(latitude,longitude); 
     Log.i("CPA","In the OSM map method"+latitude); 
     Log.i("CPA","In the OSM map method"+longitude); 
     mapController.setZoom(8); 
     mapController.animateTo(geoPoint); 
     Log.i("CPA","In the OSM map method"+geoPoint); 
     Log.i("CPA","In the OSsM map method"); 

     List<Overlay> mapOverlays = mapView.getOverlays(); 
     Drawable drawable = this.getResources().getDrawable(R.drawable.blue_marker); 

     OSMDemo itemizedoverlay = new OSMDemo(drawable,this); 
     itemizedoverlay.setEnabled(true); 

     OverlayItem overlayItem=new OverlayItem("Vehicle"+time,"VEHICLE NO"+date,geoPoint); 
     mapView.getController().setZoom(18); 
     mapView.getController().setCenter(geoPoint); 

     itemizedoverlay.addOverlay(overlayItem); 
     mapOverlays.add(itemizedoverlay); 
     mapView.getOverlays().add(itemizedoverlay); 
     mapView.setMultiTouchControls(true); 

    } 

} 

2.OSM ItemizedOverlay

public class OSMDemo extends ItemizedOverlay<OverlayItem> 
{ 

    static ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
    private Context mContext; 

    public OSMDemo(Drawable pDefaultMarker, Context context) 
    { 

     super(pDefaultMarker,new DefaultResourceProxyImpl(context)); 
     mContext=context; 

    } 

    public void addOverlay(OverlayItem overlay) 
    { 
     mOverlays.add(overlay); 
     populate(); 

    } 

    @Override 
    protected OverlayItem createItem(int i) 
    { 
     return mOverlays.get(0); 

    } 
    @Override 
    public int size() 
    { 
     return mOverlays.size(); 
    } 
    @Override 
    public boolean onSnapToItem(int i, int i1, Point point, IMapView iMapView) 
    { 


     return false; 
    } 

    public boolean ontap(int index) 
    { 

     Log.i("CPA","In the OSMDEMO ONTAP"); 
     OverlayItem item = mOverlays.get(index); 
     AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); 
     dialog.setTitle(item.getTitle()); 
     dialog.setMessage(item.getSnippet()); 
     dialog.show(); 
     return true; 

    } 
}