【问题标题】:Find KNN with a geometry data type using POSTGIS in postgresql在 postgresql 中使用 POSTGIS 查找具有几何数据类型的 KNN
【发布时间】:2018-01-27 11:30:23
【问题描述】:

我想使用 PostGIS 为 postgresql 中性能最佳的点找到 k 个最近点。

我的表结构是:

CREATE TABLE mylocations (id integer, name varchar, geom geometry);

示例插入的行是:

INSERT INTO mylocations VALUES (5, 'Alaska', 'POINT(-172.7078 52.373)');

我可以使用以下查询通过 ST_Distance() 找到最近的点:

SELECT ST_Distance(geography(geom), 'POINT(178.1375 51.6186)'::geometry) as distance,ST_AsText(geom),name, id FROM mylocations ORDER BY distance limit 10;

但实际上我想在不计算我的点与所有表点的距离的情况下找到它们。 事实上,我想找到性能最好的最佳查询,因为我的表会有大量数据。 我很感激你的想法

【问题讨论】:

    标签: postgresql postgis knn


    【解决方案1】:

    您缺少 <-> 运算符 Returns the 2D distance between A and B。确保您的 geom 类型和 SRID 相同。

    SELECT ST_Distance(geom, 
           'POINT(178.1375 51.6186)'::geometry) as distance,
           ST_AsText(geom),
           name, id
    FROM mylocations
    ORDER BY geom <-> 'POINT(178.1375 51.6186)'::geometry limit 10
    

    【讨论】:

    • 非常感谢,但是当我使用这个查询时,我觉得我的结果不正确。我不知道如何找到离一点最近的点。事实上,我还没有将 SRID 添加到表中的所有点。因为每个点的 SRID 都与其他点不同。我的查询是:``` SELECT id, name, st_astext(geom) from mylocations where st_dwithin(geom, st_geomfromtext('POINT(-149.3783 56.53)'), 20000) ``` 我认为 20000 是基于米的。对吗?
    • @Mahsa 你索引你的 geom 列了吗?如果没有,请尝试在上述查询之前运行CREATE INDEX mylocations_points_gix ON mylocations USING GIST (geom);
    • 对于您的问题,它以米为单位为您提供geography 类型的距离。由于您的点是 geometry 类型,因此 20000 是 srid distance(如果您真的想进行手动距离计算,可以通过转换 ::geography 将两个点转换为地理)。
    【解决方案2】:

    我终于可以用这个查询来回答我的问题了:

    SELECT id, name 
    FROM mylocations 
    WHERE ST_DWithin(geom::geography,
                     ST_GeogFromText('POINT(-73.856077 40.848447)'),
                     1609, false);
    

    实际上,我想将一个点作为半径为 1609(米)的圆心,并让所有邻居到圆心的距离小于 1609 米。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-11
      • 2013-01-09
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多