android – 添加Overlay到OSMDROID

android – 添加Overlay到OSMDROID,第1张

概述我一直在努力这么长时间. 我试图在我的地图上添加Overlay. 我使用的是开源OSMdroid.但我所得到的一切都是从一个角落到另一个角落的直线红线. 我的目标是添加一些我的geoPoint设置的图标. 这是我的代码: package osmdemo.demo;import java.util.List;import microsoft.mappoint.TileSystem;imp 我一直在努力这么长时间.
我试图在我的地图上添加Overlay.
我使用的是开源OSMdroID.但我所得到的一切都是从一个角落到另一个角落的直线红线.
我的目标是添加一些我的geoPoint设置的图标.

这是我的代码:

package osmdemo.demo;import java.util.List;import microsoft.mappoint.TileSystem;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.MapVIEw.Projection;import org.osmdroID.vIEws.overlay.Overlay;import org.osmdroID.vIEws.overlay.ScalebarOverlay;import org.osmdroID.vIEws.util.constants.MapVIEwConstants;import androID.app.Activity;import androID.content.Context;import androID.graphics.Canvas;import androID.graphics.color;import androID.graphics.Paint;import androID.graphics.Paint.Style;import androID.graphics.Rect;import androID.location.LocationManager;import androID.os.Bundle;public class map extends Activity implements MapVIEwConstants{    /** Called when the activity is first created. */    protected static final String PROVIDER_name = LocationManager.GPS_PROVIDER;    MapController mapController;    MapVIEw mapVIEw;    ScalebarOverlay mScalebarOverlay;    private MapOverlay mmapOverlay = null;    private LocationManager mLocMgr;    @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);        mapVIEw.setMultitouchControls(true);        mapController = mapVIEw.getController();        mapController.setZoom(20);        GeoPoint point2 = new GeoPoint(31.987968,34.783069);        mapController.setCenter(point2);        this.mmapOverlay = new MapOverlay(this);        List<Overlay> listofOverlays = mapVIEw.getoverlays();        listofOverlays.add(mmapOverlay);        mapVIEw.invalIDate();    }    public class MapOverlay extends org.osmdroID.vIEws.overlay.Overlay    {        public MapOverlay(Context ctx)        {            super(ctx);            // Todo auto-generated constructor stub        }        @OverrIDe        protected voID draw(Canvas pC,MapVIEw pOsmv,boolean shadow)        {            if (shadow)                return;            Paint lp3;            lp3 = new Paint();            lp3.setcolor(color.RED);            lp3.setAntiAlias(true);            lp3.setStyle(Style.stroke);            lp3.setstrokeWIDth(1);            lp3.setTextAlign(Paint.Align.left);            lp3.setTextSize(12);            // Calculate the half-world size            final Rect vIEwportRect = new Rect();            final Projection projection = pOsmv.getProjection();            final int zoomLevel = projection.getZoomLevel();            int mWorldSize_2 = TileSystem.MapSize(zoomLevel) / 2;            // Save the Mercator coordinates of what is on the screen            vIEwportRect.set(projection.getScreenRect());            // DON'T set offset with either of below            // vIEwportRect.offset(-mWorldSize_2,-mWorldSize_2);            // vIEwportRect.offset(mWorldSize_2,mWorldSize_2);            // Draw a line from one corner to the other            pC.drawline(vIEwportRect.left,vIEwportRect.top,vIEwportRect.right,vIEwportRect.bottom,lp3);        }        public voID onProvIDerDisabled(String arg0)        {        }        public voID onProvIDerEnabled(String provIDer)        {        }    }}

这是我的清单:

<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID"    package="com.test.overlay" androID:versionCode="1" androID:versionname="1.0">    <uses-sdk androID:minSdkVersion="3" />    <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" />    <application >        <activity androID:name=".OverlayDemo" 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></manifest>

提前致谢,

射线.

解决方法 自从编写示例代码以来,jar版本3.0.3和3.0.4似乎有所改变.

如果您将应用程序基于上一个答案中引用的代码,那么更改该行

mResourceProxy = new ResourceProxyImpl(getApplicationContext());

mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());

这应该至少让你有一个默认图标.

编辑

这应该使地图中心位于利物浦的NE,并将图标放在中心位置.

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,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) {}}

它有点粗糙和准备,但至少它运行正常,只有3.0.4的jar和slf4j一个.希望它有帮助.

编辑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>

.

总结

以上是内存溢出为你收集整理的android – 添加Overlay到OSMDROID全部内容,希望文章能够帮你解决android – 添加Overlay到OSMDROID所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1133177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存