Mais

Encontre todos os polígonos contendo critérios específicos de pontos


Tenho duas tabelas (PostGIS), uma contendo pontos e outra contendo polígonos.

No momento, tenho esta consulta para encontrar polígonos (framework do Laravel):

$ 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 type, ST_AsGeoJSON (ST_Transform (geom, 4326)) :: json As geometry, row_to_json ((SELECT l FROM (SELECT areal) As l)) As propriedades FROM jbb2013 As lg WHERE gid = 1208749 OU gid = 692891 OR gid = 993224 OR gid = 1171857 OR gid = 1176873) As f) As fc; "));

Com algum trabalho consigo os resultados como GeoJSON, envio para o folheto.

Como você pode ver, eu especifico os polígonos por id. Não é isso que eu quero fazer. Eu gostaria de usar a outra tabela que contém pontos e encontrar os pontos por um customer_id específico.

Então, algo como isto: Encontre todos os pontos que pertencem a um customer_id específico Use esses pontos em uma consulta ST_Contains para encontrar os polígonos que contêm os pontos. O GeoJSON resultante deve conter apenas os polígonos encontrados pela consulta.

Resultado (jbb2013 é a tabela de polígonos e samples é onde os pontos são armazenados):

$ 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 type, ST_AsGeoJSON (ST_Transform (lg.geom, 4326)) :: json AS geometry, row_to_json ((SELECT l FROM (SELECT área) AS l)) AS properties 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));

Não fique muito assustado com o GeoJSON produzindo SQL - eu sei como ele pode fazer um estrábico. No final das contas, você tem uma tabela jbb2013 na cláusula FROM final e deseja limitá-la aos pontos que ela cruza com base em um customer_id, para que possa fazer uma junção espacial padrão, como uma subconsulta onde você seleciona apenas aqueles pontos que correspondem ao customer_id específico, usando ST_Intersects em WHERE para limitar os resultados. Eu não sei como sua tabela de pontos é chamada, então eu a chamei de pontos.

$ 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 'Como tipo, ST_AsGeoJSON (ST_Transform (geom, 4326)) :: json As geometry, row_to_json ((SELECT l FROM (SELECT areal) As l)) As propriedades FROM jbb2013 As lg, (SELECT geom a partir de pontos onde customer_id em (1 , 2,3) como pts WHERE ST_Intersects (lg.geom, pts.geom) As f) As fc; "));

Todas as funções de agregação json tornam essas consultas difíceis de ler, mas se você se concentrar apenas no final DE / ONDE, poderá fazer o que quiser normalmente.


SELECT polygons. * FROM polygons, points WHERE ST_Contains (polygons.wkb_geometry, points.wkb_geometry E points.id IN (SELECIONE sua condição);

É isso que você está procurando?


Assista o vídeo: Matura próbna rozszerzona 2021 marzec zad 15 Poziom rozszerzony optymalizacja (Outubro 2021).