我正在使用 OSMdroid 来实现 map 应用程序。
我已经实现了一个自定义 MapTileProvider,它使用允许缩放级别高达 22 的图 block 源。
默认的 MAPNIK 提供程序只允许缩放到 18 级。
问题是任何 PathOverlay 实例在缩放级别 19 之前都可以完美绘制,但是随后 在缩放级别 20-22 下未正确绘制。看起来有人用橡皮擦擦掉了超过 90% 的路径长度(见下面的屏幕截图)。
我已经完成了 PathOverlay 的 draw() 方法并且执行的事情似乎计算正确(对于 ZoomLevel 22,中间点看起来是正确的,然后 XY 投影除以 22-ZoomLevel获取当前屏幕坐标)。
谁能提供一些关于问题是什么以及如何解决的见解?
如果我使用 Cloudmade 小图 block 调用 MapView,也会发生同样的事情,它允许放大到 20 级并且是一个“内置”osmDroid 图 block 提供程序类。
//mMapTileProvider = new HighResMapTileProvider(this);
mMapTileProvider = new MapTileProviderBasic(this,TileSourceFactory.CLOUDMADESMALLTILES);
mMapView = new MapView(this, 256, mResourceProxy,mMapTileProvider);
所以问题似乎不在于图 block 源或提供者,而在于 Canvas 绘制方法。关于如何解决这个问题的任何想法?
在 zoomLevel 19 时,我可以清楚地看到我的路径:
但这是下一个缩放级别的相同路径:
最佳答案
我找到了解决方法。这并不理想,但确实有效。
首先,如果我添加一个 canvas.drawCircle(screenPoint1.x, screenPoint1.y, 5, cpaint);
我看到了 PathOverlay 的 draw() 方法,所以我知道坐标至少计算正确。
所以问题似乎与Android中底层的画线方法有关。
经过反复试验,我发现将 PathOverlay 的 Paint 对象的 STROKE WIDTH 设置为 0.0 可以解决问题,但线条显然只有 1 个像素宽。
在 PathOverlay.draw() 中添加对当前缩放级别的检查以设置描边宽度将保持级别 <20 的当前行为并为更高的缩放级别绘制细线路径。
我注意到的其他一些事情:
- 圆圈在缩放级别 21 和 22 时变成正方形。这强烈表明在将非常大的 (x,y) 坐标传递给 Path.lineTo/canvas.drawCircle 等时存在一些浮点精度问题,例如mPath.lineTo(131000001,38000001)
- 设置笔划宽度,5 类可以达到缩放级别 21,但同样的问题再次出现在级别 22
关于android - OSMDroid PathOverlay 绘图在高缩放级别时损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9273561/