OSMDroid simple example required

前端 未结 6 911
我在风中等你
我在风中等你 2020-12-24 15:15

I am trying to create an app that uses offline maps and custom tiles. For this I have decided to use OSMDroid and have included the jar within my project. I will create my c

相关标签:
6条回答
  • 2020-12-24 15:40
        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();
    
    0 讨论(0)
  • 2020-12-24 15:40

    **Note that if you are targeting Android devices >= 6.0 (SDK >= 23), you have to check for "dangerous" permissions at runtime. Dangerous permissions needed by osmdroid are: WRITE_EXTERNAL_STORAGE and ACCESS_COARSE_LOCATION/ACCESS_FINE_LOCATION. Refer to this implementation

    take from: "How to use the osmdroid library" - link

    0 讨论(0)
  • 2020-12-24 15:45

    This one worked for me:

    setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);   
    

    as did:

    setTileSource(TileSourceFactory.MAPNIK);
    

    I didn't need to have anything in the the XML

    It's coming back to be now, I had to add one of these:

    <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"/>
    

    to the manifest.xml.

    I can't remember which one was necessary but if you put all 3 in, it should work.

    Well here's my entire source, which I've just run on the emulator:

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

    Give it a minute or so to load, as initially it might be quite slow in building up a cache. Those coordinates should put you over central London. If you still have problems see if there is anything illuminating in the logcat.

    And the 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 讨论(0)
  • 2020-12-24 15:49

    I have integrated the OSM map in my application. Following class is used 1.OSMMap activity 2.OSMMap ItemizedOverlay Three jar has to copy into lib folder of Project->App->lib OSMBonusPack-v5.8.1-sources(1).jar osmdroid-android-4.3.jar slf4j-android-1.5.8.jar 1.OSMmap Activity

     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;
    
        }
    }
    
    0 讨论(0)
  • 2020-12-24 15:50

    I think from looking at other samples, that you miss permissions. unless the map is already cached on your device, you definitely need to access INTERNET. try this set:

    <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" />
    

    good luck

    0 讨论(0)
  • 2020-12-24 16:05

    To avoid the crash bubbly had, you need to add osmdroid-android.jar and slf4j-android.jar to libs in your project. See Simple osmdroid application doesn't work for more details

    0 讨论(0)
提交回复
热议问题