2017-02-13 83 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將在函數執行之前執行。所以當你循環通過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; 
 
     } 
 
    } 
 
    } 
 
}

相關問題