【问题标题】:ArcGIS Javascript - Zoom to show all pointsArcGIS Javascript - 缩放以显示所有点
【发布时间】:2023-03-20 11:55:01
【问题描述】:

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

【问题讨论】:

    标签: javascript arcgis esri arcgis-js-api


    【解决方案1】:

    提供给QueryTaskonComplete 回调的FeatureSet 具有features 属性,它是Graphics 的数组。

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

    需要注意的是the documentationesri.graphicsExtent(...)指定'如果extent的高度和宽度为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)
      }
    }
    

    【讨论】:

    • 优秀。没有意识到 esri 有这些实用功能。
    • 另一个问题。使用您提供的信息,我可以更改范围。但是,由于某些点分散开来,它似乎放大了,但我看不到一些外部点。如果我稍微缩小一点,我就会看到它们。在地图上设置范围之前,是否需要考虑偏移量?
    • 地图可能正在根据切片缓存中的切片进行调整。如果是这样,setExtent 函数采用第二个(可选)布尔参数,当它为 true 时,保证整个范围都显示在地图上。如果这不起作用,您可以在将范围提供给 setExtent 方法之前使用extent.expand(factor) 稍微增加范围的大小。
    • 以这种方式从某个点创建范围不是一个好主意。如果单位是度数,您可以获得很大的度数。相反,您可以使用几何引擎在该点周围做一个缓冲区,或者将地图点转换为屏幕点,在范围内添加 1 个像素并将其转换回地图点
    【解决方案2】:

    我同意,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);
      }
    }
    

    【讨论】:

      【解决方案3】:

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

      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)
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多