Estoy tratando de identificar dónde se cruzan las carreteras entre sí, y hacer un punto en esta intersección, con el número de carreteras que forman la intersección enumerada.
Me preguntaba si había alguna forma de usar ST_NumPoints para lograr esto, pero no puedo entender qué debería hacer. Lo que he hecho es crear una tabla de puntos donde las líneas se cruzan usando el siguiente código:
CREATE TABLE test_points as
SELECT
ST_Intersection(a.geom, b.geom),
a.gid
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom);
Si ejecuto esto en una muestra de carreteras, obtengo la siguiente cuadrícula de puntos (las carreteras se muestran a modo de ilustración):
Si inspecciono uno de los puntos, veo que hay muchos puntos apilados uno encima del otro:
El GID aquí es la identificación de la carretera, pero no entiendo por qué hay muchos puntos. Puedo entender que se cuentan 4 puntos para una intersección de carretera central, pero hay 12 puntos enumerados aquí. ¿Hay una mejor manera de realizar este cálculo en PostGIS?
COUNT()
tales comoCOUNT(ST_Touches(..))
y,COUNT(ST_Intersection(..))
pero esto no parece funcionar como lo son todos los valores12
.Esto es un poco más complicado de lo que cabría esperar. Esto se debe a que no hay una buena manera de analizar las relaciones para más que pares. No puede poner tres líneas en una función y preguntar si todas se cruzan.
Pero, al menos un enfoque podría ser encontrar primero los cruces, luego verificar cuántos caminos se tocan en cada cruce (todo se puede hacer en la misma consulta).
Si sus caminos se conectan perfectamente entre sí y no hay caminos que pasen por un cruce, entonces podría hacer algo como esto (no probado):
editado con una cláusula de grupo olvidado (aún no probado):
Si las carreteras no están conectadas correctamente y / o algunas carreteras pasan por un cruce, es más complicado.
HTH
Nicklas
fuente
distinct_crosspoints ,roads
nombre de mi tabla (roads_test
)? Lo intenté pero luego recibí un error acerca degeom
ser ambiguo.Si la línea A (id 1) cruza la línea B (id 2) es un punto de intersección que necesitamos. Pero la línea B también cruza la línea A en el mismo punto. Pero no necesitamos este punto dos veces. Es por eso que estoy usando en
a.gid < b.gid
lugar dea.gid != b.gid
fuente