1

我正在使用 OSMdroid 来实现映射应用程序。

我已经实现了一个自定义 MapTileProvider,它使用允许缩放级别高达 22 的平铺源。

默认的 MAPNIK 提供程序仅允许缩放到 18 级。

问题是任何 PathOverlay 实例在缩放级别 19 之前都可以完美绘制,但在缩放级别 20-22 时无法正确绘制。看起来有人用橡皮擦擦掉了路径长度的 90% 以上(见下面的屏幕截图)。

我已经逐步完成了 PathOverlay 的 draw() 方法,并且 exerything似乎计算正确(对于 ZoomLevel 22,中间点显示正确,然后 XY 投影除以 22-ZoomLevel 以获得当前屏幕坐标)。

谁能提供一些关于问题是什么以及如何解决的见解?

如果我使用 Cloudmade 小图块调用 MapView,也会发生同样的事情,它允许放大到 20 级并且是“内置”osmDroid 图块提供程序类。

    //mMapTileProvider = new HighResMapTileProvider(this);
    mMapTileProvider = new MapTileProviderBasic(this,TileSourceFactory.CLOUDMADESMALLTILES);
    mMapView = new MapView(this, 256, mResourceProxy,mMapTileProvider);

因此,问题似乎不在于 tile 源或提供程序,而在于 canvas 绘图方法。关于如何解决这个问题的任何想法?

在 zoomLevel 19 我可以很好地看到我的路径: 缩放级别 19

但这是下一个缩放级别的相同路径: 在此处输入图像描述

4

6 回答 6

2

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

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

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

缩放级别 20

所以问题似乎与Android中底层的line draw方法有关。

经过反复试验,我发现将 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 级
于 2012-02-15T04:22:02.390 回答
1

我相当确定这是因为默认的 PathOverlay 仅在视图中的点之间绘制线。如果该点位于当前视图之外,则不绘制线段。在较低的缩放级别下,您只是看不到偏离视图的线的位没有显示,因为所有部分都很小。

我认为你有两个选择。

简单但可能不是最好的方法是将更多点放入路径中,那么至少问题不会那么明显。这是否是一个好主意将取决于你已经有多少分。

正确的解决方案是扩展类并执行您自己的绘制方法,然后将离开视图的线段剪辑到视图边缘。理想情况下,您会将您的代码贡献回源代码。

于 2012-02-14T14:54:22.450 回答
1

更新:这已在 osmdroid 3.0.9 中修复。

原始答案:
这个问题似乎植根于Android。我相信这是由于将视图滚动到较大偏移量时发生的舍入误差(可能是由于使用了 SKScalar)。可以通过创建一个带有活动和视图的新 android 项目来隔离此错误:

  1. 从原点的视图开始,还没有滚动偏移。
  2. 在画布上画一个圆圈:canvas.drawCircle(screenCenterX, screenCenterY, 100, mPaint)
  3. 将视图滚动到一个大数字:mainView.scrollTo(536870912, 536870912)
  4. 在画布上画一个圆圈:canvas.drawCircle(newScreenCenterX, newScreenCenterY, 100, mPaint)

第一个圆圈画得很好,第二个画得扭曲了。如需进一步的证据,请尝试在 0 lat/0 long 附近绘制路径并放大 - 注意不再出现失真。

我将使用一些可能的解决方案变通方法来更新 osmdroid 票证。

于 2012-07-02T20:26:28.667 回答
0

我有同样的问题,我在这里发布了一个关于 OSMDroid 的错误:

http://code.google.com/p/osmdroid/issues/detail?can=2&start=0&num=100&q=221&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=&id=221

我不确定这是 OSMDroid 的问题还是只是画布太大的问题。

其他解决方法是在一个新的、较小的画布上绘制(当前可见 mapView 的大小)并在大画布的左上角使用 drawBitmap。请记住不要每次绘制都创建新的位图 - 因为它很昂贵。

所有形状都绘制得非常好,但我正在努力解决在级别 > 18 中平移不平滑的其他问题。您可以看到,当您平移地图时,它并没有像在级别 < 18 中那样移动每个像素,而是跳过了几个像素.

于 2012-02-21T13:15:35.627 回答
0

我同意这是与 OSMDROID 相关的错误,因为我使用 Google MapView 获得了相同的 DrawPath 功能(缩放级别 21 和 22)。我希望他们能够解决这个问题。

于 2012-03-02T01:27:10.633 回答
-2

为了解决这个问题,我们需要实现线裁剪算法。通过使用地图视口进行裁剪,路径会添加更多顶点。因此它将在大缩放级别正确绘制。

于 2013-08-09T11:50:56.903 回答