如何在给定距离内优化postgis中的最近邻查询?

how to optimize nearest neighbor query in postgis within given distance?

我在带有 Flask-SQLAlchemy 的 PostGIS 中使用以下最近邻查询:

def get_neighbor():
    pt = WKTElement('POINT(%s %s)' % (longitude, latitude), srid=srid)

    # Get total count of neighbor with distance less than 1000m for example.
    total_count = db.session.query(User, func.ST_Distance(User.geom, pt)). \
        filter(func.ST_DWith(User.geom, pt, 1000).count()

    if total_count > 0:
        result_list = db.session.query(User, func_ST_Distance(User.geom, pt)). \
            filter(func.ST_DWithin(User.geom, pt, 1000).all()

        return jsonify({'total_count': total_count, 'result_list':result_list})
    else
        return jsonify({'total_count': total_count})

它实际上工作正常,但我注意到在查询 total_count[=34= 时,相同的查询语句将执行两次].

  1. 如何优化total_countresult_list中的重复查询问题?
  2. 当 User table 包含数千行时,查询是否会将 User table 中的每一行与给定点进行比较?如果是这样,那会很慢,我该如何解决?

如有任何建议,我们将不胜感激!

谢谢!

我从未使用过 Flask-SQLAlchemy,但您想要的是 ST_DWithin,它经过优化以在一定距离内查找几何图形,并且可以使用 GiST 索引。这比使用 ST_Distance.

找到到 all 几何的距离要好

您的 SRID=4326 似乎需要使用 geography 类型来获取公制距离结果,或者可以将 geometry 转换为该类型:

SELECT COUNT(*)
FROM user
WHERE ST_DWithin(user.geom::geography, 'SRID=4326;POINT(-122.4 37.7)'::geography, 1000.0);

您可以使用类似以下内容在该演员表上创建空间索引:

CREATE INDEX user_geog_idx ON user USING gist ((geom::geography));