13

我正在尝试添加一些功能,这些功能将根据查询返回的点放大/缩小地图。例如,假设我们放大了德克萨斯州。如果我执行查询并且服务返回位于德克萨斯州和加利福尼亚州的一些点,我希望地图然后缩小并显示加利福尼亚州和德克萨斯州。我一直在查看ArcGIS JS API以了解如何实现它,但我无法弄清楚要使用哪些属性和/或方法来完成此操作。

4

3 回答 3

22

FeatureSet提供给的回调的属性QueryTask是一个数组。 onCompletefeaturesGraphics

javascript api 提供了esri.graphicsExtent(graphics)可以接受该数组Graphics并计算其范围的函数。计算出范围后,map.setExtent(extent)可用于将地图缩放到该范围。

应该注意的是,文档指定esri.graphicsExtent(...)“如果范围高度和宽度为 0,则返回 null。” 如果返回的Graphics数组中只有一个点,就会发生这种情况,因此您需要检查它。

这是一个示例QueryTask onComplete回调,可用于将地图缩放到查询返回的点的范围:

function onQueryComplete(returnedPointFeatureSet){
  var featureSet = returnedPointFeatureSet || {};
  var features = featureSet.features || [];

  var extent = esri.graphicsExtent(features); 
  if(!extent && features.length == 1) {
    // esri.getExtent returns null for a single point, so we'll build the extent by hand by subtracting/adding 1 to create x and y min/max values
    var point = features[0];
    extent = new esri.geometry.Extent(point.x - 1, point.y - 1, point.x + 1, point.y + 1, point.spatialReference);
  }

  if(extent) {
    // assumes the esri map object is stored in the globally-scoped variable 'map'
    map.setExtent(extent)
  }
}
于 2012-08-04T01:45:48.230 回答
5

我同意,map.setExtent(extent, true)是去这里的方式。另一个观察:如果我们只有一个点,值得考虑简单地使用map.centerAndZoom(point, ZOOM_LEVEL)而不是创建一个范围。然后,我们可以这样:

function onQueryComplete(returnedPointFeatureSet){
  var featureSet = returnedPointFeatureSet || {};
  var features = featureSet.features || [];

  var extent = esri.graphicsExtent(features); 
  if(!extent && features.length == 1) {
     var point = features[0];
     map.centerAndZoom(point, 12);
  } 
  else {
     map.setExtent(extent, true);
  }
}
于 2013-05-21T09:20:29.700 回答
0

以这种方式从某个点创建范围不是一个好主意。如果单位是度数,您可以获得很大的度数。相反,您可以使用 geometryEngine 在该点周围做一个缓冲区

function onQueryComplete(featureSet){
  if (featureSet.features.length) {
    var extent = esri.graphicsUtils.graphicsExtent(featureSet.features); 
    if(!extent && featureSet.features.length == 1 && featureSet.features[0].geometry.type == "point") {
      var point = featureSet.features[0];
      var extent = esri.geometry.geometryEngine.buffer(point.geometry, 1, "meters").getExtent();
    }
    // assumes the esri map object is stored in the globally-scoped variable 'map'
    map.setExtent(extent)
  }
}
于 2020-02-28T13:48:48.730 回答