ESRI 地图设置 MapView.extent 切断显示范围的顶部和底部

ESRI Maps setting MapView.extent cuts off top and bottom of extent in display

我有一个 ESRI 地图,我用给定的范围对其进行了初始化。当我用初始范围绘制地图时,实际显示的范围被截断了大约 5-10%,因此我的 FeatureLayers 上的一些要素位于初始视图之外。似乎地图正在尝试形成 "best fit" 缩放级别以将请求的范围与地图大小相匹配,但在这种情况下,最合适的做法是将视图的顶部和底部裁剪掉。

我创建了一个演示来展示此行为:

const map = new EsriMap({
  basemap: 'topo',
});
const extent = {
  spatialReference: {
    latestWkid: 3857,
    wkid: 102100,
  },
  xmin: -8418477.75984,
  ymin: 5691645.413467902,
  xmax: -8413622.645963104,
  ymax: 5694628.596517603,
};

const mapView = new EsriMapView({
  container: document.querySelector('#viewDiv'),
  extent,
  map,
});

const geometry = new EsriPolygon({
  rings: [
    [extent.xmax, extent.ymax],
    [extent.xmax, extent.ymin],
    [extent.xmin, extent.ymin],
    [extent.xmin, extent.ymax],
    [extent.xmax, extent.ymax],
  ],
  spatialReference: extent.spatialReference,
});

const symbol = {
  type: 'simple-line',
  color: [255, 0, 0],
  width: 2,
};

const graphic = new EsriGraphic({
  geometry,
  symbol,
});

mapView.graphics.add(graphic);

观看直播 https://codepen.io/asgallant/pen/rrWmLW。红框是请求的范围。如果您更改地图容器的高度,地图会在某些断点处更改其初始缩放级别。

我想将地图配置为始终选择完全封装所请求范围的默认缩放级别,因此不会截断任何要素。我知道我可以将缩放级别设置为任何我想要的,但我有数百种不同的地图,需要不同的缩放级别才能实现既定目标。有谁知道如何做到这一点?

您可以使用 when 回调来检查地图的范围是否包含您需要的范围。如果您的预期范围在地图范围的边界之外,您只需缩小。

您可以检查您发布的示例是否有效 here

mapView.when(function(){
    if(!mapView.extent)
      return;

    const ext = new EsriExtent(extent);    
    while(mapView.zoom > 0 && !mapView.extent.contains(ext)) {
      mapView.zoom -= 0.5;
    }
});

看着你的 codepen.io 活生生的例子,我不知道你试图用 rem 身高得到什么,但是

height: 42rem;

对我有用。