我正在尝试添加一些功能,这些功能将根据查询返回的点缩放地图。例如,假设我们放大了德克萨斯州。如果我执行查询并且服务返回德克萨斯州的一些点和一些位于加利福尼亚州的点,我希望地图然后缩小然后显示加利福尼亚州和德克萨斯州。我一直在浏览ArcGIS JS API,看看我是如何实现它的,但是我无法弄清楚用什么属性和/或方法来实现它。
提供给FeatureSet
的QueryTask
回调的onComplete
有属性features
,这是Graphics
阵列。
javascript api提供了esri.graphicsExtent(graphics)
函数,它可以接受Graphics
的数组并计算它们的范围。计算范围后,可以使用map.setExtent(extent)
将地图缩放到该范围。
应该注意的是the documentation的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)
}
}
我同意,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);
}
}