ArcGIS JavaScipt API; проверьте, находится ли старый экстент, видимый в данный момент, в новом экстенте - PullRequest
1 голос
/ 18 марта 2020

Я использую API ArcGIS JavaScript для отображения карты ArcGIS в моем приложении. У меня также есть фильтры на моей странице, которые используются для создания определения запроса к серверу ArcGIS, для фильтрации показанных объектов. Когда эти фильтры применяются, карта масштабируется до экстента, применимого для текущего выбора, в соответствии с поисковыми фильтрами, которые я ввел.

Пользователи также иногда уже приближаются к некоторой части карты, а затем нажимают опции фильтра. Если другие объекты, кроме представления текущих пользователей, также согласны с фильтрами, карта масштабируется до вида, где все объекты, согласующиеся с фильтрами, снова видны.

В идеале я хотел бы проверить, прежде чем применять новый экстент для поисковых файлов, если текущий мент уже находится внутри (больше увеличен) в этом новом экстенте. Если это так, я не хотел бы, чтобы карта увеличивалась до большего экстента.

В настоящее время я использую приведенный ниже код, чтобы собрать все объекты, согласующиеся с фильтрами / запросами. Я прокомментировал (комментарий v1.5.0) часть 'setExtent' на данный момент, но в идеале я хотел бы проверить там, находится ли текущий экстент внутри этого нового экстента. Если это так, не увеличивайте / не используйте setExtent, если нет, то увеличивайте / используйте setExtent:

var qt = new esri.tasks.QueryTask(identifyTaskLayerURL);        

qt.execute(q,lang.hitch(this, function(response) {

    if (response && response.features){

        for (var k = 0 ; k < response.features.length ; k++){

            // extract needed content from QueryTask result
            var geometry = response.features[k].geometry;

            if (geometry){

                centerLocation = this._getCenterCoordinates(geometry);                      
                centerX = centerLocation.x.toFixed(5).toString();
                centerY = centerLocation.y.toFixed(5).toString();

                multiPoint.addPoint(new esri.geometry.Point(centerX,centerY));

            } else{
                console.log(this._logNode + "query gave empty result");
            }
        }
        if (this._referenceMxObjectsArr.length == 1){
            this._gisMap.centerAndZoom(centerLocation,Number(this._singleObjectZoom) - 1);
        } else {
            // set extent
            this._extent = multiPoint.getExtent();
            this._extent.setSpatialReference(this._gisMap.spatialReference);
            // v1.5.0 disabled next line
            //this._gisMap.setExtent(this._extent);
        }
    }                   

}));

1 Ответ

1 голос
/ 18 марта 2020

Вы можете использовать метод contains геометрии экстента, чтобы проверить, что что-то вроде этого должно работать,

this._extent = multiPoint.getExtent();
this._extent.setSpatialReference(this._gisMap.spatialReference);
if (!mapExtent.contains(this._extent) {
  this._gisMap.setExtent(this._extent);
}

Чтобы получить текущий экстент, зависит от версии используемого вами API.

С API 4.x вам нужно использовать вид карты, mapView.extent.

С API 3.x вам нужно использовать карту, map.extent

...