¿Existe una manera de utilizar PostgreSQL + PostGIS para encontrar el número de auto-intersecciones en una cadena de líneas?
Tengo una cadena de líneas que avanza pero en círculos, y necesito encontrar el número de veces que se cruza.
¿Existe una manera de utilizar PostgreSQL + PostGIS para encontrar el número de auto-intersecciones en una cadena de líneas?
Tengo una cadena de líneas que avanza pero en círculos, y necesito encontrar el número de veces que se cruza.
No lo sé con certeza, pero creo que algo como esto podría resolver tu problema (esto no funcionará con las multilíneas, pero podrías vaciarlas o aplastarlas) :
SELECT ID,
COUNT(*) AS theCOunt
FROM
(
SELECT id,
ST_Intersection(A.geom, B.geom) AS geom
FROM
(
SELECT xx.id,
xx.id2,
st_makeline(xx.l_start, xx.l_end) AS geom
FROM
(
SELECT x.id,
generate_series(1, st_npoints(x.geom) - 1) AS id2,
st_pointn(x.geom, generate_series(1, st_npoints(x.geom) - 1)) AS l_start,
st_pointn(x.geom, generate_series(2, st_npoints(x.geom))) AS l_end
FROM
(
SELECT DATA_TABLE.id,
DATA_TABLE.geom
FROM DATA_TABLE
) AS X
) AS XX
) AS A
INNER JOIN
(
SELECT xx.id,
xx.id2,
st_makeline(xx.l_start, xx.l_end) AS geom
FROM
(
SELECT x.id,
generate_series(1, st_npoints(x.geom) - 1) AS id2,
st_pointn(x.geom, generate_series(1, st_npoints(x.geom) - 1)) AS l_start,
st_pointn(x.geom, generate_series(2, st_npoints(x.geom))) AS l_end
FROM
(
SELECT DATA_TABLE.id,
DATA_TABLE.geom
FROM DATA_TABLE
) AS X
) AS XX
) AS B
ON A.ID = b.ID
AND
A.id2 <> B.id2
AND
A.id2 <> B.id2-1
AND
A.id2 < B.id2
AND
ST_INTERSECTS(A.geom, B.geom)
¿Qué tal esto (suponiendo que test
es su tabla de líneas):
En primer lugar, nodifica la cadena de líneas, es decir, crea vértices en cada intersección manteniendo los vértices originales intactos.
CREATE TABLE node AS SELECT id, ST_Node(wkb_geometry) as wkb_geometry FROM test;
Cuenta todos los puntos distintos en las nuevas líneas. Restando el número inicial de vértices del número de nodos se obtiene el número de intersecciones.
SELECT id, COUNT(id) FROM (SELECT DISTINCT (ST_DumpPoints(wkb_geometry)).geom, id FROM node) tmp group by id;
I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.
2 votos
Por favor, añada más detalles a sus preguntas hay muchas maneras de encontrar líneas de auto intersección en postgis. ¿Qué está tratando de lograr?
0 votos
ST_IsValidReason probablemente ayuda, la documentación de ejemplo muestra sólo un error por geometría, así que tal vez usted necesita para ejecutarlo en bucle recursivo . ver postgis.net/docs/manual-dev/ST_IsValidReason.html