在 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 无法做到这一点。它仅支持简单的形状:圆形或矩形。

我看到以下两个选项,如果你真的需要图标:

  1. 首选:尝试 ItemizedIconOverlay with OverlayItem 个实例。 OverlayItemMarker 更轻量级。 ItemizedIconOverlay class 在其构造函数中也有一个默认的标记(drawable)参数,所以你不需要为每个 OverlayItem 实例设置 drawable。
  2. 创建 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' 部分。)