我试图解决使用PostGIS查找n个最近邻居的问题:

起点:

  • 表geoname和geonames(来自
  • 添加了GeometryColumn geom和
  • 用值填充geom:更新geoname
  • 创建geom的主要索引(创建
  • 为geonameid创建了主键唯一的BTREE索引

问题:

可能的解决方案:

http://www.bostongis.com/PrinterFriendly.aspx?content_name=postgis_nearest_neighbor的启发,我try 了以下问题:

"SELECT start.asciiname, ende.asciiname, distance_sphere(start.geom, ende.geom) as distance " +
"FROM geoname As start, geoname As ende WHERE start.geonameid = 2950159 AND start.geonameid <> ende.geonameid " +
"AND ST_DWithin(start.geom, ende.geom, 300) order by distance limit 5"

处理时间:约60秒

还try 了一种基于扩展的方法:

"SELECT start.asciiname, ende.asciiname, distance_sphere(start.geom, ende.geom) as distance " +
"FROM geoname As start, geoname As ende WHERE start.geonameid = 2950159 AND start.geonameid <> ende.geonameid AND expand(start.geom, 300) && ende.geom " +
"order by distance limit 5"

处理时间:约120秒

The intended application is some kind of autocomplete. So, any approach taking longer than >1s is not applicable. Is it generally possible to achieve a response time of <1s with PostGIS?

推荐答案

现在,自从PostGIS 2.0以来,就有了可用的几何体类型的KNN索引.

SELECT *
FROM your_table 
ORDER BY your_table.geom <-> "your location..."
LIMIT 5;

<->操作员in PostgreSQL manual.

Postgresql相关问答推荐

如何在Common Lisp中使用Postmodern在表更改时获得通知?

使用jOOQ在postgres上取消嵌套enum_range

使用postgres在go测试容器中使用tern迁移

数组格式类型的PostgreSQL日期

使用doobie,如何将Scala case类映射到带有类型tstzmultirange的PostgreSQL列?

如何通过 DirectFunctionCall 发送 NULL 参数?

错误:分区表的唯一约束必须包括所有分区列

Postgres 14 反斜杠 Z 没有给出正确的输出

Rails 迁移:PostgreSQL 上的 Bigint 似乎失败了?

postgreSQL 中对 utf-8 的 LC_COLLATE 和 LC_CTYPE 支持

从 sql 查询 postgres 9.4 创建嵌套 json

更详细地解释 JOIN 与 LEFT JOIN 和 WHERE 条件性能建议

如果 PostgreSQL 数据库中存在,则删除表

SQLAlchemy 和多个进程的连接问题

获取 psycopg2 count(*) 结果数

Postgresql varchar 是否使用 unicode 字符长度或 ASCII 字符长度计算?

在 Postgres 中显示关系、序列和函数的默认访问权限

安装了 Postgres.app 但它不起作用

我应该在 Django DATABASE ENGINE 中使用哪个 Postgres 值?

PostgreSQL - pg_config -bash:pg_config:command not found