OSMDroid限制北/南地图

时间:2015-06-09 20:44:12

标签: android osmdroid

我正在使用OSMDroid API,我想知道是否有办法限制北方和南方的地图。我的意思是,这是否可以防止地图在Y轴上无休止地重复。

我在Github" osmdroid"上发现了这个问题。项目,但补丁的代码太旧,无法应用于新版本的osmdroid(4.2)

修改

我尝试了setScrollableAreaLimit方法,但左上角有一个错误(可能)。当我接近尾声时,地图会跳到另一边。

先谢谢你

4 个答案:

答案 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);