使用Python中的geoJSON指向Polygon

Ben*_*itz 28 python gis geometry geojson

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

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

谢谢!

Zeb*_*ebs 44

我发现了一篇有趣的文章,描述了如何完成你想做的事情.

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
Run Code Online (Sandbox Code Playgroud)

  • 为了在Shapely 1.4.4中工作,我需要将import语句更改为shapely.geometry导入形状Point (8认同)
  • 我认为你需要`open`例如:`open('sectors.json','r')为f:` (2认同)

sAl*_*der 7

使用这些类型数据的一个很好的选择是PostGIS,它是PostgreSQL的空间数据库扩展器.我亲自将我的所有地理数据保存在PostGIS数据库中,然后使用python在python中引用它psycopg2.我知道它不是纯粹的python,但它在纯python上有令人难以置信的性能优势(如下所述).

PostGIS具有内置功能,以确定点或形状是否在另一个形状内.关于ST_Within函数的优秀文档扩展了这个简单的例子:

SELECT
ST_WITHIN({YOUR_POINT},boundary)
FROM census;
-- returns true or false for each of your tracts
Run Code Online (Sandbox Code Playgroud)

您可能从其他地方获得的PostGIS中获得的好处是索引,这可以提高您的速度1,000x [1],使其比最好的书面C程序更好(除非C程序还创建了一个索引你的数据).正确设置后,数据库将缓存有关您的小册子的信息,当您询问某个点是否在某个区域内时,它不必搜索所有内容......它可以利用它的索引.

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

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

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