2017-02-13 17 views
0

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

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; 
       } 

      } 


     } 

ответ

1

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

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

Try что-то вроде этого

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; 
 
     } 
 
    } 
 
    } 
 
}

 Смежные вопросы

  • Нет связанных вопросов^_^