用于存储和查询地理坐标的Python模块
有没有一个Python模块,可以让我创建带有地理位置坐标(经度和纬度)的对象,并且可以查询所有对象中距离某个坐标5公里以内的那些?
我一直在尝试把经度和纬度作为字典的键来存储(因为字典是通过键来索引的),然后用一些计算距离的算法来查询它们。但这样做感觉像是个很糟糕的解决办法。
简单来说,我想要的功能类似于PostGIS在PostgreSQL中的作用,但我希望所有的操作都在我Python应用的内存中完成。
7 个回答
2
在地理信息系统(GIS)中,通常的做法是围绕你感兴趣的点创建一个缓冲区,然后查询这个缓冲区内的交集。正如@RyanDalton所建议的,如果你打算做很多地理定位的工作,可以使用Shapely,这是Python的一个GIS库。即使你还想要一个空间索引,了解Shapely也是很有帮助的(见下文)。下面是如何在Shapely中创建缓冲区的方法:
distance = 3
center = Point(1, 1)
pts = [Point(1.1, 1.2),Point(1.2,1.2)]
center_buf = a.buffer(distance)
#filters the points list according to whether they are contained in the list
contained = filter(center_buf.contains,pts)
如果你的点不多,你可以自己给这些点建立索引(比如说按经度来索引)。如果点比较多,你也可以使用Rtree这个包,具体可以查看这个链接:使用Rtree作为一个简单的空间数据库!
6
我知道这不是你想要的答案,但你可以使用GeoDjango,配合一个内存中的SQLite数据库。这个工具提供了一整套地理信息系统(GIS)工具,可以作为一个网页应用来使用,非常适合快速开发GIS应用,尤其是处理一些小的临时查询时,就像瑞士军刀一样方便。
20
是的,可以试试geopy这个库。
import geopy
import geopy.distance
pt1 = geopy.Point(48.853, 2.349)
pt2 = geopy.Point(52.516, 13.378)
dist = geopy.distance.distance(pt1, pt2).km
# 878.25
之后,你可以查询你的点列表:
[pt for pt in points if geopy.distance.distance(orig, pt).km < 5.]