【发布时间】:2023-03-20 11:55:01
【问题描述】:
我正在尝试添加一些功能,这些功能将根据查询返回的点放大/缩小地图。例如,假设我们放大了德克萨斯州。如果我执行查询并且服务返回位于德克萨斯州和加利福尼亚州的一些点,我希望地图然后缩小并显示加利福尼亚州和德克萨斯州。我一直在查看ArcGIS JS API 以了解如何实现它,但我无法弄清楚要使用哪些属性和/或方法来实现它。
【问题讨论】:
标签: javascript arcgis esri arcgis-js-api
我正在尝试添加一些功能,这些功能将根据查询返回的点放大/缩小地图。例如,假设我们放大了德克萨斯州。如果我执行查询并且服务返回位于德克萨斯州和加利福尼亚州的一些点,我希望地图然后缩小并显示加利福尼亚州和德克萨斯州。我一直在查看ArcGIS JS API 以了解如何实现它,但我无法弄清楚要使用哪些属性和/或方法来实现它。
【问题讨论】:
标签: javascript arcgis esri arcgis-js-api
提供给QueryTask 的onComplete 回调的FeatureSet 具有features 属性,它是Graphics 的数组。
javascript api 提供了esri.graphicsExtent(graphics) 函数,它可以接受Graphics 的数组并计算它们的范围。计算完范围后,可以使用map.setExtent(extent) 将地图缩放到该范围。
需要注意的是the documentation为esri.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)
}
}
【讨论】:
setExtent 函数采用第二个(可选)布尔参数,当它为 true 时,保证整个范围都显示在地图上。如果这不起作用,您可以在将范围提供给 setExtent 方法之前使用extent.expand(factor) 稍微增加范围的大小。
我同意,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);
}
}
【讨论】:
以这种方式从某个点创建范围不是一个好主意。如果单位是度数,您可以获得很大的度数。相反,您可以使用几何引擎在该点周围做一个缓冲区
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)
}
}
【讨论】: