如何在Postgis中解析纬度/经度

时间:2018-10-23 03:34:31

标签: postgis geopandas

我在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等中……?)

(我应该考虑索引表吗?)

1 个答案:

答案 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及更低版本)上,如果创建的话,它可以保证对几何使用空间索引。