У меня есть некоторые проблемы, чтобы определить, находится ли 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-функцию использовать, чтобы определить, находятся ли точки внутри твердых объектов?