Esta es una pregunta de seguimiento a esta pregunta.
Tengo una red fluvial (multiline) y algunos de drenaje polígonos (ver imagen de abajo). Mi objetivo es seleccionar sólo las cabeceras de los polígonos (verde).
Con Juan solución me puede fácilmente extraer el río los puntos de inicio (estrellas). Sin embargo, puede haber situaciones (rojo polígono) donde he startpoints en un polígono, pero el polígono no es una cabecera poligonal, porque se volado aunque por el río. Yo sólo quiero las cabeceras de los polígonos.
Traté de seleccionar mediante el conteo del número de intersección entre los polígonos y los ríos (justificación: una cabecera de polígono debe tener sólo 1 intersección con el río)
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
, donde poylg son los poylgons, start_points de la universidad de johns respuesta y la secuencia es mi red fluvial.
Sin embargo, esta toma para siempre y yo no se ejecuta:
"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)"
Así que mi pregunta es: ¿Cómo puedo eficiente de consulta en las cabeceras de los polígonos?
Actualización: He añadido algunos datos de ejemplo para mi dropbox. De datos es desde el sur-oeste de Alemania. Se trata de dos archivos shape - uno con arroyos y uno con polígonos.