我已经使用osmdroid在我的Android应用程序中插入了一张地图,在该地图上我布置了约1万个引脚。我希望每个图钉都有一个图标(所有图钉都使用相同的图标)。我知道如何对带有Marker类的单个图标执行此操作。
我正在使用SimpleFastPointOverlay来优化在地图上绘制如此多的图钉。我不知道如何将图标设置为点的主题。
相关代码:
// wrap points in a theme
SimplePointTheme pointThm = new SimplePointTheme(points, true);
// >>>>>> THIS I WANT TO REPLACE WITH AN ICON
Paint textStyle = new Paint();
textStyle.setStyle(Paint.Style.FILL);
textStyle.setColor(Color.parseColor("#0000ff"));
textStyle.setTextAlign(Paint.Align.CENTER);
textStyle.setTextSize(24);
SimpleFastPointOverlayOptions opts = SimpleFastPointOverlayOptions.getDefaultStyle()
.setAlgorithm(SimpleFastPointOverlayOptions.RenderingAlgorithm.MEDIUM_OPTIMIZATION)
.setRadius(7).setIsClickable(true).setCellSize(15).setTextStyle(textStyle);
// create the overlay with the theme
final SimpleFastPointOverlay fastOverlay = new SimpleFastPointOverlay(pointThm, opts);
mapView.getOverlays().add(fastOverlay);
如何设置图标?
答案 0 :(得分:1)
不幸的是,SimpleFastPointOverlay无法做到这一点。它仅支持简单的形状:圆形或矩形。
如果您确实需要图标,我会看到以下两个选项:
OverlayItem
比Marker
更轻便。 ItemizedIconOverlay
类在其构造函数中还具有默认标记(可绘制)参数,因此您无需为每个OverlayItem
实例设置可绘制。SimpleFastPointOverlay
类的自定义子类,并覆盖其drawPointAt
方法,并根据需要实现呈现。记住要尽量减少分配,以保持良好的性能。请记住,这是尝试使类弯曲以具有除预期行为以外的行为。正确实施比较困难,而且会有副作用,例如注释中显示了点击处理中断。答案 1 :(得分:0)
根据Josef Adamcik的回答,我将SimpleFastPointOverlay细分为子类。这适用于显示图标。该类的实现:
public class PPSimpleFastPointOverlayActivity extends SimpleFastPointOverlay {
public PPSimpleFastPointOverlayActivity(PointAdapter pointList, SimpleFastPointOverlayOptions style) {
super(pointList, style);
}
public PPSimpleFastPointOverlayActivity(PointAdapter pointList) {
super(pointList);
}
protected void drawPointAt(Canvas canvas, float x, float y, boolean showLabel, String label, Paint pointStyle, Paint textStyle){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inSampleSize = 1;
Bitmap bitmap = BitmapFactory.decodeResource(PPSession.getContainerContext().getResources(), R.drawable.logo_small, opt);
canvas.drawBitmap(bitmap, x, y, pointStyle);
}
}
答案 2 :(得分:0)
我在数据库中有15000个项目,并且仅将那些作为ItemizedIconOverlay当前可见的项目读入后台任务(AsyncTask)中的folderOverlay中。后台加载完成后,将FolderOverlay添加到地图中(并且删除了上一个文件夹的叠加层),后台加载大约需要1.5秒
相关标记如下:
// SELECT poi.lat, poi.lon, poi.id, poi.name FROM poi
// WHERE poi.lat >= {latMin} AND poi.lat <= {latMax}
// AND poi.lon >= {lonMin} AND poi.lon <= {lonMax}
// AND {zoom} >= poi.zoomMin AND {zoom} <= poi.zoomMax
这是它的AsyncTaskDemoFragment演示 https://github.com/osmdroid/osmdroid/pull/406/commits/47be1608d737e43cc056ab099574114885cc8e05#diff-9054da2bf477910ac6c3388bf40d44f3
不幸的是,它已从osmdroid来源中删除。
另请参阅:osmdroid/issues/182: Performance Issue with a lot of Overlays
答案 3 :(得分:0)
这不是整个问题的答案。
但是“1. 图标仅在地图上点击/点击后才会显示在地图上。”的答案。
我认为你没有调用“mapView.invalidate()”
我遇到了同样的问题...
不过是在OSMDroid官方文档里写的....哈哈..
https://github.com/osmdroid/osmdroid/wiki/Markers,-Lines-and-Polygons-(Java)
(查看底部的“提示”部分。)