【发布时间】:2018-06-24 03:09:58
【问题描述】:
我有一个map.geojson 文件,其中包含各个城市的区域边界。
如何计算由(纬度,经度)给出的点的区域?
【问题讨论】:
我有一个map.geojson 文件,其中包含各个城市的区域边界。
如何计算由(纬度,经度)给出的点的区域?
【问题讨论】:
您可以解析geojson并提取点/坐标
import json
data = json.loads(datastring)
data['features'][0]['geometry'] #Your first point
(How can I parse GeoJSON with Python)
当您使用 json 库加载 GeoJSON 文件时,您会得到一个 dict 包含一个条目 features,其中包含功能列表。 每个特征又由一个字典组成,除其他外, 包含一个入口几何。几何是一个包含 条目类型和坐标。所以你可以遍历你的 GeoJSON 文件 像这样:
import json
with open('test.json') as f:
data = json.load(f)
for feature in data['features']:
print feature['geometry']['type']
print feature['geometry']['coordinates']
(https://gis.stackexchange.com/questions/73768/how-to-convert-geojson-to-python-objects)
现在您已经有了坐标/点,可以用它创建一个 多边形,以获得城市边界的几何表示:How to create a Polygon given its Point vertices?
多边形中的点
现在你有了一个多边形,确定一个点是否在它里面 很容易。有两种方法。
`point.within(polygon)` `polygon.contains(point)`point应该是Point类的一个实例,poly当然是 多边形的一个实例。 inside 和 contains 是每个的反义词 其他,所以你使用哪种方法完全取决于你。
https://streamhacker.com/2010/03/23/python-point-in-polygon-shapely/
shapely 是一个处理点的特定类,只有在这个类中表示的点才能在 point.within(polygon) 中工作
和polygon.contains(point) 函数。
点类型由Point类实现;曲线由 LineString 和 LinearRing 类;并由多边形类表面。 Shapely 不实现平滑(即具有连续切线)曲线。 所有曲线必须用线性样条曲线近似。所有圆形补丁 必须通过由线性样条限制的区域来近似。
(https://toblerity.org/shapely/manual.html)
所以你必须把你的小数 lat, lon 值插入到形状点类中:
from shapely.geometry import Point
point = Point(0.0, 0.0)
q = Point((0.0, 0.0))
(https://toblerity.org/shapely/manual.html#points)
有了这个point.within(polygon) 和polygon.contains(point) 函数就可以工作了...
【讨论】:
Point.within(Polygon) 和Polygon.contains(Point)。他们不工作。顺便说一句,用户输入的是一组两个小数点(lat, lan)。