Adding Overlay to OSMDROID

前端 未结 3 1147
难免孤独
难免孤独 2020-12-14 04:42

I have been struggling with this long time. I am trying to add Overlay on my map. I am using the open source OSMdroid. but all I get by the example is a straight red line fr

相关标签:
3条回答
  • 2020-12-14 05:16

    @rayman

    Please one more thing. When there is a change in the location the map does change but the Icon is gone. how do i validate the Icon into the new change? – rayman Jul 1 '11 at 7:12

    this is where your location changes

    public void onLocationChanged(Location location) {
        int lat = (int) (location.getLatitude() * 1E6);
        int lng = (int) (location.getLongitude() * 1E6);
        GeoPoint gpt = new GeoPoint(lat, lng);
        mapController.setCenter(gpt);
        mMapView.invalidate();
    }
    

    But as you can see it does not add new icon to the overlay.

    You should clear the previous items

    items.clear()
    

    (if you want the "old" icon to be removed when the new one is created) and then add the new point (gpt) to the items.

    items.add(new OverlayItem("Title", "Description", gpt));
    

    and so on...

    0 讨论(0)
  • 2020-12-14 05:20

    If you are trying to add an icon, then you want to look at the ItemizedOverlay classes. You can use osmdroid's ItemizedIconOverlay which is a concrete implementation of ItemizedOverlay, or you can subclass ItemizedOverlay on your own. Take a look at the samples, such as:

    http://code.google.com/p/osmdroid/source/browse/trunk/OpenStreetMapViewer/src/org/osmdroid/samples/SampleWithMinimapItemizedoverlay.java

    0 讨论(0)
  • 2020-12-14 05:25

    The jars versions 3.0.3 and 3.0.4 seem to have changed a bit since the sample code was written.

    If you are basing your app on the code as quoted in the previous answer, then change the line

    mResourceProxy = new ResourceProxyImpl(getApplicationContext());
    

    to

    mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
    

    This should at least get you going with a default icon.

    EDIT

    This should centre the map just NE of Liverpool and put an icon just off centre.

    package osmdemo.demo;
    
    import java.util.ArrayList;
    import org.osmdroid.DefaultResourceProxyImpl;
    import org.osmdroid.ResourceProxy;
    import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
    import org.osmdroid.util.GeoPoint;
    import org.osmdroid.views.MapController;
    import org.osmdroid.views.MapView;
    import org.osmdroid.views.overlay.ItemizedIconOverlay;
    import org.osmdroid.views.overlay.ItemizedOverlay;
    import org.osmdroid.views.overlay.OverlayItem;
    import org.osmdroid.views.util.constants.MapViewConstants;
    
    import android.app.Activity;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class DemoMap extends Activity implements LocationListener,
            MapViewConstants {
    
        private MapView mMapView;
        private MapController mapController;
        private LocationManager mLocMgr;
        private ItemizedOverlay<OverlayItem> mMyLocationOverlay;
        private ResourceProxy mResourceProxy;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
            setContentView(R.layout.copymain);
    
            mMapView = (MapView) this.findViewById(R.id.mapview);
            mMapView.setTileSource(TileSourceFactory.MAPNIK);
            mMapView.setBuiltInZoomControls(true);
            mMapView.setMultiTouchControls(true);
            mapController = this.mMapView.getController();
            mapController.setZoom(15);
            GeoPoint point2 = new GeoPoint(53554070, -2959520); // centre map here
            GeoPoint point3 = new GeoPoint(53554070 + 1000, -2959520 + 1000); // icon goes here
            mapController.setCenter(point2);
            mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
            mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 100,
                    this);
    
            ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
            // Put overlay icon a little way from map centre
            items.add(new OverlayItem("Here", "SampleDescription", point3));
    
            /* OnTapListener for the Markers, shows a simple Toast. */
            this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
                    new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                        @Override
                        public boolean onItemSingleTapUp(final int index,
                                final OverlayItem item) {
                            Toast.makeText(
                                    DemoMap.this,
                                    "Item '" + item.mTitle, Toast.LENGTH_LONG).show();
                            return true; // We 'handled' this event.
                        }
                        @Override
                        public boolean onItemLongPress(final int index,
                                final OverlayItem item) {
                            Toast.makeText(
                                    DemoMap.this, 
                                    "Item '" + item.mTitle ,Toast.LENGTH_LONG).show();
                            return false;
                        }
                    }, mResourceProxy);
            this.mMapView.getOverlays().add(this.mMyLocationOverlay);
            mMapView.invalidate();
        }
    
        public void onLocationChanged(Location location) {
            int lat = (int) (location.getLatitude() * 1E6);
            int lng = (int) (location.getLongitude() * 1E6);
            GeoPoint gpt = new GeoPoint(lat, lng);
            mapController.setCenter(gpt);
            mMapView.invalidate();
        }
    
        @Override
        public void onProviderDisabled(String arg0) {}
        @Override
        public void onProviderEnabled(String provider) {}
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    
    }
    

    It's a bit rough and ready, but at least it runs OK with just the 3.0.4 jar and the slf4j one. Hope it helps.

    EDIT 2

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="osmdemo.demo"
          android:versionCode="1"
          android:versionName="1.0">
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name="DemoMap"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
        </application>
        <uses-sdk android:minSdkVersion="3" />
    
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    </manifest> 
    

    .

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