Подзапросы с использованием объектов/полигонов в ArcGIS JS

По сути, я пытаюсь выполнить второй пространственный запрос к набору возвращенных результатов предыдущего запроса. Источник работает, но не возвращает никаких результатов для floodCalcs.businessF во втором цикле for. Я не получаю при этом никаких ошибок и проверяю, загружены ли полигоны в polygons (это глобальная переменная).

queryShapes = function () {
            for (var v = 0; v < shapes.length; v++) {

                query = new Query();                    
                select = shapes[v];
                query.geometry = shapes[v].getExtent();
                query.returnGeometry = true;

                businessLayer.queryFeatures(query, selectBusiness);
                //featureLayer.queryFeatures(query, selectInBuffer);  

                //perform query on business layer using user drawn shape's bounding box (extent)
                function selectBusiness(response) {
                    var feature;
                    var features = response.features;
                    var floodFeatures = [];
                    var floodFeature;
                    var inBuffer = [];
                    var floodBuffer = [];

                    var q = new Query();
                    q.geometry = shapes[v].getExtent();
                    q.where = "1=1";
                    q.outSpatialReference = map.spatialReference;
                    q.outFields = ["*"];
                    q.returnGeometry = true;
                    var qTask = new QueryTask("ommitted URL");
                    qTask.execute(q);
                    qTask.on("complete", queryBlock);
                    //query flood layer using user drawn shapes and cast the returned features as polygons
                    function queryBlock(f) {                           
                        for (var i = 0; i < f.featureSet.features.length; i++) {
                            polygons.push(new Polygon({ "rings": f.featureSet.features[i].geometry.rings, "spatialReference": f.featureSet.features[i].geometry.spatialReference }));
                        }                          
                    }

                    //filter out features that are not actually in buffer, since we got all points in the buffer's bounding box
                    for (var c = 0; c < features.length; c++) {
                        feature = features[c];
                        if (shapes[v].contains(feature.geometry)) {
                            inBuffer.push(feature.attributes[businessLayer.objectIdField]);
                        }
                        //use flood polygons that were returned in queryBlock function to find points in flood zones
                            for (var b = 0; b < polygons.length; b++) {
                                var poly = polygons[b];
                            if (poly.contains(feature.geometry)) {
                                floodCalcs.businessF += 1;
                            }
                        }
                    }



                    var subQuery = new Query();
                    subQuery.objectIds = inBuffer;
                    //use a fast objectIds selection query (should not need to go to the server)
                    featureLayer.selectFeatures(subQuery, FeatureLayer.SELECTION_NEW, function (results) {
                        floodCalcs.business += sumPopulation(results);                           
                    });

                }
                function sumPopulation(features) {
                    var popTotal = 0;
                    popTotal = features.length;
                    return popTotal;
                }

            }


        }

person TacoB0t    schedule 13.02.2017    source источник


Ответы (1)


ФункцияQueryTask.execute возвращает Deferred. что по существу означает, что ваш цикл for после queryBlock будет выполнен до выполнения функции. Таким образом, в то время, когда вы перебираете polygons, он будет пуст.

Кроме того, f.featureSet.features[i].geometry уже является Polygon, вам не нужно снова создавать новый.

Попробуйте что-нибудь вроде этого

var q = new Query();
q.geometry = shapes[v].getExtent();
q.where = "1=1";
q.outSpatialReference = map.spatialReference;
q.outFields = ["*"];
q.returnGeometry = true;
var qTask = new QueryTask("ommitted URL");
var promise = qTask.execute(q);
qTask.on("complete", queryBlock);
//query flood layer using user drawn shapes and cast the returned features as polygons
function queryBlock(f) {                           
  for (var i = 0; i < f.featureSet.features.length; i++) {
    polygons.push(f.featureSet.features[i].geometry);
  }                          
}
promise.then(function(){
  //filter out features that are not actually in buffer, since we got all points in the buffer's bounding box
  for (var c = 0; c < features.length; c++) {
    feature = features[c];
    if (shapes[v].contains(feature.geometry)) {
      inBuffer.push(feature.attributes[businessLayer.objectIdField]);
    }
    //use flood polygons that were returned in queryBlock function to find points in flood zones
    for (var b = 0; b < polygons.length; b++) {
      var poly = polygons[b];
      if (poly.contains(feature.geometry)) {
        floodCalcs.businessF += 1;
      }
    }
  }
}

person T Kambi    schedule 15.02.2017