2017-02-13 5 views
0

본질적으로 이전 쿼리에서 반환 된 결과 집합에 대해 두 번째 공간 쿼리를 수행하려고합니다. 원본이 실행되지만 두 번째 for 루프에 floodCalcs.businessF에 대한 결과가 반환되지 않습니다. 나는 이것으로부터 어떤 오류도 얻지 않으며 폴리곤이 다각형 (이것은 전역 변수 임)에로드되었는지 확인합니다.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 반환합니다. 이는 본질적으로 함수가 실행되기 전에 queryBlock 이후에 for 루프가 실행된다는 것을 의미합니다. 그래서 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; 
 
     } 
 
    } 
 
    } 
 
}

같은

시도 뭔가