判断点是否在多边形中的多种方法
1 使用shapely判断点是否在多边形中
使用python里的shapely库可以很方便地判断一个点是否在多边形中
它的特点是你可以diy点和多边形。适用于点和多边形都有自己构建的情况
首先,要先在控制台安装shapely
pip install shapely
然后,在py文件中,构建一个shapely中的点:
坐标(1,1)
import shapely.geometry
point = shapely.geometry.Point(1, 1)
然后,构建一个多边形:
这里要注意,我们的输入是字典格式的,有两个键,分别是'type'和'coordinates',在'coordinates'里是多边形的边缘上的边的坐标。
import shapely.geometry
poly_context = {'type': 'MULTIPOLYGON',
'coordinates': [[[[0, 0], [0, 2], [2, 2], [2, 0]]]]}
poly_shape = shapely.geometry.asShape(poly_context)
poly_shape
最后,判断点是否在多边形中:
print(poly_shape.intersects(point))
#输出: True
2 结合shapefile判断点是否在shp文件的多边形中
这时候,我们的多边形通过shp文件读取,点是我们自己构造的
要用到shapefile和shapely两个库
然后我这个情况是,shp文件中有多个多边形,我可以判断点是否在每一个多边形中,简单地说是用这个函数:
geometry.Point(point).within(geometry.shape(shape))
详细代码如下,我写了个循环,对于shp文件中的每个shape,我都判断一下,点是否在其中
import shapefile
import shapely.geometry as geometry
shp_path = './temp.shp'
sf = shapefile.Reader(shp_path)
point = [-73.98088709894267, 40.75348098873852]
for i in range(len(shapes)):
print(i, geometry.Point(point).within(geometry.shape(shapes[i])))
输出:
0 False
1 False
2 False
...
6 False
7 False
8 False
3 结合geopandas判断点是否在shp文件的多边形中
关于geopandas的安装,请参考:
https://blog.csdn.net/weixin_41608080/article/details/114494953
Mac用户请参考:
https://blog.csdn.net/qq_39805362/article/details/122741171
这个的前提,依然是,你有一个shp文件
然后我们现在不用shapefile读取shp文件,而是geopandas读取,不得不说,geopandas是真的好用,可以之间看到shape具体是什么数据:
import geopandas
shp_path = './temp.shp'
shp_df = geopandas.GeoDataFrame.from_file(shp_path, )
print(shp_df.head())
输出:
region_id geometry
0 0 POLYGON ((-73.98089 40.75348, -73.98094 40.753...
1 1 POLYGON ((-73.94712 40.82590, -73.94761 40.825...
2 2 POLYGON ((-73.99260 40.72414, -73.99263 40.724...
3 3 POLYGON ((-73.95034 40.77556, -73.95080 40.774...
4 4 POLYGON ((-73.93131 40.85933, -73.93136 40.859...
真的就所见即所得,我这个shp文件也是有多个多边形。
然后比如说我们判断一个点是否在第一个多边形中,直接使用within函数即可:
pnts = Point(3, 3)
print(pnts.within(shp_df.iloc[0]['geometry']))
输出:
False
非常好用!