使用Python实现子区域数据分类统计_python 按要素个数对shp进行编号

57 阅读3分钟

解决方案

明白了这一点之后,再看之前的代码,就发现当时用了很笨的方法。写了两个循环,先是取出大范围的 shp 中的每一个对象,再读取小范围 shp 的每一个对象,将小范围的 shp 空间对象逐个与大的空间对象进行相交操作。循环操作,就能将大范围的 shp 对象完全切割完毕。这段话说的稍微有些绕,感兴趣的可以直接看一下上篇文章。

今天又一次碰到了这个问题,回头找到了原来的文章,但是总感觉写的很丑,难道必须要用这么难看的方法来解决这个问题吗?想了半天,有没有简单的方法能够解决呢?

思考半天,找到了答案,直接对两个 GeoDataFrame 对象做类似数据库的 join 操作不就可以了嘛,只是任意两个判断的时候用空间操作代替数据库的匹配操作。想到这,就开始翻看 geopandas 的用户手册,果然让我找到了。

解决路径

  1. 包引用

 

  1. 创建两个 GeoDataFrame 对象

geopandas 可以直接将 shp 文件读为 GeoDataFrame 对象,如下:

shpdata = GeoDataFrame.from_file(path)

此处,采用模拟的方式创建两个 GeoDataFrame 对象,如下:

 

首先创建4个点对象,使用前两个创建第一个 GeoSeries 对象,后两个创建第二个 GeoSeries 对象。 buffer 函数执行缓冲区分析,将点以一定的距离扩展成面。GeoSeries 简单的说是只包含空间属性的对象,不包含 GeoDataFrame 的其他字段,所以需要为其附加其他字段,为第一个添加 left 字段,为第二个添加 right 字段,并赋值,如下:

 

两个 GeoDataFrame 如下:

通过画图可以看出两个对象的位置关系:

 

 

  1. 两两相交

官网翻阅半天,找到了 overlay 函数,overlay 是覆盖的意思,从意思我们就能猜测出是对两个对象做覆盖的操作。

官网介绍如下:

 

参考geopandas.org/set_operati…

大意是说当执行两个空间对象的相交、合并、取异操作的时候就可以使用此函数。

此函数可以判断两个空间对象的交集、并集以及不同的部分,此处我们只需要取出交集就可以了。

intersection_data = geopandas.overlay(gdf1, gdf2, how='intersection')

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

了解详情:docs.qq.com/doc/DSnl3ZG…