10 votos

PostGIS polígono borde de análisis (orientación, longitud de la arista)

Soy bastante nuevo en el mundo de los SIG y, especialmente, PostGIS, así que por favor discúlpame si la respuesta parece evidente...

Me gustaría hacer el análisis en una serie de edificios. Una cosa que me interesa es su superficie de fachada, junto con la respectiva orientación. Como se ilustra en la imagen de abajo, me gustaría tener la longitud y (normal) la orientación de todos los bordes en una serie de polígonos. En el ejemplo que puso de relieve sólo una superficie.

enter image description here

Una tabla de resultados podría tener este aspecto:

building_id | edge_id | orientation | edge_length
-------------------------------------------------
      1     |    1    |     315     |    10.0
      1     |    2    |      45     |     7.0
      1     |   ...   |     ...     |     ...

Sin embargo, no estoy seguro de si es una manera inteligente para almacenar el resultado para su posterior procesamiento (por ejemplo, calcular la distancia desde el borde al edificio de al lado, etc.). Así que mi pregunta es doble:

  1. Hay un eficiente PostGIS función que puede analizar un polígono bordes? En caso de no nativos de PostGIS función quisiera alternativamente, puede estar interesado en una de Python.
  2. ¿Cuál sería una manera inteligente de almacenar el resultado en una tabla PostGIS, ya que los polígonos pueden tener diferentes números de los bordes?

10voto

Gregslu Puntos 8

Ayer no tuve tiempo para crear en los detalles... Ver a mi de la solución en 4 pasos:

CREATE OR REPLACE VIEW bd_segment AS
SELECT
      ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) AS ep
    FROM
       -- extract the individual linestrings
       (SELECT (ST_Dump(ST_Boundary(the_geom))).geom
       FROM bd) AS linestrings;

CREATE OR REPLACE VIEW bd_segment_geom AS
SELECT sp, ep, st_makeline(sp, ep) 
FROM bd_segment;

CREATE OR REPLACE view bd_segment_id AS 
SELECT bd.gid, row_number() 
    OVER (order by bd.gid), degrees(st_azimuth(ff.sp, ff.ep)-1.57079633) AS az_deg,
    ST_LENGTH(ff.st_makeline) , ff.st_makeline FROM bd_segment_geom ff
JOIN bd ON st_touches(ff.st_makeline, bd.the_geom)
GROUP BY bd.gid, ff.sp, ff.ep, ff.st_makeline;

UPDATE bd_segment_id
SET az_deg = az_deg + 360
WHERE az_deg < 0;

La última consulta que darle la construcción de identificadores con una unión espacial utilizando st_touches. Espero que ayude. Actualización - En qgis la solución se parece a esto: enter image description here

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