我正在使用OSMDroid API,我想知道是否有办法限制北方和南方的地图。我的意思是,这是否可以防止地图在Y轴上无休止地重复。
我在Github" osmdroid"上发现了这个问题。项目,但补丁的代码太旧,无法应用于新版本的osmdroid(4.2)
修改
我尝试了setScrollableAreaLimit方法,但左上角有一个错误(可能)。当我接近尾声时,地图会跳到另一边。
先谢谢你
答案 0 :(得分:0)
我修改了班级MapView
中的两行。
我将x += worldSize;
替换为x=0;
而将y += worldSize;
替换为y=0;
public void scrollTo(int x, int y) {
final int worldSize = TileSystem.MapSize(this.getZoomLevel(false));
while (x < 0) {
//x += worldSize;
x=0;
}
while (x >= worldSize) {
x -= worldSize;
}
while (y < 0) {
// y += worldSize;
y=0;
}
while (y >= worldSize) {
y -= worldSize;
}
[...]
}
答案 1 :(得分:0)
我扩展了MapView并覆盖了scrollTo()
public void scrollTo(int x, int y) {
final int worldSize = TileSystem.MapSize(this.getZoomLevel(false));
if(y < 0) { // when over north pole
y = 0; // scroll to north pole
}else if(y + getHeight() >= worldSize) { // when over south pole
y = worldSize-getHeight() - 1; // scroll to south pole
}
super.scrollTo(x,y);
}
答案 2 :(得分:0)
我能够通过扩展@kenji的答案来克服这个问题。通过子类方法,我发现快速缩小有时会将地图重置为南极。为了防止这种情况,需要首先缩小y值(正如v5.6.5中的super class实现一样)。
@Override
public void scrollTo(int x, int y) {
final int worldSize = TileSystem.MapSize(this.getZoomLevel(false));
final int mapViewHeight = getHeight();
// Downscale the y-value in case the user just zoomed out.
while (y >= worldSize) {
y -= worldSize;
}
if (y < 0) {
y = 0;
} else if ((y + mapViewHeight) > worldSize) {
y = worldSize - mapViewHeight;
}
super.scrollTo(x, y);
}
答案 3 :(得分:0)
使用setScrollableAreaLimit。
BoundingBoxE6 bbox_bariloche = new BoundingBoxE6(-41.033770, -71.591065, -41.207056,-71.111444);
map.setScrollableAreaLimit(bbox_bariloche);