在我的问题的答案的大力帮助下,我之前设法使用 osmdroid-android-3.0.1.jar 将 OpenStreetMaps 合并到我的应用程序中
将 Google Maps 应用程序移植到 Osmdroid - 覆盖问题
我现在已经升级到使用 3.0.3 jar 并且无法显示我的叠加层。
我的应用程序可以将显示从 Google Maps 切换到 OSM,并在两者之上显示由线条和文本组成的相同叠加层。替代方案现在显示每个在自己的活动中运行,因为这些类相似但没有完全相同的方法,或者至少它们在 3.0.1 中没有。(最终我想使用 Osmdroid 包装 jar 将它们组合在一个活动中并减少重复代码,但这是以后的问题)现在我想获得与现在相同的功能使用新的 3.0.3 版本弃用了 3.0.1 jar。
使用新罐子,我仍然可以正常显示地图视图,但覆盖层已经消失。我不得不对代码进行一些更改,因为MapOverlay 扩展 org.osmdroid.views.overlay.Overlay类中的 3.0.1 onDraw() 方法现在已替换为 draw()(就像 Google 一样)。
之前的 onDraw()(现在是 draw)方法中的所有代码都从上面提到的问题的答案中逐字复制,它工作得很好,尽管我承认没有完全理解 worldsize、边界框和所描述的转换的概念.
我注意到该方法
final Point upperLeft = org.osmdroid.views.util.Mercator
.projectGeoPoint(boundingBox.getLatNorthE6(), boundingBox.getLonWestE6(),
zoomLevel + tileZoom, null);
现在已弃用,我不得不删除 tileZoom 和
final int tileZoom = projection.getTileMapZoom();
让它编译。
当我看到 draw() 方法中的代码时,我可以在调试器中看到绘制覆盖所需的所有数据仍然存在且正确。绘制是通过canvas.drawLine(....)和canvas.drawText(....)等线条完成的。我根本没有使用函数的额外参数(布尔阴影)。
我的 redrawOverlay() 方法仍然是:
private void redrawOverlay() {
mGpt = mMapVw.getMapCenter();
if (mmapOverlay == null)
mmapOverlay = new MapOverlay(this);
mmapOverlay.setEnabled(true);
List<Overlay> listOfOverlays = mMapVw.getOverlays();
int ovlSize = listOfOverlays.size();
if (ovlSize > 1)
listOfOverlays.remove(1);
listOfOverlays.add(mmapOverlay);
mMapVw.invalidate();
}
(Google listofOverlays.clear() 不应使用,因为 osmdroid 3.0.1 将元素 0 作为地图本身 - 因此 remove(1))
我想知道如何修改现有的 3.0.1 代码以使用 3.0.3?我希望其中一位作者可能会阅读这个问题。
更新
通过按照上述问题的答案中的建议过度调整 Minimap,用于从左上角到右下角绘制叠加层的 draw() 方法现在变为:
@Override
protected void draw(Canvas pC, MapView pOsmv, boolean shadow) {
if(shadow)
return;
Paint lp3;
lp3 = new Paint();
lp3.setColor(Color.RED);
lp3.setAntiAlias(true);
lp3.setStyle(Style.STROKE);
lp3.setStrokeWidth(1);
lp3.setTextAlign(Paint.Align.LEFT);
lp3.setTextSize(12);
// Calculate the half-world size
final Rect viewportRect = new Rect();
final Projection projection = pOsmv.getProjection();
final int zoomLevel = projection.getZoomLevel();
int mWorldSize_2 = TileSystem.MapSize(zoomLevel) / 2;
// Save the Mercator coordinates of what is on the screen
viewportRect.set(projection.getScreenRect());
// DON'T set offset with either of below
//viewportRect.offset(-mWorldSize_2, -mWorldSize_2);
//viewportRect.offset(mWorldSize_2, mWorldSize_2);
// Draw a line from one corner to the other
pC.drawLine(viewportRect.left, viewportRect.top, viewportRect.right, viewportRect.bottom, lp3);
}
这工作正常