Use*_*ame 3 sql postgresql indexing postgis
这是我的CSV格式的PostgreSQL示例.
row,latitude,longitude
1,42.082513,-72.621498
2,42.058588,-72.633386
3,42.061118,-72.631541
4,42.06035,-72.634145
Run Code Online (Sandbox Code Playgroud)
我有更多的行像这些跨越世界各地的坐标.
我只想查询表中某个半径范围内的坐标.如何使用PostGIS和PostgreSQL执行此操作?
你想"的坐标5英里半径范围内的所有行",所以这是不完全是K最近邻(KNN)的问题.相关,但你的情况更简单."找到离我坐标最近的10行"将是一个KNN问题.
将坐标转换为geography值:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用更简单的geometry类型.考虑:
4.2.2.何时使用Geography Data类型而不是Geometry数据类型
然后我们有一个像这样的表:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
您只需要ST_DWithin()- 和一个空间索引来加快速度:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT *, ST_Distance(c.x, geog) AS distance -- distance is optional
FROM tbl t, (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.63 42.06)')) AS c(x)
WHERE ST_DWithin(c.x, geog, 8045) -- distance in meter
ORDER BY distance; -- order is optional, you did not ask for that
Run Code Online (Sandbox Code Playgroud)
或者您可以使用原始列并创建功能索引......这个和其他详细信息在dba.SE这个密切相关的答案中:
我综合了埃尔文和帕特里克的答案。
-- Add geography column
ALTER TABLE googleplaces ADD COLUMN gps geography;
UPDATE googleplaces SET gps = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326);
CREATE INDEX googleplaces_gps ON googleplaces USING gist(gps);
SELECT *
FROM my_table
WHERE ST_DWithin(gps, ST_SetSRID(ST_MakePoint(-72.657, 42.0657), 4326), 5 * 1609);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3563 次 |
| 最近记录: |