我在table:place中列出了13000个位置(含经度和纬度)的列表。 我在另一个名为place_polygon的表中有22000个多边形的列表。 我需要尝试将pois解析为它们所属的多边形。
这是我写的查询:
select * from stg_place.place a
left join stg_place.place_polygon b on
ST_Within(ST_GeomFromText('SRID=4326;POINT('||a.longitude||' '||a.latitude||')'),b.geom);
也尝试过:
select * from stg_place.place a
left join stg_place.place_polygon b on
ST_Intersects(ST_GeomFromText('SRID=4326;POINT('||a.longitude||' '||a.latitude||')'),b.geom);
它永远运行。 但是,如果我在查询中放入过滤器,则对于单个记录,它的运行速度非常快。
select * from stg_place.place a
left join stg_place.place_polygon b on
ST_Within(ST_GeomFromText('SRID=4326;POINT('||a.longitude||' '||a.latitude||')'),b.geom)
where a.id = <id>;
我还尝试编写一个存储过程,并试图遍历游标一次只做一条记录。那也没有帮助。该程序运行了一整夜,没有结束的迹象。
是否有更好的方法来解决此问题? (不一定在postgis中,而是在python geopy等中……?)
(我应该考虑索引表吗?)
答案 0 :(得分:0)
首先,将地理类型用于数据,而不要使用纬度较长的列。为什么选择地理而不是几何?由于您使用的是SRID = 4326且具有地理位置类型,因此,例如,要以米为单位计算距离,然后使用要为该SRID以度数计算的几何类型,则要容易得多。
要使用纬度较长的列创建地理位置,请使用功能 ` for (int i = 1; i < n; i = i+1){
while (i!= 1) {
System.out.print(i + " ");
// If n is odd
if ((i & 1) == 1)
i = 3 * i + 1;
// If even
else
i = i / 2;
}
// Print 1 at the end
System.out.print(i); `
好的。现在就您的实际结构回答您的问题
我在table:place中列出了13000个位置(含经度和纬度)的列表。我在另一个名为place_polygon的表中有22000个多边形的列表。我需要尝试将pois解析为它们所属的多边形。
这是我写的查询:
st_setsrid(st_makepoint(long,lat),4326)::geography
我使用ST_DWithin()而不是ST_Within(),因为在较旧版本的Postgres + PostGIS(肯定9.6及更低版本)上,如果创建的话,它可以保证对几何使用空间索引。