【问题标题】:OL3: Zoom to vector layer on mapOL3:缩放到地图上的矢量图层
【发布时间】:2014-01-06 09:48:15
【问题描述】:

我有一张带有 openlayers 3 和矢量图层的地图。 我想将地图调整为该矢量图层的大小,但到目前为止,我所能得到的只是将地图集中在该矢量的最后一个点上,因为在创建地图时无法访问矢量图层的点:

if (trackMap != null) {
  for (var i = 0; i < trackMap.length; i++) {
    var trackInfo = trackMap[i];
    lat = parseFloat(trackInfo.lat);
    lon = parseFloat(trackInfo.lon);

    var layergpx = new ol.layer.Vector({
      source: new ol.source.Vector({
        parser: new ol.parser.GPX(),
        url: '${contextRoot}/gps/gpx2' + trackInfo.url
      })
    });
    layers.push(layergpx);
    vectorLayers.push(layergpx);
  }
}

map = new ol.Map({
  controls: ol.control.defaults().extend([
    new ol.control.FullScreen()
  ]),
  layers: layers,
  renderer: ol.RendererHint.CANVAS,
  target: 'map',
  view: new ol.View2D({
    center: ol.proj.transform([lon, lat], 'EPSG:4326', 'EPSG:3857'),
    zoom: 13
  })
});

【问题讨论】:

  • 您想要调整地图大小或放大地图吗?在 View2D 中尝试 FitExtent
  • 放大。我试过 FitToExtend,但问题是,调用 FitToExtend 时没有加载轨道
  • 扩展必须与地图在同一坐标系中。地图、图层和扩展的坐标系是哪个?
  • 是的。我尝试了一些由其他人发布的东西,他有一个计数器,它等到所有图层都加载完毕,然后缩放到一定程度,但这很不稳定。 gis.stackexchange.com/questions/31323/…
  • 您不能从服务器端获取扩展并使用该扩展启动地图吗?

标签: javascript openlayers-3


【解决方案1】:

为什么不只适合 ol.source.Vector 的范围?

var source = new ol.source.Vector();

...

map.getView().fitExtent(source.getExtent(), map.getSize());

【讨论】:

    【解决方案2】:

    从版本3.7.0ol.View.fitExtent()ol.View.fit()替换

    var source = new ol.source.Vector();
    map.getView().fit(source.getExtent(), map.getSize());
    

    【讨论】:

      【解决方案3】:

      所以...经过几天的测试和思考,我解决了这个问题。 并非没有进一步的问题,但是计算边界服务器端并将它们传输到脚本使其更容易一些。

      解决问题的 Javascript 相当简短:

      if (minLon != null && minLat != null && maxLon != null && maxLat != null){
       var bottomLeft = ol.proj.transform([minLon, minLat], 'EPSG:4326', 'EPSG:3857');
       var topRight = ol.proj.transform([maxLon, maxLat], 'EPSG:4326', 'EPSG:3857');
       extent = new ol.extent.boundingExtent([bottomLeft,topRight]);
       map.getView().fitExtent(extent, map.getSize());
      }
      

      【讨论】:

      【解决方案4】:

      我有一种方法可以使视图居中,而不必担心将度数从一个标准转换为另一个标准。想知道这个技巧是否适用于你。您首先从所有来源获取范围。分解它们的中心并将该中心输入到您的视口:

      try {
          extentEMRG = geoSrcEMRG.getExtent();
          extentWARN = geoSrcWARN.getExtent();
          ext2Layers = ol.extent.getIntersection(extentEMRG, extentWARN);
          center2Layers = ol.extent.getCenter(ext2Layers);
          //alert(center2Layers);
      } catch (e) {
          alert(e.message);
      }
       var map = new ol.Map({
          view: new ol.View({
              center: center2Layers
              , zoom: 8
          })
          , layers: [
              new ol.layer.Tile({
                  source: new ol.source.OSM()
              })
              , vLayerWARN 
              , vLayerEMRG 
          ] ....
      

      【讨论】:

      • 聪明。但是,如果您的范围相交怎么办。我想你想要的是联合,而不是十字路口。
      • 谢谢你的问题,有时间需要看看。好久没看那个项目了!
      猜你喜欢
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      相关资源
      最近更新 更多