使用Python实现子区域数据分类统计
目录
一、前言
最近碰到一个需求,需要统计某省内的所有市的某数据分布情况信息。现有该省的数据分布情况以及该省的行政区划数据。我通过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字典当中。
四、总结
这样就可以实现对该省的分类统计数据进行进一步细分,取出每个市的数据分类信息。当然并一定局限于省和市,比如全球和国家或者国家和省等。只要存在包含关系即可通过此种方式进行处理。这是鸡年的第一篇博客,愿所有人今年都能有个好的结果!
打个广告,年初我与朋友成立了一家公司,现长期招聘,如下:
公司名称:武汉一格空间科技有限公司
官网主页:http://www.phitrellis.com
公司简介:我们是一家初创公司,专注于地理信息系统,目前方向为研发一套地信大数据管理、可视化、分析平台
工作地址:甘肃兰州
招聘岗位:前端、后端均可
职位要求:没有特殊要求,只要你有能力,有拼搏进取的精神,能吃苦、肯学、肯上进,愿意与公司共同成长,我们都很欢迎
技术框架:前端主要用到React,后端主要用到Python、Scala,包含数据处理(numpy、pandas)、地信基础分析(geopandas、rasterio等)、Hadoop\Spark分布式框架。
薪资待遇:薪资面议,只要你足够优秀,我们愿意提供相应的薪资,公司各项福利优厚,工作环境宽松,不强制996,个人爱好和兴趣驱动。
联系方式:可以直接通过博客园联系,或Email:shoufengwei@phitrellis.com
使用Python实现子区域数据分类统计的更多相关文章
- 云区域(region),可用区(AZ),跨区域数据复制(Cross-region replication)与灾备(Disaster Recovery)(部分1)
本文分两部分:部分1 和 部分2.部分1 介绍 AWS,部分2 介绍阿里云和OpenStack云. 1. AWS 1.1 AWS 地理组件概况 AWS 提供三种地理性组件: Regions:区域,即A ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- 项目一:第五天 1、区域数据(pinyin4j-简码,城市编码) 2、Web层代码重构(model对象,分页代码提取) 3、区域分页查询 3、分区添加功能 4、定区管理管理-添加,分页
Service: /** * @Description: 1.保存定区 2.让分区关联定区 * 对象三种状态 1.持久态(被session管理对象-一级缓存中有对象) 2.托管态(有OID标识,数据 ...
- python爬取拉勾网数据并进行数据可视化
爬取拉勾网关于python职位相关的数据信息,并将爬取的数据已csv各式存入文件,然后对csv文件相关字段的数据进行清洗,并对数据可视化展示,包括柱状图展示.直方图展示.词云展示等并根据可视化的数据做 ...
- Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程
Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程 一丶获取进程以及父进程的pid 含义: 进程在内存中开启多个,操作系统如何区分这些进程, ...
- 分析Python中解析构建数据知识
分析Python中解析构建数据知识 Python 可以通过各种库去解析我们常见的数据.其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号:xml 可拓展标记语言,很像超文本标记 ...
- 高德地图 JS API (jsp + miniui(子页面数据返回父页面并设值) + 单个点标记 + 点标记经纬度 + 回显 + 限制地图显示范围+搜索)
-*- 父页面js function mapFocus(){ //console.log("-*-"); var longitude = mini.get("jd&qu ...
- ARCGIS API for Python进行城市区域提取
ArcGIS API for Python主要用于Web端的扩展和开发,提供简单易用.功能强大的Python库,以及大数据分析能力,可轻松实现实时数据.栅格数据.空间数据等多源数据的接入和GIS分析 ...
- JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决
JavaScript 解析 Django/Python 生成的 datetime 数据 当Web后台使用Django时,后台生成的时间数据类型就是Python类型的. 项目需要将几个时间存储到数据库中 ...
随机推荐
- NRF24L01无线通讯模块驱动
NRF24L01 无线模块,采用的芯片是 NRF24L01,该芯片的主要特点如下: )2.4G 全球开放的 ISM 频段,免许可证使用. )最高工作速率 2Mbps,高校的 GFSK 调制,抗干扰能力 ...
- X-008 FriendlyARM tiny4412 uboot移植之copy u-boot到DDR内存
<<<<<<<<<<<<<<<<<<<<<<<<< ...
- CSS长度单位详解
序言 长度单位可以总体的分为绝对长度单位和相对长度单位.CSS中最为大家熟知的无疑是px和em,但与此同时还存在pt, rem, vw, vh等其他计量单位,使用好它们可以大大增长我们的开发效率.本篇 ...
- C#的逆变和协变
out: 输出(作为结果),in:输入(作为参数) 所以如果有一个泛型参数标记为out,则代表它是用来输出的,只能作为结果返回,而如果有一个泛型参数标记为in,则代表它是用来输入的,也就是它只能作为参 ...
- C++中vector 容器的基本操作
vector是一种简单高效的容器,具有自动内存管理功能.对于大小为n的vector容器,它的元素下标是0~n-1. vector有二个重要方法: begin(): 返回首元素位置的迭代器. ...
- Angular - - $location 和 $window
$location $location服务解析浏览器地址中的url(基于window.location)并且使url在应用程序中可用.将地址栏中的网址的变化反映到$location服务和$locati ...
- delphi 获得memo,Richedit焦点所在行
procedure TForm1.Button1Click(Sender: TObject); var i:Integer; begin i:=SendMessage(Richedit1.handle ...
- js原生设计模式——12装饰者模式
1.面向对象模式装饰者 <!DOCTYPE html><html lang="en"><head> <meta charset=&q ...
- 使用滚动条(ActionBar)
活动条(ActionBar)是Android3.0的重要更新之一.ActionBar位于传统标题栏的位置,也就是显示屏幕的顶部.ActionBar可显示应用的图标和Activity标题——也就是前面应 ...
- 使用IntelliJ IDEA开发SpringMVC网站(一)开发环境
使用IntelliJ IDEA开发SpringMVC网站(一)开发环境 摘要: 主要讲解初期的开发环境搭建,Maven的简单教学. 访问GitHub下载最新源码:https://github.com/ ...