5 votos

Añadir nuevos nodos en el centro de cada línea de un polígono

Actualmente estoy trabajando en una red de alumbrado público. Tengo dos capas en PostGIS ( PostGIS 2.1.3 y PostgreSQL 9.3.5):

  • Pozos de registro (56.000 polígonos)
  • Tuberías (Linestring)

Los pozos son rectángulos perfectos compuestos por 4 nodos (vértices).

Tengo que digitalizar todas las tuberías desde cada pozo hasta los demás pozos.

Al digitalizar las tuberías, he activado el snapping, pero como las arquetas no tienen nodos centrales en cada cara tengo que digitalizar desde los vértices.

enter image description here

Me gustaría poder dibujar una línea entre arquetas pero desde el centro de una cara del polígono, no desde los vértices.

Para tratar de resolver este problema, pensé que podría crear un nodo intermedio entre cada una de las 4 Líneas de cada Polígono. Cada polígono resultante debería tener entonces 8 nodos.

Mi enfoque, que finalmente terminó funcionando perfectamente es:

Volcar el polígono en líneas. He encontrado esta consulta que lo hace y modificar la consulta para construir una cadena de líneas con cada punto inicial, punto medio (centroide) y punto final. A continuación, reconstruya el polígono:

.

SELECT 
id, ST_MakePolygon(ST_LineMerge(ST_Union(the_geom))) as the_geom
FROM(
SELECT id, ST_MakeLine(ARRAY[sp,st_centroid(ST_MakeLine(sp,ep)),ep]) as the_geom
FROM
   -- extract the endpoints for every 2-point line segment for each linestring
   (SELECT id,
      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 id, (ST_Dump(ST_Boundary(the_geom))).geom
       FROM manholes
       ) AS linestrings
    ) AS segments
) as lines 
GROUP BY 
  id

Resultado:

enter image description here

4voto

matt Puntos 211

Yo crearía una capa de punto intermedio para el propósito de la instantánea.
Utilizando este bonito guión de Paul Ramsey y la actualización para su caso de uso:

CREATE TABLE polygons ( 
  gid integer primary key, 
  geom geometry(Polygon, 4326)
);

INSERT INTO polygons VALUES (1, 'SRID=4326;POLYGON((0 0,1 0,1 1,0 1,0 0))');
INSERT INTO polygons VALUES (2, 'SRID=4326;POLYGON((10 10,11 10,11 11,10 11,10 10))');

WITH 
dumps AS ( 
  SELECT gid, ST_DumpPoints(geom) AS pt FROM polygons
), 
pts AS (
  SELECT gid, (pt).geom, (pt).path[2] AS vert FROM dumps
) 
, segments as (
SELECT a.gid, ST_AsText(ST_MakeLine(ARRAY[a.geom, b.geom])) AS geom, 
       a.vert, b.vert 
FROM pts a, pts b 
WHERE a.gid = b.gid AND a.vert = b.vert-1 AND b.vert > 1)
select ST_Line_Interpolate_Point(geom, 0.5) middle_points from segments;

Resultado (as_text):

"POINT(0.5 0)"
"POINT(1 0.5)"
"POINT(0.5 1)"
"POINT(0 0.5)"
"POINT(10.5 10)"
"POINT(11 10.5)"
"POINT(10.5 11)"
"POINT(10 10.5)"

Puedes crear una nueva tabla o vista con esto y establecer el snap en ella.

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