I have a list of id's that I use to select points with matching id's. I then want to use the selected points to select all of the polygons which contain them. I am using a querytask with a where clause to select the points. Now I am not sure how to go about selecting the polygons. Do I need to step through the set of points and use each point geometry individually to select the polygon which contains it?
Any ideas welcome!
Solved! Go to Solution.
Janice,
I'm not sure if you want to use this yet (it's in Beta in v3.13), but there's a way to process this client-side:
esri/geometry/geometryEngineAsync | API Reference | ArcGIS API for JavaScript
Specifically, contains() would probably help you:
esri/geometry/geometryEngineAsync | API Reference | ArcGIS API for JavaScript
I haven't worked with the client-side geoprocessing yet... I would need to set-up some test apps to see what we can do with it. Perusing the API, though, it seems you would need to step over your points. There's also a way to do this synchronously:
esri/geometry/geometryEngine | API Reference | ArcGIS API for JavaScript
Here's the difference:
A client-side asynchronous geometry engine. The difference between the
geometryEngineAsync
and geometryEngine modules is the async functions return aPromise
that are resolved with the same argument as is returned by the sync functions. See theunion
method for a code sample.
You could also union your points then run an intersect - that should probably work... Although, now that I think about it, intersect would give you points on the border, too. I'm not sure what the cluster tolerance would be in the API.
Janice,
I'm not sure if you want to use this yet (it's in Beta in v3.13), but there's a way to process this client-side:
esri/geometry/geometryEngineAsync | API Reference | ArcGIS API for JavaScript
Specifically, contains() would probably help you:
esri/geometry/geometryEngineAsync | API Reference | ArcGIS API for JavaScript
I haven't worked with the client-side geoprocessing yet... I would need to set-up some test apps to see what we can do with it. Perusing the API, though, it seems you would need to step over your points. There's also a way to do this synchronously:
esri/geometry/geometryEngine | API Reference | ArcGIS API for JavaScript
Here's the difference:
A client-side asynchronous geometry engine. The difference between the
geometryEngineAsync
and geometryEngine modules is the async functions return aPromise
that are resolved with the same argument as is returned by the sync functions. See theunion
method for a code sample.
You could also union your points then run an intersect - that should probably work... Although, now that I think about it, intersect would give you points on the border, too. I'm not sure what the cluster tolerance would be in the API.
you can use geomertyEngine.union to combine all the points into single geometry and then use that in you queryTask.
check out this post Re: Multiple query tasks
Janice,
If it is not important to know which point intersects which polygon, then I would create a Multipoint from your point geometries and use that in a single spatial Query by setting the Query object geometry property to that created Multipoint.
You all nailed it! I went ahead and used union and used the resulting multipoint to query the polygons. I suppose I could have just created a multipoint from my points as suggested by Robert but was well into my union code before reading his response.
If you are interested, here is the code:
require(["dojo/_base/array","esri/tasks/query","esri/geometry/geometryEngine", "esri/SpatialReference"],
function (array, Query, GeometryEngine, SpatialReference) {
var urlParcelMap = dataLink + "/Assessor/PropertyMap/MapServer/";
var arrayOutFields = ["PNUMBER"];
initQueryTask(urlParcelMap, 4, arrayOutFields);
query.where = "PNUMBER IN (" + searchString + ")";
var pnums = queryTask.execute(query);
pnums.then(function (fset) {
var pts = array.map(fset.features, function (feature) {
return feature.geometry;
});
var union = esriConfig.defaults.geometryService.union(pts);
union.then(function (results) {
arrayOutFields = ["PARCELID"];
initQueryTask(urlParcelMap, 5, arrayOutFields);
query.spatialRelationship = Query.SPATIAL_REL_INTERSECTS;
query.geometry = results;
queryTask.execute(query, showCompQueryResults);
});
});
});