我正在使用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,我可以很好地看到我的路径:
但是下一个缩放级别的路径是相同的:
答案 0 :(得分:2)
我找到了解决方法。它并不理想,但确实有效。
首先,如果我添加一个 canvas.drawCircle(screenPoint1.x,screenPoint1.y,5,cpaint);
到PathOverlay的draw()方法我看到了这一点,所以我知道坐标至少是正确计算的。
所以问题似乎与Android中的基础线条绘制方法有关。
经过一些反复试验后,我发现将PathOverlay的Paint对象的STROKE WIDTH设置为0.0可以解决问题,但这条线显然只有1个像素宽。
在PathOverlay.draw()中添加对当前缩放级别的检查以设置笔触宽度将保持级别<20的当前行为并为更高的缩放级别绘制细线路径。
我注意到的其他一些事情:
答案 1 :(得分:1)
我很确定这是因为默认的PathOverlay只绘制视图中各点之间的直线。如果该点位于当前视图之外,则线段不会被绘制。在较低的缩放级别,您只是看不到视线外的线条没有显示,因为所有部分都很小。
我认为你有两种选择。
容易但可能不是最好的是将更多的点放入路径,然后至少问题将不那么明显。如果这是一个好主意,将取决于您已经拥有多少积分。
核心解决方案是扩展类并执行自己的绘制方法,然后将视图中的线段segmet剪切到视图边缘。理想情况下,您可以将代码贡献给源代码。
答案 2 :(得分:1)
更新:这已在osmdroid 3.0.9中修复。
原始答案:
此问题似乎植根于Android。我相信这是由于在将视图滚动到较大偏移时发生的舍入错误(可能是由于使用了SKScalar)。可以通过创建带有活动和视图的新Android项目来隔离此错误:
canvas.drawCircle(screenCenterX, screenCenterY, 100, mPaint)
mainView.scrollTo(536870912, 536870912)
canvas.drawCircle(newScreenCenterX, newScreenCenterY, 100, mPaint)
第一个圆圈绘制正常,第二个圆圈绘制扭曲。有关进一步的证据,请尝试在0纬度/ 0长度附近绘制路径并放大 - 注意失真不再出现。
我将使用一些可能的解决方案解决方法来更新osmdroid票证。
答案 3 :(得分:0)
我遇到同样的问题,我在OSMDroid上发布了一个错误:
我不确定这是OSMDroid的问题,还是只是画布太大的问题。
其他解决方法是绘制一个新的较小的画布(当前可见mapView的大小),并在大画布的左上角使用drawBitmap。请记住,不要每次绘制都创建新的位图 - 因为它很昂贵。
所有形状都画得非常精细,但我在其他问题上挣扎而不是平滑的平移水平&gt; 18.您可以看到,当您平移地图时,它不会移动每个像素,因为它处于水平&lt; 18,但它跳过几个像素。
答案 4 :(得分:0)
我同意这是与OSMDROID相关的错误,因为我使用Google MapView获得了相同的工作DrawPath功能(Zoom level 21&amp; 22)。我希望他们能够解决这个问题。
答案 5 :(得分:-2)
要解决这个问题,我们需要实现线裁剪算法。 通过使用地图视口剪切,路径将添加更多顶点。 因此,它将在大缩放级别下正确绘制。