为 OSMDROID 添加叠加层
我已经挣扎了这么长时间了。 我正在尝试在我的地图上添加叠加。 我正在使用开源 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>
提前致谢,
雷。
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 from one corner to another.
My target is to add some icon where my geoPoint is set.
here is my code:
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)
{
}
}
}
thats my Manifest:
<?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>
Thanks in advance,
ray.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您尝试添加图标,那么您需要查看 ItemizedOverlay 类。您可以使用 osmdroid 的 ItemizedIconOverlay,它是 ItemizedOverlay 的具体实现,或者您可以自己创建 ItemizedOverlay 的子类。查看示例,例如:
http://code.google.com/p/osmdroid/source/browse/trunk/OpenStreetMapViewer/src/org/osmdroid/samples/SampleWithMinimapItemizedoverlay.java
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
@雷曼
这是您的位置发生变化的地方
,但正如您所看到的,它不会向叠加层添加新图标。
您应该清除以前的项目
(如果您希望在创建新项目时删除“旧”图标),然后将新点 (gpt) 添加到项目中。
等等...
@rayman
this is where your location changes
But as you can see it does not add new icon to the overlay.
You should clear the previous items
(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.
and so on...
自示例代码编写以来,jar 版本 3.0.3 和 3.0.4 似乎发生了一些变化。
如果您的应用程序基于上一个答案中引用的代码,则将该行更改
为
“这至少应该让您使用默认图标”。
编辑
这应该将地图置于利物浦东北部的中心,并在偏离中心的位置放置一个图标。
它有点粗糙,但至少只用 3.0.4 jar 和 slf4j 就可以运行了。希望有帮助。
编辑2
。
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
to
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.
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
.