用Python处理geoJSON中的点与多边形问题

44

我有一个包含许多多边形(具体来说是普查区域)的geoJSON数据库和许多经纬度点。

我希望存在一种高效的Python代码,可以确定给定坐标所在的普查区域,但目前我的谷歌搜索并没有发现任何有用信息。

谢谢!

3个回答

72

我找到了一篇有趣的文章,描述了如何做你想做的事情。

简而言之:使用Shapely

你会在文章结尾找到这段代码:

import json
from shapely.geometry import shape, Point
# depending on your version, use: from shapely.geometry import shape, Point

# load GeoJSON file containing sectors
with open('sectors.json') as f:
    js = json.load(f)

# construct point based on lon/lat returned by geocoder
point = Point(-122.7924463, 45.4519896)

# check each polygon to see if it contains the point
for feature in js['features']:
    polygon = shape(feature['geometry'])
    if polygon.contains(point):
        print 'Found containing polygon:', feature

1
有人知道这是否符合WGS84标准吗? - ygbr
8
为了使Shapely 1.4.4正常工作,我需要将导入语句更改为 from shapely.geometry import shape, Point。 - wf.
嗨,@Zebs。我找到了你的答案,但是我无法将其与我的数据一起使用。如果你有时间,是否可以看看这个问题:http://gis.stackexchange.com/questions/173835/point-in-polygon-geojson-using-shapely-python-always-returning-false。谢谢。 - pceccon
1
似乎我们需要将纬度/经度切换为经度/纬度才能使其正常工作,因为Shapely在x/y平面上执行其操作。感谢@pceccon的文章。 - alys
2
我认为你需要使用 open,例如:with open('sectors.json', 'r') as f: - Kirkman14
显示剩余3条评论

7
处理这些数据类型的一个很好的选择是PostGIS,它是PostgreSQL的空间数据库扩展程序。个人建议将所有地理数据存储在PostGIS数据库中,并使用psycopg2在python中引用它。虽然不是纯Python,但与纯Python相比具有惊人的性能优势(下文讨论)。
PostGIS内置了功能来确定点或形状是否在另一个形状内。对于ST_Within函数,良好的文档对此简单示例进行了扩展:
SELECT
ST_WITHIN({YOUR_POINT},boundary)
FROM census;
-- returns true or false for each of your tracts

使用PostGIS最大的好处是索引,这可以将速度提高1000倍[1],甚至比最优秀的C程序(除非该C程序也为数据创建索引)还要好。当数据库正确设置时,它会缓存关于你的区域信息,并且当你询问某个点是否在区域内时,它不需要搜索所有内容...而是可以利用它的索引。
将数据导入和导出PostGRES非常简单。这里有一个很好的教程介绍PostGIS的基础知识,并提供了一些与您的数据集相似的示例数据。虽然这篇教程比较长,但如果您是PostGIS的新手(就像我一样),那么您会在整个过程中感到非常开心和兴奋:
链接:http://workshops.boundlessgeo.com/postgis-intro/ [1]索引使我的一个庞大数据库的最近邻搜索时间从53秒降低到8.2毫秒。

教程链接已经失效,但是它也被托管(并修订)在这里:https://postgis.net/workshops/postgis-intro/。 - abu

2

在Python中无法编写真正快速的几何代码。相反,通常的方法是使用带有Python包装器的快速C/C++库。

例如,您可以从CGAL开始 - 一个非常全面的C++几何库。它具有大多数例程的Python绑定,请参见链接http://code.google.com/p/cgal-bindings/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接