2 votos

ST_SnapToGrid hace que el resultado no sea válido dependiendo del tamaño

Para menos de 100 polígonos en mi conjunto de ~1 millón, estoy obteniendo un comportamiento con ST_SnapToGrid que no entiendo. Dependiendo del parámetro que pase para size La validez de la geometría resultante varía. ¿Hay algo particular en el polígono? ¿Qué ocurre aquí?

Estoy usando PostgreSQL 10.6 y PostGIS 2.5

Aquí hay ejemplos que utilizan el mismo polígono de entrada y difieren sólo por el parámetro de tamaño a ST_SnapToGrid .

size es .1 y el resultado de st_isvalid es verdadero :

select st_isvalid(st_snaptogrid(st_geomfromtext('MULTIPOLYGON (((
    473473.3724999996 5007378.8574, 473487.03199999966 5007296.7063,
    473487.04140000045 5007296.6579, 473487.0406999998 5007296.6544,
    473487.03639999963 5007296.6579, 473477.86390000023 5007296.6269000005,
    473473.3724999996 5007378.8574)))'), .1))

size es .01 y el resultado de st_isvalid es falso :

select st_isvalid(st_snaptogrid(st_geomfromtext('MULTIPOLYGON (((
    473473.3724999996 5007378.8574, 473487.03199999966 5007296.7063,
    473487.04140000045 5007296.6579, 473487.0406999998 5007296.6544,
    473487.03639999963 5007296.6579, 473477.86390000023 5007296.6269000005,
    473473.3724999996 5007378.8574)))'), .01))

size es .001 y el resultado de st_isvalid es verdadero :

select st_isvalid(st_snaptogrid(st_geomfromtext('MULTIPOLYGON (((
    473473.3724999996 5007378.8574, 473487.03199999966 5007296.7063,
    473487.04140000045 5007296.6579, 473487.0406999998 5007296.6544,
    473487.03639999963 5007296.6579, 473477.86390000023 5007296.6269000005,
    473473.3724999996 5007378.8574)))'), .001))

4voto

mathieu Puntos 53

ST_SnapToGrid hace

Eliminar los puntos consecutivos que caen en la misma celda [...] - docs

pero no realiza cualquier otra comprobación de la topología .

Tienes razón al suponer que, aparte de lo anterior, sólo redondea a cualquier valor de precisión. Y esta es también la cuestión; considere un polígono con forma de hueso (tipo cómic) en el que dos vértices (opuestos) del centro se redondean a la misma celda: esos vértices son no consecutivo para que no se filtren, pero se auto-intercambian , haciendo que el polígono no sea válido.

Este parece ser el caso de su ejemplo:

SELECT ST_IsValidReason(
         ST_SnapToGrid(
          'MULTIPOLYGON (((
             473473.3724999996 5007378.8574, 473487.03199999966 5007296.7063,
             473487.04140000045 5007296.6579, 473487.0406999998 5007296.6544,
             473487.03639999963 5007296.6579, 473477.86390000023 5007296.6269000005,
             473473.3724999996 5007378.8574
           )))'::GEOMETRY
         ),
         0.01
       )
;

devuelve

Self-intersection[473487.04 5007296.65]

3voto

Joe Puntos 16

Si se echa un vistazo a las geometrías que devuelve SnapToGrid, se verá lo que ocurre.

result of SnapToGrid

Como explicó el usuario @geozelop, en la esquina inferior derecha con tolerancia de 0,01 dos vértices no consecutivos se ajustan a las mismas coordenadas y por eso el polígono tiene un pico que lo hace inválido.

Puede corregir la geometría con ST_MakeValid

select st_makevalid(
st_snaptogrid(st_geomfromtext('MULTIPOLYGON (((
    473473.3724999996 5007378.8574, 473487.03199999966 5007296.7063,
    473487.04140000045 5007296.6579, 473487.0406999998 5007296.6544,
    473487.03639999963 5007296.6579, 473477.86390000023 5007296.6269000005,
    473473.3724999996 5007378.8574)))'), .01))

La geometría corregida es una colección de geometría que tiene el pico como un elemento lineal separado.

GEOMETRYCOLLECTION (
    POLYGON ((
            473473.37 5007378.86, 
            473487.03 5007296.71, 
            473487.04000000004 5007296.66, 
            473477.86 5007296.63, 
            473473.37 5007378.86
        )), 
    LINESTRING (
        473487.04000000004 5007296.66, 
        473487.04000000004 5007296.65
    ))

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