Il s'agit d'une question complémentaire à cette question .
J'ai un réseau fluvial (multiligne) et quelques polygones de drainage (voir photo ci-dessous). Mon objectif est de ne sélectionner que les polygones d'amont (vert).
Avec la solution de John, je peux facilement extraire les points de départ de la rivière (étoiles). Cependant, je peux avoir des situations (polygone rouge) où j'ai des points de départ dans un polygone, mais le polygone n'est pas un polygone d'amont, car il est survolé par la rivière. Je veux seulement les polygones d'amont.
J'ai essayé de les sélectionner en comptant le nombre d'intersection entre les polygones et les rivières (justification: un polygone d'amont ne devrait avoir qu'une seule intersection avec la rivière)
SELECT
polyg.*
FROM
polyg, start_points, stream
WHERE
st_contains(polyg.geom, start_points.geom)
AND ST_Npoints(ST_Intersection(poly.geom, stream.geom)) = 1
, où poylg sont les poylgons, start_points de johns answer et stream est mon réseau fluvial.
Cependant, cela prend une éternité et je ne l'ai pas exécuté:
"Nested Loop (cost=0.00..20547115.26 rows=641247 width=3075)"
" Join Filter: _st_contains(ezg.geom, start_points.geom)"
" -> Nested Loop (cost=0.00..20264906.12 rows=327276 width=3075)"
" Join Filter: (st_npoints(st_intersection(ezg.geom, rivers.geom)) = 1)"
" -> Seq Scan on ezg_2500km2_31467 ezg (cost=0.00..2161.52 rows=1648 width=3075)"
" Filter: ((st_area(geom) / 1000000::double precision) < 100::double precision)"
" -> Materialize (cost=0.00..6364.77 rows=39718 width=318)"
" -> Seq Scan on stream_typ rivers (cost=0.00..4498.18 rows=39718 width=318)"
" -> Index Scan using idx_river_starts on river_starts start_points (cost=0.00..0.60 rows=1 width=32)"
" Index Cond: (ezg.geom && geom)"
Ma question est donc la suivante: comment puis-je interroger efficacement les polygones d'amont?
Mise à jour: j'ai ajouté des exemples de données à ma boîte de dépôt . Les données proviennent du sud-ouest de l'Allemagne. Il s'agit de deux fichiers de formes - un avec des flux et un avec des polygones.
polygons
ceux-ci ne contienne que les points qui sont des sources fluviales (de la question précédente) et exclure tout point de rencontre de deux fleuves. Désolé, pour toutes les questions, je veux juste être sûr.
polygons
qui ont une rivière qui passe (la rivière entre et sort du polygone) et garder ceux avec des départs (et les rivières ne quittent que ce polygone).