目录

  1. 前言
  2. geopandas简介
  3. 子区域数据分类统计
  4. 总结

一、前言

最近碰到一个需求,需要统计某省内的所有市的某数据分布情况信息。现有该省的数据分布情况以及该省的行政区划数据。我通过geopandas库实现了这一需求,在这里简单记录之,供需要的人借鉴。

二、geopandas简介

想必大家对pandas都不陌生,它是一个开源的强大的Python数据分析工具。pandas确实做到了灵活、快速、高效的进行数据处理,而geopandas是在pandas的基础上添加了对空间数据的支持,实现了读取空间数据以及对空间数据进行处理。关于其介绍和安装等请参考其github主页,本文不再赘述。

三、子区域数据分类统计

直接进入正题,现有某省的分类统计数据shp文件以及此省的行政区划数据shp文件。

3.1 引入geopandas

为了使用geopandas库,首先需要将其引入。代码如下:

from geopandas import *

3.2 读取此省分类统计数据及行政区划数据

然后从该省的分类统计数据shp文件中读出此数据。代码如下:

provincedata = GeoDataFrame.from_file(provinceshpfile)

代码很简单,只要给GeoDataFrame.from_file函数传入shp文件路径即可,其得到的是一个GeoDataFrame对象,类似于pandas中的DataFrame,区别会在下文讲到。同理,行政区划数据通过以下代码读入:

regiondata = GeoDataFrame.from_file(regionshppath)

3.3 投影转换

要使上述两个数据能够进行处理必须先要将其转换成相同的投影。geopandas进行投影转换很简单。代码如下:

gpd_new=gpd.to_crs(crs)

其中gpd表示原始数据,gpd_new为转换后的数据,crs表示需要转换的投影参数,在https://github.com/geopandas/geopandas/blob/46e50fe5a772944b325bc3c8806f4f96da76a0d8/doc/source/projections.rst中对此参数进行了详细描述,大家可以参照。

所以我们只需要将上述两种数据转换到同一投影即可,问题是假设我们不知道它们的投影类型,那么也很容易,只需要将其都转换成4326或其他投影即可,这样就能保证二者转换后为同一投影。但是问题又来了,如果该省分类数据特别大将会导致投影转换耗时过长。其实此处有个简单方法,我们只需要读出分类数据的crs并将行政区划数据转换成此投影即可,这样不仅代码简单而且能够节省大量时间。代码如下:

regiondata_crs = regiondata.to_crs(provincedata.crs)

3.4 对该省逐市进行数据分类提取

现在二者投影已经相同,我们不得不面对最核心的问题,如何能够从省的分类数据中提取出逐市分类数据情况。我们可以想到必须要将每个市的空间数据与该省的所有分类数据进行相交判断,判断哪些分类数据与该市相交,然后完成相应处理。

3.4.1 获取市的空间数据

首先对行政区划数据进行循环得到每个市的空间数据。代码如下:

for i in range(0, len(regiondata_crs)):
geo = regiondata_crs.geometry[i]
name = regiondata_crs.NAME[i]

其中geo就是取到的当前市的空间数据,可以看出GeoDataFrame与DataFrame的区别就在于多了一个geometry字段,它包含了数据的空间信息,可以对该字段进行空间操作。假设该shp文件还包含了一个NAME属性,那么我们就可以用“.NAME”的方式提取出当前市的name数据,其他属性同理。

3.4.2 获取此空间内的分类数据信息

有了geo之后就可以将其与省的分类数据中的每一个对象进行相交判断(循环判断),根据结果进行相应处理。这里我们假设统计不同种类数据的面积值,即每种类型的数据在该市所占面积大小。代码如下:

area = {}
for i in range(0, len(provincedata)):
geo_province = provincedata.geometry[i]
id = str(provincedata.ID[i])
if geo_province.intersects(geo) and geo_province.is_valid :
temp_geo = geo_province.intersection(geo)
temp_area = temp_geo.area
if area.get(id) == None:
area[id] = temp_area
else :
area[id] = area.get(id) + temp_area

其中area为字典对象,用来存储不同数据在该市所占面积。

首先通过provincedata.geometry[i]获取该数据的空间信息geo_province,然后使用provincedata.ID[i]取出该数据的编号值id。

geo_province.intersects(geo)用来判断该数据与当前市(geo)在空间上是否相交,geo_province.is_valid用来判断该数据是否合法,有无自相交环等。

如果相交则进行处理,首先通过geo_province.intersection(geo)来获取相交的部分temp_geo,然后通过temp_geo.area获取相交部分的面积temp_area。可以看出在geopandas中只需要对geometry对象使用area属性即可获取其面积。

