如何使用PostGIS中的SQL确定3D点是否在实体中?

时间:2019-05-07 08:48:14

标签: 3d postgis intersection

在使用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功能吗?

0 个答案:

没有答案