我以前设法使用osmdroid-android-3.0.1.jar将OpenStreetMaps整合到我的应用程序中,并在我的问题的答案的帮助下
Porting a Google Maps app to Osmdroid - problem with overlay
我现在已升级到使用3.0.3 jar并且无法显示我的叠加层。
我的应用可以将显示从Google地图切换到OSM,并在两者之上显示由线条和文字组成的相同叠加层。替代显示现在每个都在他们自己的活动中运行,因为类相似但没有完全相同的方法,或者至少它们在3.0.1中没有。 (最后我想使用Osmdroid包装器jar将它们组合在一个活动中并减少重复的代码,但这是一个以后的问题)现在我想获得与现在相同的功能使用新的3.0.3版本弃用了3.0.1 jar。
使用新jar,我仍然可以显示mapview,但叠加层已消失。我必须对代码进行一些更改,因为3.0.1 onDraw()方法现在已经被 MapOverlay extends org.osmdroid.views.overlay.Overlay中的draw()(就像Google)所取代。 类。
上一个onDraw()(现在绘制)方法中的所有代码都是从上面提到的问题的答案中逐字复制的,虽然我承认没有完全理解worldsize,bounding boxes和所描述的转变。
我注意到方法
final Point upperLeft = org.osmdroid.views.util.Mercator
.projectGeoPoint(boundingBox.getLatNorthE6(), boundingBox.getLonWestE6(),
zoomLevel + tileZoom, null);
现已弃用,我不得不删除tileZoom和
final int tileZoom = projection.getTileMapZoom();
让它编译。</ p>
当我接触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作为地图本身 - 因此删除(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);
}
这没关系
答案 0 :(得分:0)
让我试着提出一些建议:
在新的jar版本中,调用getOverlays()。clear()将不再删除地图图块叠加层。现在调用remove(1)可能不正确,因为地图图块覆盖不再位于位置0。
投影有一个方法可以获得当前屏幕上的屏幕坐标矩形。您可以检查用于在此矩形上绘制线条的坐标,以确保它们可以截取它。
看一下新的TileSystem类。可以使用这些函数重新创建任何已弃用的内容。