在使用PostGIS来确定3D点是否在实体对象内部时,我有些麻烦。
我尝试创建最简单的实体:
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功能吗?