在 OSMDROID 中的快速覆盖上设置图标
set icon on a Fast Overlay in OSMDROID
我使用 osmdroid 在我的 android 应用程序中插入了一张地图,我在上面布置了大约 10K 个图钉。我希望每个图钉都有一个图标(所有图钉都使用相同的图标)。我知道如何使用标记 class.
对单个图标执行此操作
我正在使用 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);
如何设置图标?
不幸的是,SimpleFastPointOverlay 无法做到这一点。它仅支持简单的形状:圆形或矩形。
我看到以下两个选项,如果你真的需要图标:
- 首选:尝试 ItemizedIconOverlay with OverlayItem 个实例。
OverlayItem
比 Marker
更轻量级。 ItemizedIconOverlay
class 在其构造函数中也有一个默认的标记(drawable)参数,所以你不需要为每个 OverlayItem
实例设置 drawable。
- 创建
SimpleFastPointOverlay
class 的自定义子 class 并覆盖其 drawPointAt
方法并根据需要实现渲染。请记住最小化分配以保持良好的性能。请记住,这是试图改变 class 以产生非预期行为。很难正确实施并且会产生副作用,例如损坏的点击处理,如评论中所示。
根据 Josef Adamcik 的回答,我子class编辑了 SimpleFastPointOverlay。这适用于显示图标。 class 实现:
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);
}
}
我在数据库中有 15 000 个项目,并且只将那些当前可见的项目读入后台任务 (AsyncTask) 中的 folderOverlay 中的 ItemizedIconOverlay。后台加载完成后,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
这不是整个问题的答案。
但对“1. 图标仅在地图上的 tap/click 之后显示在地图上。”的答案。
我想你没有调用“mapView.invalidate()”
我遇到了同样的问题...
但是OSMDroid官方文档里写的....哈哈..
https://github.com/osmdroid/osmdroid/wiki/Markers,-Lines-and-Polygons-(Java)
(查看底部的 'Tips' 部分。)
我使用 osmdroid 在我的 android 应用程序中插入了一张地图,我在上面布置了大约 10K 个图钉。我希望每个图钉都有一个图标(所有图钉都使用相同的图标)。我知道如何使用标记 class.
对单个图标执行此操作我正在使用 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);
如何设置图标?
不幸的是,SimpleFastPointOverlay 无法做到这一点。它仅支持简单的形状:圆形或矩形。
我看到以下两个选项,如果你真的需要图标:
- 首选:尝试 ItemizedIconOverlay with OverlayItem 个实例。
OverlayItem
比Marker
更轻量级。ItemizedIconOverlay
class 在其构造函数中也有一个默认的标记(drawable)参数,所以你不需要为每个OverlayItem
实例设置 drawable。 - 创建
SimpleFastPointOverlay
class 的自定义子 class 并覆盖其drawPointAt
方法并根据需要实现渲染。请记住最小化分配以保持良好的性能。请记住,这是试图改变 class 以产生非预期行为。很难正确实施并且会产生副作用,例如损坏的点击处理,如评论中所示。
根据 Josef Adamcik 的回答,我子class编辑了 SimpleFastPointOverlay。这适用于显示图标。 class 实现:
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);
}
}
我在数据库中有 15 000 个项目,并且只将那些当前可见的项目读入后台任务 (AsyncTask) 中的 folderOverlay 中的 ItemizedIconOverlay。后台加载完成后,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
这不是整个问题的答案。
但对“1. 图标仅在地图上的 tap/click 之后显示在地图上。”的答案。
我想你没有调用“mapView.invalidate()”
我遇到了同样的问题...
但是OSMDroid官方文档里写的....哈哈..
https://github.com/osmdroid/osmdroid/wiki/Markers,-Lines-and-Polygons-(Java)
(查看底部的 'Tips' 部分。)