6 votos

Puedo identificar si un punto está dentro de un volumen en PostGIS?

Actualmente estamos investigando PostGIS como una opción para buscar en tres dimensiones de los bloques que contienen un punto (y más tarde también las líneas). En este momento no puedo ver ninguna funcionalidad que opera en el volumen de una forma tridimensional, todas las funciones de PostGIS ofrece parecen operar en la superficie.

Aquí hay una serie de funciones que hemos probado:

SELECT 
    ST_Contains(p , mpoly),      ST_Contains(p , ph),      ST_Contains(p , box),
    ST_3DIntersects(p , mpoly),  ST_3DIntersects(p , ph),  ST_3DIntersects(p , box),
    ST_3DDWithin(p , mpoly, 0),  ST_3DDWithin(p , ph, 0),  ST_3DDWithin(p , box, 0)
FROM
  (SELECT 
    'POINT Z (0.5 0.5 0.5)'::geometry AS p,
    'MULTIPOLYGON Z (
        ((0 0 0, 0 1 0, 1 1 0, 0 1 0, 0 0 0)),
        ((0 0 1, 0 1 1, 1 1 1, 0 1 1, 0 0 1)),
        ((0 0 0, 0 0 1, 0 1 1, 0 0 1, 0 0 0)),
        ((1 0 0, 1 0 1, 1 1 1, 1 0 1, 1 0 0)),
        ((0 0 0, 0 0 1, 1 0 1, 1 0 0, 0 0 0)),
        ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0))
    )'::geometry AS mpoly,
    'POLYHEDRALSURFACE (
        ((0 0 0, 0 1 0, 1 1 0, 0 1 0, 0 0 0)),
        ((0 0 1, 0 1 1, 1 1 1, 0 1 1, 0 0 1)),
        ((0 0 0, 0 0 1, 0 1 1, 0 0 1, 0 0 0)),
        ((1 0 0, 1 0 1, 1 1 1, 1 0 1, 1 0 0)),
        ((0 0 0, 0 0 1, 1 0 1, 1 0 0, 0 0 0)),
        ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0))
    )'::geometry AS ph,
    ST_3DMakeBox('POINT Z (0 0 0)'::geometry, 'POINT Z (1 1 1)'::geometry) AS box
  ) AS foo
;

Todos estos devolver false. Dado que estamos utilizando polígonos y superficies poliédricas esto parece correcto, pero hay una manera de tener PostGIS aplicar volumétrica cálculos?

3voto

tomka Puntos 111

Usted podría utilizar el &&& operador. Devuelve true si dos n-d en las cajas de contorno se cruzan:

SELECT 'POINT Z (0.5 0.5 0.5)' &&& 'LINESTRING Z(0 0 0, 1 1 1)' AS intersects;

intersects 
------------
 t
(1 row)

SELECT 'POINT Z (1.5 0.5 0.5)' &&& 'LINESTRING Z(0 0 0, 1 1 1)' AS intersects;
intersects 
------------
 f
(1 row)

Por tanto POINT Z y LINESTRING Z de su cuadro delimitador se utiliza. Así que esto sólo iba a funcionar sin más pruebas por puntos. Para las líneas arbitrarias usted puede obtener falsos positivos (los casos fueron sólo el cuadro delimitador de una línea que se cruza, y no la línea en si mismo). Para esta consulta, debe utilizar un n-d índice, SFCGAL no es necesario.

Alternativamente, usted podría ir con ST_3DDWithin y elegir una consulta de geometría plana a lo largo de una distancia que podría incluir su consulta completa del cuadro delimitador. Sin embargo, esto también significa que usted tendrá que tirar de los resultados que están fuera de su cuadro delimitador. Para esta consulta, debe utilizar un 2-d índice y también no necesita SFCGAL.

Edit: Después de algunas pruebas más y consulta de los PostGIS lista de correo, parece que lo mejor es usar ambos métodos juntos (usando AND). De esta manera &&& reducir el número de pruebas de distancia que ST_3DDWithin tiene que hacer.

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