android - OSMDroid PathOverlay 绘图在高缩放级别时损坏

标签 android canvas paint osmdroid stroke

我正在使用 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 时,我可以清楚地看到我的路径: ZoomLevel 19

但这是下一个缩放级别的相同路径: enter image description here

最佳答案

我找到了解决方法。这并不理想,但确实有效。

首先,如果我添加一个 canvas.drawCircle(screenPoint1.x, screenPoint1.y, 5, cpaint);

我看到了 PathOverlay 的 draw() 方法,所以我知道坐标至少计算正确。

Zoom Level 20

所以问题似乎与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/

相关文章:

android - 如何在键盘事件上打开选择输入模式

java - 如何从网页(标签内)的 HTML 页面源中提取数据?

javascript - Android 等效于 HTML5 Canvas CompositeOperation

javascript - Three.js:无法补间对象位置var(出现空错误),但对象本身实际上可用

java - 为什么我的 JApplet 最初显示为白色?

java - 用drawstring()写入一个变量

java - 为什么 Retrofit 不能用方括号正确编码查询字符串?

java - Sugar ORM 中的 count() 方法是否有任何理由采用 String[] 参数而不是 String...?

javascript - 拖放整个 Canvas 并显示 Canvas 的新区域

java - 在 JAVA GUI 中添加随机形状矩形、椭圆形和线条