Processing math: 100%

6 votos

Encuentre todas las intersecciones de un LineString y un Polígono y el orden en que se cruza con él

Me gustaría encontrar todas las intersecciones de una LineString (Río) a través de la Polygons (Municipios). Me gustaría enumerar el orden de los municipios que el río cruces, utilizando la referencia lineal. Yo ya los han encontrado que los municipios son atravesadas por el río mediante st_intersects, pero esto no me dan la orden y de cómo muchas veces los municipios se cruzan. No estoy esperando una solución completa, en lugar de un modus operandi que voy a implementar por mi auto.

Yo uso PostGIS 2 extensión con PostgreSQL 9.3

MWE:

WITH 
A AS (
SELECT 
    curves.gid AS cgid,
    shapes.gid AS sgid,
    curves.geom AS cgeom,
    shapes.geom AS sgeom,
    st_intersection(curves.geom, shapes.geom) AS mgeom
FROM
    curves, shapes),
B AS (
SELECT
    cgid, sgid, cgeom, sgeom,
    (st_dump(mgeom)).geom AS geom
FROM A),
C AS (
SELECT
    row_number() OVER ()::INTEGER as gid,
    cgid, sgid,
    cgeom, sgeom, geom,
    st_startPoint(geom) AS p0,
    st_endPoint(geom) AS p1
FROM B),
D AS (
SELECT
    C.*,
    st_Line_Locate_Point(cgeom, p0) AS r0,
    st_Line_Locate_Point(cgeom, p1) AS r1
FROM C
ORDER BY r0)

SELECT * FROM D

La consulta anterior a encontrar los puntos de entrada y puede ser utilizado en Referencia Lineal con el fin de seguir el original LineString a través de los municipios. Tengo que discriminar muchos casos de uso y estoy un poco perdido. Este es mi primer consultas en el SIG. Tabla shapes contiene Polygons que no tienen intersecciones y curves contiene LineString que pasan a través de los Polygons. El resultado esperado es, para cada LineString, la lista de Polygons que se cruza (orden y redondance importa).

3voto

Uncle Philster Puntos 1

pero esto no me dan la orden y de cómo muchas veces los municipios son cruzados.

Suponiendo que cada fila en los Ríos de la tabla es un linestring con todo un río. Aquí está una consulta que te cuántos municipios se cruzan, la subconsulta t , conseguirá que todos los municipios que cada uno de los ríos cruces, pero sí que no va a ser en cualquier orden garantizado.

SELECT t.river_gid as river_gid, count(*) as n_mun FROM (
    SELECT rivers.gid as river_gid, municipalities.gid as mun_gid 
    FROM rivers, municipalities 
    WHERE ST_Crosses(rivers.geom, municipalities.geom)
) as t group by t.river_gid;

aquí está una consulta que se va a llegar a todos los puntos de la cadena de línea que cruzaba el polígono en el orden correcto.

SELECT municipalities.id as mun_id, dp.path, dp.river_gid FROM municipalities, (
    SELECT (ST_DumpPoints(geom)).path[1] as path,
           (ST_DumpPoints(geom)).geom as geom, 
           rivers.id as river_gid from rivers
    ) as dp 
    WHERE ST_INTERSECTS(dp.geom, municipalities.geom) 
    ORDER BY dp.river_gid, dp.path;

Desafortunadamente, no hay manera de saber cuántas veces un río cruzado un municipio sin algo de código, pero con esta consulta así llegar muy cerca. Como resultado, usted va a conseguir algo como esto:

mun_id | path | river_gid
  1       1        1
  1       2        1
  2       3        1
  2       4        1
  1       5        1
  1       6        1

En este ejemplo, el río cruzado 2 veces el mismo municipio, y la manera de saber que es la mun_id patrón de columna (estaba en mun_id 1 y, a continuación, cambia a 2, y luego de nuevo a 1).

i-Ciencias.com

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.

Powered by:

X