2 votos

La intersección de geometrías que se tocan devuelve un polígono

Estoy utilizando Postgis 2.3. Tengo dos geometrías que se tocan y que obtuve de una operación de superposición (ST_Difference):

id |                                              st_astext    
 3 | MULTIPOLYGON(((0 -2,0 4,3 4,6 1,0 -2)),((6 6,8 8,8 4,6 6))) 
 4 | POLYGON((2 6,7 9,7 7,6 6,7 5,7 0,4 0,6 1,4.33333333333333 2.66666666666667,5 4,2 6))

Sin embargo, cuando compruebo su intersección, no sólo obtengo cadenas de líneas, sino también un polígono.

select st_AsText(ST_Intersection(a.the_geom, b.the_geom)) from renovation a, renovation b where a.id=4 and b.id=3;

GEOMETRYCOLLECTION(LINESTRING(7 7,6 6),LINESTRING(6 6,7 5),LINESTRING(4 0,6 1),POLYGON((6 1,4.33333333333333 2.66666666666667,4.33333333333333 2.66666666666667,6 1)))

Este polígono es muy raro; tiene dos vértices iguales, pero es válido, y tiene un área no nula.

¿Cómo ocurre esto y cómo puedo evitarlo o filtrar este polígono innecesario?

1voto

Joe Puntos 16

Si se utilizan las presentaciones WKT de las geometrías la intersección devuelve sólo multilíneas

select ST_AsText(
 ST_Intersection(
 ST_GeomFromText(
 'MULTIPOLYGON(((0 -2,0 4,3 4,6 1,0 -2)),((6 6,8 8,8 4,6 6)))'),
 ST_GeomFromText(
 'POLYGON((2 6,7 9,7 7,6 6,7 5,7 0,4 0,6 1,4.33333333333333 2.66666666666667,5 4,2 6))')
 )
 );

"MULTILINESTRING((6 1,4 0),(6 6,7 7),(7 5,6 6))"

No pude reproducir su resultado ni siquiera cuando las geometrías se almacenaron en tablas

create table intersection (id int, geom geometry);
create table intersection2 (id int, geom geometry);

insert into intersection values (1,ST_GeomFromText('MULTIPOLYGON(((0 -2,0 4,3 4,6 1,0 -2)),((6 6,8 8,8 4,6 6)))'));
insert into intersection2 values (1,ST_GeomFromText('POLYGON((2 6,7 9,7 7,6 6,7 5,7 0,4 0,6 1,4.33333333333333 2.66666666666667,5 4,2 6))'));

select ST_AsText(
ST_Intersection(a.geom, b.geom))
from intersection a, intersection2 b;

"MULTILINESTRING((6 1,4 0),(6 6,7 7),(7 5,6 6))"

El problema está probablemente en la inexactitud del cálculo en coma flotante. Por ejemplo, el número decimal 2,666666666667 no puede presentarse con exactitud como un número de doble precisión. El convertidor de https://www.exploringbinary.com/floating-point-converter/ da 2.666666666666670071350608850480057299137115478515625 como resultado. Es muy posible que los vértices devueltos por ST_Diferencia no sean exactamente iguales y por lo tanto ST_Intersección puede encontrar también polígonos mínimos. Otro problema es que el miembro del polígono en la colección de geometría no es válido.

Un enfoque común para aceptar cierta tolerancia en la ubicación de los vértices es leer las geometrías a través de ST_SnapToGrid http://postgis.net/docs/manual-2.0/ST_SnapToGrid.html .

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