使用Python中的geoJSON指向Polygon

时间:2013-12-25 19:44:17

标签: python geometry gis geojson

我有一个包含大量多边形的geoJSON数据库(特别是人口普查区),我有很多长的纬度点。

我希望有一个有效的Python代码来识别给定坐标所在的人口普查区域,但到目前为止我的谷歌搜索还没有透露任何内容。

谢谢!

3 个答案:

答案 0 :(得分:40)

我发现了一个有趣的article,描述了如何做到你想做的事情。

TL; DR:使用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 :(得分:5)

处理这些类型数据的一个很好的选择是PostGISPostgreSQL的空间数据库扩展程序。我个人将所有地理数据保存在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中获得的好处是你可能无法在其他地方获得索引,这可以提高你的速度1,000x [1],使其比最好的书面C程序更好(除非C程序也创建您的数据的索引)。正确设置数据库后,数据库将缓存有关您的小册子的信息,当您询问某个点是否在某个区域内时,它不必搜索所有内容......它可以利用它的索引。

将数据输入和输出PostGRES非常简单。您可以在此处找到一个很棒的教程,它将引导您完成PostGIS的基础知识,其中的样本数据集与您的样本数据集并无太大差别。这是相当长的,但如果你是PostGIS的新手(就像我一样),你会一直很受欢迎和兴奋:

http://workshops.boundlessgeo.com/postgis-intro/

[1]索引减少了我的一个庞大数据库中的最近邻搜索(从53秒到8.2毫秒20米。

答案 2 :(得分:2)

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

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