Jquery 在ArcGIS JS中使用要素/多边形的子查询
本质上,我正在尝试对前一个查询返回的结果集执行第二个空间查询。源代码运行,但它不会返回第二个for循环中的floodCalcs.businessF的任何结果。我没有从中得到任何错误,我会检查以确保多边形已加载到多边形中(这是一个全局变量)Jquery 在ArcGIS JS中使用要素/多边形的子查询,jquery,arcgis,arcgis-js-api,Jquery,Arcgis,Arcgis Js Api,本质上,我正在尝试对前一个查询返回的结果集执行第二个空间查询。源代码运行,但它不会返回第二个for循环中的floodCalcs.businessF的任何结果。我没有从中得到任何错误,我会检查以确保多边形已加载到多边形中(这是一个全局变量) queryShapes=函数(){ 对于(var v=0;v
queryShapes=函数(){
对于(var v=0;v
查询任务.execute函数返回一个延迟的。这本质上意味着在执行函数之前,将在queryBlock
之后执行for循环。因此,当您在多边形中循环时,它将是空的
另外,f.featureSet.features[i].geometry
已经是一个Polygon
,您不需要再创建一个新的
试试这样的
var q=newquery();
q、 几何体=形状[v]。getExtent();
q、 其中=“1=1”;
q、 outSpatialReference=map.spatialReference;
q、 外场=[“*”];
q、 返回几何=真;
var qTask=新的查询任务(“指定URL”);
var promise=qTask.execute(q);
qTask.on(“完成”,queryBlock);
//使用用户绘制的形状查询泛洪层,并将返回的特征转换为多边形
函数queryBlock(f){
对于(变量i=0;i
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;
}
}
}