当map和Layer wkid不同时,如何缩放到特征选择?

时间:2017-08-08 07:58:04

标签: javascript dojo esri-javascript-api

我有一个使用Esri ArcGis Js Api v3.11的地图服务。

在该地图上,用户可以查询每个FeatureLayer并返回一个简单的网格。行单击事件附加了以下处理程序:

_grid.on('dgrid-select', function(event) {
    var data = event.rows[0].data;
    //get the current selected featureLayer
    //build a query against it, using the objectId
    //zoom to position: https://developers.arcgis.com/javascript/3/jssamples/fl_zoomgrid.html
    var layerUrl = dijit.byId("LayerSelectBox").get("value");
    var url = lang.replace(_baseUrl, { layer: layerUrl });
    var fl = new FeatureLayer(url, {
        mode: FeatureLayer.MODE_SELECTION,
        outFields: ["ObjectID"]
    });
    //clear selection
    fl.clearSelection();
    query.objectIds = [data.OBJECTID];
    fl.selectFeatures(query, FeatureLayer.SELECTION_NEW, function(features) {
        //zoom to the selected feature
        var geometryExtent = features[0].geometry.getExtent().expand(5.0);
        _map.setExtent(geometryExtent);
    });
});

虽然查询及其周围的一切工作正常,但缩放到结果让我很头疼。地图的空间参考Wkid为102100,返回的几何体为102362.

尝试将地图的范围设置为几何体的范围或居中于某个点会导致以下错误:

  

地图:几何(wkid:102362)无法转换为空间参考   地图(wkid:102100)

.selectFeatureshttps://developers.arcgis.com/javascript/3/jsapi/featurelayer-amd.html#selectfeatures)的文档只提供了一些有用的信息:

  

输入查询。查询对象具有以下限制   避免图层和地图属性之间的冲突。

     
      查询对象指定的
  • outFields被FeatureLayer构造函数中指定的outFields覆盖。
  •   
  • 忽略查询对象指定的returnGeometry值,并使用true。
  •   
  • 忽略查询对象设置的outSpatialReference,并使用地图的空间参考。
  •   

说实话,这让我有点困惑。如何将结果sr转换/转换为地图sr并将地图居中?通过在地图上单击来查询FeatureLayer,会产生一个带有“缩放到”按钮的小对话窗口,因此可以使用该功能进行抓取。我似乎在做一些根本错误的事情。

1 个答案:

答案 0 :(得分:0)

最后,GeometryService是我的救援:

fl.selectFeatures(query, FeatureLayer.SELECTION_NEW, function(features) {

    var gmsvc = new GeometryService("url//to/Geometryservice");

    var fooExtent = graphicUtils.graphicsExtent(features);

    var projectParams = new ProjectParameters();  
    projectParams.geometries = [fooExtent];  
    projectParams.outSR = map.spatialReference;  
    gmsvc.project(projectParams).then(function(x) {
        map.setExtent(x[0]);
    })
});

我正在使用graphicUtils来计算一组几何体的范围。这不是严格必要的,但由于我的结果可以是任何东西,从点到多边形,这是一个很好的触摸,并保存一些开关语句。

接下来我正在使用我的几何服务将范围投影到地图的空间参考中,一旦完成,我就设置了这个范围。