在地学问题中经常会遇到判断点是否在多边形内的问题,例如成像问题中射线是否穿过某个网格即为此类问题。在Python中我们对处理这样的问题需要满足以下条件:
- 输入多边形经纬度坐标和待判断点的经纬度坐标,输出
True
/False
- 能与numpy完美衔接
- 输入为多个点也可以处理
用 Shapely 定义多边形
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon
from io import StringIO
import numpy as np
poly = '''
98.2 27
101 27
102.8 29.2
98.2 29.2
'''
def points(lats, lons):
pg = Polygon(np.genfromtxt(StringIO(poly))) # 生成Polygon实例
return np.array([pg.contains(Point(lo, la)) for lo, la in zip(lons, lats)]) # 判断所有输入的点是否在poly内,返回np.array
|
下面进行一个测试,我们定义两个点分别是(28, 100)
和(44, 120)
1
2
|
p = np.array([[28, 100], [44, 120]])
print(points(p[:, 0], p[:, 1]))
|
结果为:
这样结合np.where
函数可以获取原先列表里在或不再多边形内的点。