【问题标题】:Using PostGIS extensions on PostgreSQL, why doesn't `ST_ConvexHull` contain all points that create it?在 PostgreSQL 上使用 PostGIS 扩展,为什么 `ST_ConvexHull` 不包含创建它的所有点?
【发布时间】:2017-06-12 09:37:57
【问题描述】:

在下面的查询中,我从ST_Point 类型的集合中创建了一个ST_ConvexHull 类型,同时查询这些点是否包含在其中。大多数点从ST_Contains 返回 true,但少数返回 false,表示它们不在船体内部。知道这里发生了什么吗?船体应该包含创建它的所有点。

SELECT
  pc_compact,
  latitude,
  longitude,
  ST_Contains(
      (
        SELECT ST_ConvexHull(ST_Collect(data.points))
        FROM (
               SELECT ST_Point(latitude, longitude) as points
               FROM postcodes
               WHERE pc_compact LIKE 'HU12%'
             ) as data
      ),
      ST_Point(latitude, longitude)
  ) as inside
FROM postcodes
WHERE pc_compact LIKE 'HU12%'

【问题讨论】:

  • 看起来返回 false 的是构成凸包顶点的确切纬度和经度。使用ST_Contains 或类似的东西时有什么方法可以包含这些?

标签: sql postgresql postgis


【解决方案1】:

使用ST_Intersects 代替ST_Contains。

【讨论】:

    【解决方案2】:

    可能有一些点恰好位于凸包的边界上。在该转换中,St_contains 返回 false,因为该点并不完全在多边形内。

    您应该尝试 ST_Contains。即使它们在边界上,它也会选择所有点。

    【讨论】:

    • 你最后一句话毫无意义。
    【解决方案3】:

    也许尝试使用 ST_envelope 而不是 ST_convexhull?看起来它会像你期望的那样工作。 我的意思是ST_Envelope(ST_Collect(..))。

    【讨论】:

    • AFAIK ST_Envelope 生成一个矩形,而不是多边形。
    猜你喜欢
    • 2015-02-17
    • 2020-06-25
    • 1970-01-01
    • 2020-02-26
    • 2021-03-16
    • 1970-01-01
    • 2014-05-08
    • 2020-07-24
    • 2018-02-27
    相关资源
    最近更新 更多