使用Python中的geoJSON指向Polygon

问题描述 投票:25回答:3

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

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

谢谢!

python geometry gis geojson
3个回答
41
投票

我找到了一个有趣的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

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
投票

人们不可能在Python中拥有真正快速的几何代码。相反,通常的方法是使用带有Python包装器的快速C / C ++库。

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

© www.soinside.com 2019 - 2024. All rights reserved.