【问题标题】:Fast Points in polygon count PostGIS多边形计数中的快速点 PostGIS
【发布时间】:2018-06-27 12:02:01
【问题描述】:

我在构建一个简单的缓冲区内的点查询时遇到了速度问题,即。 在给定质心和缓冲区距离的情况下计算缓冲区内的点数。

我有<100 质心(缓冲区)和250.000 点。

两个表都有索引并且事先已经过真空分析。

我一直在尝试几件事,但似乎没有一个有效。

SELECT parcels.id, count(*) AS totale
FROM
    _BUFFERS  parcels,
    _POINTS ints
WHERE 
    AND ST_intersects( ST_Buffer(parcels.centroid::geography, 800), ints.geom)
GROUP BY parcels.id;

还尝试了LATERAL 加入但没有成功:

SELECT r.id, r.pcount FROM
    (SELECT
        id, ST_Buffer(centroid::geography, 800) as the_geom
     FROM
        _BUFFERS ) n,
    LATERAL (
        SELECT
            n.id, count(*) as pcount
        FROM
            _POINTS p
        WHERE
            n.the_geom && geom
    ) r

我一定是在这里做错了什么?? 谢谢!

【问题讨论】:

    标签: polygon postgis point intersect lateral-join


    【解决方案1】:

    您的“geom”列都是几何类型还是地理类型?确保它们相同...如果您使用几何图形,请确保 SRID 采用您期望的单位(例如米)

    我认为你不需要创建缓冲区,你可以使用st_dwithin

    SELECT parcels.id, count(*) AS totale
    FROM
     _BUFFERS  parcels
    INNER JOIN
        _POINTS ints
    on st_dwithin(parcels.centroid, ints.geom,800)
    GROUP BY parcels.id;
    

    请注意,如果一个点在您的距离内超过一个质心,它将被重复计算。

    【讨论】:

    • 它们都是几何geom geometry(Point,4326)centroid geometry(Point,4326)。所以应该是ST_DWITHIN(parcels.centroid::geography, ints.geom::geography, 800),运行起来还是需要2分钟多的时间(比以前好多了,但是还是蛮长的?)
    • 事情是,这会在转换为地理时产生大量工作,我怀疑查询将使用您在几何上获得的任何索引。您可以在 geom::geography 上放置一个索引,但除非您有充分的理由在 4326 中使用几何,否则我会将列转换为地理(并重新索引)或将 SRID 更改为以米为单位的内容...
    • 太棒了!!按照您的建议,我创建了两个几何列,将4326 转换为我的本地srid,计算时间不到一秒。非常感谢!
    猜你喜欢
    • 2018-11-12
    • 2011-03-21
    • 2016-02-16
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多