我试图在我的地图上添加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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)