首页 > 解决方案 > 使用 OSMDroid Tilesource 在本地绘制瓷砖

问题描述

你如何自定义绘制(在运行时)OSMDroid 瓦片。我正在尝试根据数据在设备本身上生成(简单)天气叠加层。虽然覆盖就足够了,而且我理解 MapsForge 可能是生成矢量图块的一种可能性,但我试图绘制的数据非常简单,我认为它可能是矫枉过正?

我试图实现一个通用的 BitmapTileSourceBase 并覆盖 getDrawable() 方法以返回一个位图,但这似乎没有被触发并以空白图块结束。

public class DrawnTiles extends BitmapTileSourceBase {
public DrawnTiles(String aName) {
    super(aName, 1, 6, 256, ".png");
}

@Override
public synchronized  Drawable getDrawable(final String aFilePath) {
    //Make the bad tile easy to spot
    Bitmap bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.RGB_565);
    bitmap.eraseColor(Color.YELLOW);

    return new BitmapDrawable(bitmap);
}
}

感谢任何建议或首选解决方案。最终的瓦片将根据其边界绘制,因此访问此方法的方法将是理想的。不必担心缓存,因为数据会相当频繁地更改。

标签: osmdroid

解决方案


虽然不是对原始问题的直接回答,但以下确实解决了我的问题并可能解决其他问题。

全局解决方案可能需要生成图块,但是 OSMDroid 自定义叠加似乎确实满足了我的要求。用于在像素和纬度/经度之间转换的支持函数。

public class CustomOverlay extends org.osmdroid.views.overlay.Overlay {
    @Override
    public void draw(Canvas canvas, MapView map, boolean shadow) {
        if (!isEnabled()) return;
        if (shadow) {
            //draw a shadow if needed, otherwise return
            return;
        }

        /*
        This will go from pixel x,y to lat/lon
        GeoPoint iGeoPoint = (GeoPoint) projection.fromPixels(x,y);

        This will go from lat/lon to pixel x,y
        projection.toPixels(geoPoint, pt);

        To project pixels should give you the canvas coordinates
        projection.toProjectedPixels(...)
         */

        final Projection pj = map.getProjection();
        canvas.save();
        Paint paint = new Paint();
        canvas.drawCircle(pj.getScreenCenterX(),pj.getScreenCenterY(),40,paint);
        canvas.restore();
}

推荐阅读