最后将面积以id为key保存到area字典当中。

四、总结

这样就可以实现对该省的分类统计数据进行进一步细分,取出每个市的数据分类信息。当然并一定局限于省和市,比如全球和国家或者国家和省等。只要存在包含关系即可通过此种方式进行处理。这是鸡年的第一篇博客,愿所有人今年都能有个好的结果!

使用Python实现子区域数据分类统计相关推荐

  1. Requests+Etree+BeautifulSoup+Pandas+Path+Pyinstaller应用 | 获取页面指定区域数据存入html、excel文档

    Requests+Etree+BeautifulSoup+Pandas+Path应用 | 获取页面指定区域数据存入html.excel文档 1 需求来源 2 需求细节 3 设计分析 4 技术栈 5 设 ...

  2. python爬虫爬网站数据登录_使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)...

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  3. matplotlib命令与格式:图像(figure)与子区域(axes)布局与规划

    1.figure语法及操作 (1)figure语法说明 figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, ...

  4. python与excel做数据可视化-python做可视化数据分析,究竟怎么样?

    Python做可视化数据分析也是可以的,只是对比起来专业的可视化工具有些得不应手,做出来的图可能不太美观.Python用来处理数据,用来分析绝对可以.我觉得想要可视化可以使用专门的可视化工具. 不过, ...

  5. 【Python】GroupBy:数据聚合与分组运算

    [博客地址]:https://blog.csdn.net/sunyaowu315 [博客大纲地址]:https://blog.csdn.net/sunyaowu315/article/details/ ...

  6. 将python3.7降为3.5_python3.7降至3.5【python cookbook】python访问子字符串

    访问子字符串最简单的的方式是使用切片 afiled=theline[3:8]但一次只能取一个子字符串 如果还要考虑字段的长度struct.unpack可能更合适 importstruct #得到一个5 ...

  7. 【机器学习基础】如何在Python中处理不平衡数据

    特征锦囊:如何在Python中处理不平衡数据 ???? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何处理 ...

  8. linux中python如何调用matlab的数据_特征锦囊:如何在Python中处理不平衡数据

    今日锦囊 特征锦囊:如何在Python中处理不平衡数据 ? Index 1.到底什么是不平衡数据 2.处理不平衡数据的理论方法 3.Python里有什么包可以处理不平衡样本 4.Python中具体如何 ...

  9. python Chrome + selenium自动化测试与python爬虫获取网页数据

    一.使用Python+selenium+Chrome 报错: selenium.common.exceptions.SessionNotCreatedException: Message: sessi ...

  10. python 删除特定行数据_怎么用 Python 做数据分析实例

    01 生成数据表 第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导 ...

最新文章

  1. GitHub学习笔记
  2. 2006上半年程序员级试题答案
  3. 【Flutter】底部导航栏实现 ( BottomNavigationBar 底部导航栏 | BottomNavigationBarItem 导航栏条目 | PageView )
  4. C# 学习笔记(19)操作SQL Server下
  5. xpath技术,用在dom4j中
  6. .NET Core 使用 HttpClient SSL 请求出错的解决办法
  7. 数据库中有痣但是有时取不到_农村这种长得像“泥鳅”的鱼,以前没人吃,现在可能有钱都吃不到...
  8. xor和gates的专杀脚本
  9. 实现备份轮换方案的备份实用程序(C#中的开源Windows窗体应用程序)
  10. html简易幻灯片,用html5实现的简单幻灯片实例
  11. python的数值类型和运算符_python学习笔记之数据类型---数字类型及运算符
  12. mfc 如何判断excel软件是否打开_如何从无到有地搭建一套完整的测试系统(上)...
  13. 利用Xcode建立PhoneGap应用程序环境
  14. 英语论文引用中的常用缩写含义
  15. Java开发就业前景,2017java开发就业前景分析
  16. STM32F429-Discovery 编译 uclinux
  17. newifi虚拟服务器,简单几个步骤,newifi mini变身网络打印服务器,轻松省下100+-win7默认网关不可用...
  18. 网络知识-02 物理层
  19. 拼团小程序源码_拼团软件微信拼团小程序拼团卖水果、让您快速引流
  20. 通过AVAudioRecorder获取麦克风接收分贝

热门文章

  1. python合并pdf_一个用于合并pdf的简单Python脚本
  2. Java 性能调优总结
  3. 图像处理——Haar特征
  4. NSSM部署Net Core流程
  5. linux安装ping命令
  6. PXE配置-Tftpd64
  7. autohotkey-大漠插件
  8. 使用ffmpeg下载m3u8流媒体
  9. 广告机CE认证 FCC认证费用构成
  10. 测试用例(电商项目)