Как определить, находится ли 3D-точка внутри твердого объекта с использованием SQL в PostGIS? - PullRequest
1 голос
/ 07 мая 2019

У меня есть некоторые проблемы, чтобы определить, находится ли 3D-точка внутри твердого объекта или нет, используя PostGIS.

Я пытался создать самое простое из тел:

ST_MakeSolid('POLYHEDRALSURFACE Z (
    ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)),
    ((0 0 0, 0 1 0, 0 1 1, 0 0 1, 0 0 0)),
    ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
    ((1 1 1, 1 0 1, 0 0 1, 0 1 1, 1 1 1)),
    ((1 1 1, 1 0 1, 1 0 0, 1 1 0, 1 1 1)),
    ((1 1 1, 1 1 0, 0 1 0, 0 1 1, 1 1 1))
  )'::geometry)

и хотите узнать, находится ли следующая 3D-точка 'POINT Z (0.5 0.5 0.5)'::geometry внутри нее.

SELECT ST_3DIntersects(
  ST_MakeSolid('POLYHEDRALSURFACE Z (
    ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)),
    ((0 0 0, 0 1 0, 0 1 1, 0 0 1, 0 0 0)),
    ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
    ((1 1 1, 1 0 1, 0 0 1, 0 1 1, 1 1 1)),
    ((1 1 1, 1 0 1, 1 0 0, 1 1 0, 1 1 1)),
    ((1 1 1, 1 1 0, 0 1 0, 0 1 1, 1 1 1))
  )'::geometry),
  ST_MakeSolid('POINT Z (0.5 0.5 0.5)'::geometry)
);

Код выше возвращает false. Я подозреваю, что ST_3DIntersects возвращает true, только если точка пересекается с поверхностью моего тела. Я подозреваю, что этот запрос возвращает true:

SELECT ST_3DIntersects(
  ST_MakeSolid('POLYHEDRALSURFACE Z (
    ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)),
    ((0 0 0, 0 1 0, 0 1 1, 0 0 1, 0 0 0)),
    ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
    ((1 1 1, 1 0 1, 0 0 1, 0 1 1, 1 1 1)),
    ((1 1 1, 1 0 1, 1 0 0, 1 1 0, 1 1 1)),
    ((1 1 1, 1 1 0, 0 1 0, 0 1 1, 1 1 1))
  )'::geometry),
  ST_MakeSolid('POINT Z (1 1 1)'::geometry)
);

Я знаю, что мог бы использовать &&& -функцию, но мое тело будет более сложным, и поэтому я не могу использовать ограничивающую рамку своих тел.

Кто-нибудь знает, какую 3D-функцию использовать, чтобы определить, находятся ли точки внутри твердых объектов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...