Mehr

Finden Sie alle Polygone mit punktspezifischen Kriterien


Ich habe zwei Tabellen (PostGIS), eine mit Punkten und die andere mit Polygonen.

Im Moment habe ich diese Abfrage zum Finden von Polygonen (Laravel-Framework):

$polygon = DB::connection('pgsql') ->select(DB::raw("SELECT row_to_json(fc) FROM ( SELECT 'FeatureCollection' Als Typ, array_to_json(array_agg(f)) Als Features FROM (SELECT 'Feature ' Als Typ , ST_AsGeoJSON(ST_Transform(geom,4326))::json Als Geometrie , row_to_json((SELECT l FROM (SELECT areal) As l )) Als Eigenschaften FROM jbb2013 As lg WHERE gid = 1208749 OR gid = 692891 OR gid = 993224 ODER gid = 1171857 ODER gid = 1176873) Als f ) Als fc;") );

Mit etwas Arbeit bekomme ich die Ergebnisse als GeoJSON, die ich dann an Leaflet schicke.

Wie Sie sehen können, spezifiziere ich die Polygone nach der ID. Das ist nicht das, was ich tun möchte. Ich möchte die andere Tabelle mit Punkten verwenden und die Punkte anhand einer bestimmten Kunden-ID finden.

Also ungefähr so: Alle Punkte finden, die zu einer bestimmten Kunden-ID gehören Verwenden Sie diese Punkte in einer ST_Contains-Abfrage, um die Polygone zu finden, die die Punkte enthalten. Das resultierende GeoJSON sollte dann nur die von der Abfrage gefundenen Polygone enthalten.

Ergebnis (jbb2013 ist die Polygontabelle und in Samples werden die Punkte gespeichert):

$polygon = DB::connection('pgsql') ->select(DB::raw("SELECT row_to_json(fc) FROM ( SELECT 'FeatureCollection' AS type, array_to_json(array_agg(f)) AS features FROM (SELECT 'Feature ' AS-Typ , ST_AsGeoJSON(ST_Transform(lg.geom,4326))::json AS-Geometrie , row_to_json((SELECT l FROM (SELECT area) AS l )) AS-Eigenschaften FROM jbb2013 AS lg, (SELECT geom FROM Samples WHERE customer_id = : customer_id) AS pts WHERE ST_Intersects(lg.geom, pts.geom)) AS f ) AS fc;"), array('customer_id' => $customer_id) );

Seien Sie nicht zu beunruhigt über die GeoJSON-Erzeugung von SQL - ich weiß, wie schielend es einen machen kann. Letztendlich haben Sie eine Tabelle jbb2013 in der letzten FROM-Klausel und möchten diese auf die Punkte beschränken, die sie basierend auf einer Kunden-ID schneidet, damit Sie eine standardmäßige räumliche Verknüpfung als Unterabfrage durchführen können, bei der Sie nur diese Punkte auswählen die mit der jeweiligen customer_id übereinstimmen, wobei ST_Intersects im WHERE verwendet wird, um die Ergebnisse einzuschränken. Ich weiß nicht, wie Ihre Punktetabelle heißt, also habe ich sie Punkte genannt.

$polygon = DB::connection('pgsql') ->select(DB::raw("SELECT row_to_json(fc) FROM ( SELECT 'FeatureCollection' Als Typ, array_to_json(array_agg(f)) Als Features FROM (SELECT 'Feature ' As type , ST_AsGeoJSON(ST_Transform(geom,4326))::json As Geometrie , row_to_json((SELECT l FROM (SELECT areal) As l )) As properties FROM jbb2013 As lg, (SELECT geom from points where customer_id in (1 ,2,3) als Punkte WHERE ST_Intersects(lg.geom, pts.geom) As f ) As fc;") );

Alle json-Aggregatfunktionen erschweren das Lesen solcher Abfragen, aber wenn Sie sich nur auf das letzte FROM/WHERE konzentrieren, können Sie normalerweise tun, was Sie wollen.


SELECT polygons.* FROM Polygone, Punkte WHERE ST_Contains(polygons.wkb_geometry, points.wkb_geometry AND points.id IN (WÄHLEN Sie Ihre Bedingung);

Ist es das, wonach Sie suchen?


Schau das Video: clean polygon gap sliver multipart and polygon in polygon in ArcGIS (Oktober 2021).