如何查询POSTGIS由最近点的数据,仅该点返回的结果吗?

时间:2019-01-30 17:58:29

标签: postgis

我有一张postgis的分数表,有4.6亿条记录。它有一个时间戳和点列。

我正在基于此数据构建图形,该数据是属于最接近点的每个时间戳的值的列表,传单将地图(用户点击的位置)的经纬度发送到生成图表的脚本,准备好的数据。

None

这很好(对于某些点击),但是必须有一种更好/更快的方法,我希望查询知道要听的点,并仅返回该点的值。对此要求有更好的功能吗?

1 个答案:

答案 0 :(得分:2)

您拥有什么几何学之王?您正在使用什么投影? 我将假设您的观点在wgs84(epsg:4326)

如果您希望距离是准确的,最好在计算中使用地理位置:

alter points_table add column geog geography
update points_table set geog = geom::geography

创建索引,然后运行clusteranalyze以加快查询速度

create index my_index_geog on points_table using gist(geog) /* change geog for geom if using geometry */
cluster points_table using my_index_geog
analyze points_table

获取最接近的点:

SELECT point_id 
FROM points_table
ORDER BY geog <-> ST_SetSrid(ST_MakePoint($get_lon, $get_lat),4326)::geography limit 1;

一起获得值:

select value
from table
where point_id = (SELECT point_id 
FROM points_table
ORDER BY geog <-> ST_SetSrid(ST_MakePoint($get_lon, $get_lat),4326)::geography limit 1)
order by thedate
limit 1000;

另外,我建议保留一个仅包含点ID和几何/地理的表,以便最接近点的查询运行更快。如果创建名为only_points的表,查询将变为:

select value
from table
where point_id = (SELECT point_id 
FROM only_points
ORDER BY geog <-> ST_SetSrid(ST_MakePoint($get_lon, $get_lat),4326)::geography limit 1)
order by thedate
limit 1000;

如果您需要继续使用geometry,则需要在几何图形上创建索引,基于geom进行聚类并运行查询:

select value
from table
where point_id = (SELECT point_id 
FROM points_table
ORDER BY geom::geography <-> ST_SetSrid(ST_MakePoint($get_lon, $get_lat),4326)::geography limit 1)
order by thedate
limit 1000;

但是,它会变慢,因为您将在每一步上都转换为地理位置

请参见KNN in PostgisPostGIS geography type and indexes