我正在尝试添加一些功能,这些功能会根据查询返回的点缩放地图。例如,假设我们放大了德克萨斯州。如果我执行查询并且服务返回德克萨斯州的一些点和一些位于加利福尼亚州的点,我希望地图然后缩小然后显示加利福尼亚州和德克萨斯州。我一直在查看ArcGIS JS API以了解如何实现它,但我无法确定要使用哪些属性和/或方法来实现此目的。
答案 0 :(得分:22)
提供给FeatureSet
的{{1}}回调的QueryTask
的属性onComplete
是features
的数组。
javascript api提供了Graphics
函数,可以接受esri.graphicsExtent(graphics)
的数组并计算它们的范围。计算范围后,可以使用Graphics
将地图缩放到该范围。
应该注意map.setExtent(extent)
the documentation指定'如果范围高度和宽度为0,则返回null。'如果返回的esri.graphicsExtent(...)
数组中只有一个点,则会发生这种情况,因此您需要检查它。
以下是一个示例Graphics
QueryTask
回调,可用于将地图缩放到查询返回的点范围:
onComplete
答案 1 :(得分: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);
}
}
答案 2 :(得分: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)
}
}