在OSMDROID中的快速叠加层上设置图标

时间:2018-08-04 20:36:01

标签: android overlay android-mapview osmdroid

我已经使用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);

如何设置图标?

4 个答案:

答案 0 :(得分:1)

不幸的是,SimpleFastPointOverlay无法做到这一点。它仅支持简单的形状:圆形或矩形。

如果您确实需要图标,我会看到以下两个选项:

  1. 首选:尝试将ItemizedIconOverlayOverlayItem实例一起使用。 OverlayItemMarker更轻便。 ItemizedIconOverlay类在其构造函数中还具有默认标记(可绘制)参数,因此您无需为每个OverlayItem实例设置可绘制。
  2. 创建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)

(查看底部的“提示”部分。)