5 votos

A continuación mostramos un tercer ejemplo sobre cómo utilizar %PRODUCTNAME Math para crear símbolos con índices.

Hay dos mesas con entidades de polígono en mi base de datos PostgreSQL. Quiero crear linestring características donde están los límites de los polígonos no se intersectan.

CREATE TABLE schema.poly_a
(
gid SERIAL NOT NULL,
geom geometry(polygon, SRID),
CONSTRAINT poly_a_pkey PRIMARY KEY (gid)
);

CREATE TABLE schema.poly_b
(
gid SERIAL NOT NULL,
geom geometry(polygon, SRID),
CONSTRAINT poly_b_pkey PRIMARY KEY (gid)
);

enter image description here enter image description here He probado el siguiente SQL, pero no está funcionando. No hay características en la vista.

CREATE VIEW line_difference AS
SELECT
row_number() over() AS gid,
g.*
FROM
(SELECT
ST_Difference(ST_Exteriorring(poly_b.geom), poly_a.geom)::geometry(linestring, SRID) AS geom
FROM schema.poly_a, schema.poly_b)
AS g;

Una geometría de la colección en lugar de linestrings también hará el trabajo.

EDITAR:

He probado la consulta SQL postet por el frío. Desafortunadamente no es posible cargar la capa en QGIS ('no Hay ninguna entrada en geometry_columns!'). Gestor de bases de datos dice que hay dos linestrings, uno multilinestring y uno de geometrycollection. La vista previa en el Gestor de bases de datos no está disponible.

enter image description here

3voto

Dave Puntos 319

Su lógica parece de sonido, pero tiene algunos excedentes de texto en su consulta, lo que arroja un error: "::geometría(linestring, SRID)" no es necesario. También tenga en cuenta que ST_ExteriorRing() NO funciona en múltiples polígonos, sólo los polígonos (null será devuelto de multipolys, lo que puede explicar su falta de resultados). También si usted está usando más de un polígono en cada tabla, tendrá que agregar un st_intersects() a la cláusula where, así:

--create two pairs of overlapping test polygons
with poly3 as (select ST_MakeEnvelope(10, 10, 20, 20, 27700) as geom 
    union select ST_MakeEnvelope(30, 30, 50, 50, 27700) as geom) ,
poly4 as (select ST_MakeEnvelope(15, 15, 25, 25, 27700) as geom
    union select ST_MakeEnvelope(35, 35, 55, 55, 27700) as geom)
--here's a working query    
SELECT
row_number() over() AS gid, g.*
FROM
(SELECT ST_Difference(ST_Exteriorring(a.geom), b.geom) AS geom
FROM poly3 a, poly4 b
where st_intersects(a.geom,b.geom)) g;

...que, creo, produce el resultado deseado (líneas verdes):

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