在 openlayers 3 中重新投影地图范围

reproject map extent in openlayers 3

我想在我的 Openlayers 3.9.0 地图上设置扩展。

当页面加载时,我希望地图已经在该范围内居中,无论图层如何。所以我想我会设置一个 extend to the view,对吗?

地图包含单个 OSM 层,例如

var layer = new ol.layer.Tile({
    source: new ol.source.OSM(

        {
        attributions: [
          new ol.Attribution({
            html: 'All maps © ' +
                '<a href="http://www.opencyclemap.org/">OpenCycleMap</a>'
          })
        ]            
      }             

    ),
    opacity: 0.8,
    brightness: 0.8
});

然后我设置视图

var center = ol.proj.transform([21.54967, 38.70250], 'EPSG:4326', 'EPSG:3857');
    var view = new ol.View({
        center: center,
        zoom: 6,
        extent: [2297128.5,4618333.0 , 2459120.25,4763120.0]
    });

然后是地图

var map = new ol.Map({
        target: 'map',
        layers: [layer],
        view: view,     
    });

我在一个较旧的项目中使用了我的扩展,EPSG 900913。所以为了将扩展从 900913 转换为默认的 Openlayers 3 3857 我去了这里 here 并且我把 2297128.5, 4618333 转换为 2297128.5,4618333.0

然后是

2459120.25, 4763120转换为 2459120.25,4763120.0

我的两个问题

1- 转换后的坐标看起来很相似。我是不是做错了什么?

2- 地图居中正常,但未放大延伸。坐标定义了希腊的一个县,地图没有缩放到那里,我看到了整个希腊,还有土耳其和意大利。

我做错了什么?谢谢

几个问题:

  • 范围[2297128.5,4618333.0, 2459120.25,4763120.0]好像已经在EPSG 3857了,不用再改造了

  • ol.Viewextent 选项是实验性的,似乎效果不佳。您可以执行以下操作来设置边界框(在声明 map 之后):

    var extent = [2297128.5, 4618333.0, 2459120.25, 4763120.0]; view.fitExtent(extent, map.getSize());

  • 您的示例中的初始缩放是由于在视图上设置的缩放级别 (zoom: 6)。使用 fitExtent() 应该覆盖初始缩放级别。您可以从视图声明中删除 zoomcenterextent 选项。

顺便说一下,关于 http://cs2cs.mygeodata.eu/ 站点,您似乎必须为输入坐标指定 EPSG:4326 而不是 EPSG:900913,才能使转换正常工作。

注意: ol.View.fitExtent() 在 OpenLayers v3.7.0

中被重命名为 ol.View.fit()

它可以很简单:

var min = [2297128.5, 4618333.0];
var max = [2459120.25, 4763120.0];
var extent = ol.extent.boundingExtent([min, max]);

var map = new ol.Map({
    target: 'map',
    layers: [
        new ol.layer.Tile({
            source: new ol.source.MapQuest({layer: 'osm'})
        })
    ],
    view: new ol.View({
        center: ol.proj.fromLonLat([21.54967, 38.70250]),
        zoom: 3,
        extent: extent
    })
});

http://jsfiddle.net/jonataswalker/zc3uL66q/

谢谢大家。我所做的是

保持 OSM 层不变。

定义县的范围。结果是 EPSG 900913

var countyLimits= ol.proj.transformExtent([2297128.5, 4618333, 2459120.25, 4763120], 'EPSG:900913', 'EPSG:3857');

现在查看

var view = new ol.View({
    center: center,
    zoom: 6,
    extent : countyLimits,
    maxZoom:20
});

地图是

var map = new ol.Map({
    target: 'map',
    layers:[layer],
    view: view
});

定义地图后,使其视图符合限制

    map.getView().fit(countyLimits, map.getSize()); 
//get the view of the map and fit it to the limits, according to the map's size

fitExtend 现在已弃用,所以我使用 fit。这是实验性的,但我想它将成为标准,因为它取代了 fitExtend

谢谢大家

来源

OL answer

OL3 API