作为一名程序员兼职业余空间数据分析师,空间数据的处理一直是一抹挥之不去的乌云。虽然GIS软件可视化的操作界面、包罗万象的功能,已经能解决日常工作中几乎所有问题,但对于身为程序员的我来说,一切不能用键盘上26个字母解决的问题,都是不科学的~所以这些年我一直致力于思考一个问题,如何把Arcgis的功能,用代码的方式实现

我了解到,Geopandas是一个极好的工具,今天我们就以一个案例来管窥一二。

 数据准备&任务明确

我有一张上海的街镇地图,一份上海的房源数据和一份上海餐厅数据。

今天,我们需要制作每一个房源的1KM缓冲区,计算缓冲区内有多少家餐厅,并且计算上海每个街镇内有多少家餐厅,然后绘制在地图上展示

这是一个理论上简单但操作繁琐的过程,有些同学可能已经知道GIS的操作:

导入地图数据——导入两份EXCEL——并关联经纬度——获得点数据——并保存点数据图层——然后对房源点数据进行缓冲区制作——保存缓冲区图层——分别使用空间关联把餐厅数据关联到上海街镇和房源缓冲区图层中——并分别保存图层……

好了好了,我已经说不下去了,我们来看看代码怎么解决吧~

 导入数据 

先导入各种包

import pandas as pd
import geopandas as gpd
from shapely import geos
from shapely.geometry import Point
import fiona
import matplotlib.pyplot as plt
from fiona.crs import from_epsg,from_string

我们来观察下python中用到的地理处理工具包的名字:Geopandas. 顾名思义,这个包可以让我们像使用pandas一样处理地理数据,大家可以想象一下这过程,一定如丝般顺滑!

Geopandas其实是各种地理数据分析包的集大成者,包括shapely,Fiona等,当然还有数据分析相关的包numpy,pandas,所以,在这些提及的包中的功能,都可以混合使用,切换不留痕迹。这里就一并导入了。

导入地图shp

shanghai_map = gpd.GeoDataFrame.from_file('./上海街镇/上海街镇.shp') #读取shapfile数据为geodataframe格式

Geopandas提供了一种数据格式叫GeoDataFrame,用直白的话概括就是DataFrame加了一列数据,表达地理信息。导入功能Geopandas底层调用的是Fiona包,所以,一些基本参数和可以导入的数据格式,可以参考Fiona的说明文档。

查看导入后的数据

和DataFrame如出一辙,但多了一列Geometry来存放地理信息,绘图看一下

嗯!是长这样!

接下来,导入房源和餐厅数据

 *这两份数据是CSV格式,导入成DataFrame,我们发现数据中含有经纬度字段,我们可以根据这两个字段,也把数据转换成GeoDataFrame格式

通过经纬度转换点数据:

def point_to_geo(df,lon,lat):
    df['geometry'] = gpd.GeoSeries(list(zip(df[lon],df[lat]))).apply(Point) #识别经纬度,转换点数据
    df = gpd.GeoDataFrame(df) #转换Geodataframe格式
    df.crs = {'init':'epsg:4326'} #定义坐标系WGS84
    del df[lon]
    del df[lat]
    return df

house_data = point_to_geo(house_data,'lon_WGS','lat_WGS') #转换Geodataframe格式
restaurant_data = point_to_geo(restaurant_data,'lon_WGS','lat_WGS') #转换Geodataframe格式

*官方文档请看这里:

绘图,看看成功与否——以上海街镇为底图,两份点数据叠加在底图上

base = shanghai_map.plot(color='lightyellow',edgecolor='black',figsize=(15, 15)) #画底图
restaurant_data.plot(ax=base,marker='o', color='green', markersize=5) #在底图上叠加餐厅点数据
house_data.plot(ax=base,marker='o', color='red', markersize=5) #在底图上叠加房源点数据
plt.gca().xaxis.set_major_locator(plt.NullLocator())#去掉x轴刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator())#去掉y轴刻度
plt.savefig('./map.png',dpi=400) #保存图片

*这里设置下图形的基本参数,画图功能是基于matplotlib,所以它的一些写法和功能是通用的。

显示OK,那么就进入核心环节~

 分析过程 

在制作缓冲区和空间关联之前,先需要对图形进行投影变换,这里仍然写一个函数:

def wgs84_to_CGCS2000(df,code):
    result = df.to_crs(from_epsg(code))
    return result

shanghai_map_pcs = wgs84_to_CGCS2000(shanghai_map,4549)
house_data_pcs = wgs84_to_CGCS2000(house_data,4549)
restaurant_data_pcs = wgs84_to_CGCS2000(restaurant_data,4549)

 *只要知道投影坐标系的ESPG代码,就可以任意转换,我们使用GSC2000坐标系。

接着,构建缓冲区图层,使用buffer()方法,参数为缓冲区的半径

house_data_buffer = house_data_pcs.buffer(1000) #建立一公里缓冲区

base = shanghai_map_pcs.plot(color='lightyellow',edgecolor='black',figsize=(15, 15))
house_data_buffer.plot(ax=base,color='gray', markersize=5,alpha=0.5)
plt.gca().xaxis.set_major_locator(plt.NullLocator()) #去掉x轴刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator()) #去年y轴刻度
plt.savefig('./map2.png',dpi=400) #保存图片

构建完成,同样输出成地图查看效果

增加了透明度,我们可以看到市中心的房源密度较高。生成的数据为GeoSeries,数据为缓冲区的地理信息。这里需要使用任意方法把地理信息和其他字段匹配在一起。

buffer_temp = house_data_pcs[['name','geometry']]
buffer_temp['geometry'] = house_data_buffer
house_data_buffer = buffer_temp

下面,我们使用空间关联,连接餐厅点数据,并获取餐厅的个数。

spacial_join_restaurant = gpd.sjoin(house_data_buffer,restaurant_data_pcs,how='left',op='contains') #空间连接
spacial_join_restaurant = spacial_join_restaurant.groupby(['name']).count()['title'].to_frame().reset_index() #聚合计算个数
spacial_join_restaurant.columns = ['name','restaurant_count'] #更改列名,方便操作
buffer_result = pd.merge(house_data_pcs,spacial_join_restaurant,left_on='name',right_on='name',how='left') #字段匹配

 *方法是sjoin(),功能和GIS相同,分相交,包含和被包含三种。我们使用包含进行连接,并使用pandas的groupby()方法分组计数。

这样我们就完成了空间关联和计算,我们可以使用地图显示,并添加图例:

base = shanghai_result.plot(column='restaurant_count', cmap='Oranges',scheme = 'fisher_jenks'
                             ,legend=True,edgecolor='black',figsize=(15, 15)) #按个数多少叠加底色
plt.gca().xaxis.set_major_locator(plt.NullLocator()) #去掉x轴刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator()) #去年y轴刻度
plt.savefig('./map3.png',dpi=400) #保存图片

这样就可以绘制出以街镇为单位的点密度图:

最后,我们需要把数据导出保存。我们可以保存为shapfile格式,这里推荐大家直接保存为csv格式,方便分享。也可以根据需要,转成任意格式。

shanghai_result = wgs84_to_CGCS2000(shanghai_result,4326) #转换成地理坐标系
shanghai_result.columns = ['town','region','geometry','restaurant_count'] #更改列名为英文,因为数据保存对中文支持不佳
buffer_result = wgs84_to_CGCS2000(buffer_result,4326) #转换成地理坐标系

shanghai_result.to_csv('./result/shanghai_result.csv') #保存成csv
shanghai_result.to_file('./result/shanghai_result.shp') #保存成shapfile
buffer_result.to_csv('./result/buffer_result.csv') #保存成csv
buffer_result.to_file('./result/buffer_result.shp') #保存成shapfile

 结果检查 



我们把保存的数据导入Arcgis,可以正常使用~太棒了!

是不是很实用呢?所以,对于空间数据分析中一些重复操作,工程化的作业,建议大家可以考虑用代码实现,高效,便捷。

作者简介:本文作者数据侠倪家禹,城市数据团特约撰稿人,数据分析师(Python)微专业学员,喜欢用数据挖掘生活中的小秘密。对数据研究有着敏锐的洞察力,善于把复杂的问题简单化,简单的问题流程化。希望大家通过数据感受生活的魅力。

声明:本文为作者投稿,版权归其个人所有。


 热 文 推 荐  

☞ 「傻瓜」才能写出好代码!

☞ 漫画 | 从搬家到容器技术 Docker 应用场景解析

☞ Hacker News 12 月招聘趋势:React 已连续霸榜 19 个月

☞ 从倾家荡产到身价百亿,这个85后只用了8年

☞ 难逃寒冬裁员的“大追杀”,30 岁女码农该何去何从?

☞ OpenStack 2018 年终盘点

拼多多黄峥给陆奇“兼职”,欲挖掘这类AI人才

☞ 老程序员肺腑忠告:千万别一辈子靠技术生存!

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

喜欢就点击“好看”吧!

“可视化”的数据分析落伍了?相关推荐

  1. python如何读取mat文件可视化_python 数据分析--数据可视化工具matplotlib

    说明: 数据可视化中的数据集下载地址:(数据来源:从零开始学python数据分析和挖掘) 链接:https://pan.baidu.com/s/1zrNpzSNVHd8v1rGFRzKipQ 提取码: ...

  2. 《Microsoft Power BI数据可视化与数据分析》之超市运营数据分析

    14.3.1  各省份销售额柱形图 在"字段"窗格中,将"销售额"字段拖到画布上的空白区域,然后将"省/自治区"字段拖动到"可视化 ...

  3. 可视化大数据分析系统

    可视化大数据分析系统有很多,如果系统级都是收费的,如果大家想要了解可视化大数据分析系统,私信我就行.下面聊下5个常用的大数据可视化分析工具. 1.FineReport FineReport是一款纯Ja ...

  4. c#split方法拆分为数据_Dexplot:基于pandas,比matplotlib更简单的数据可视化和数据分析工具...

    Dexplot:建议准备学matplotlib和seaborn的数据可视化新手或者数据可视化爱好者食用 适用于长数据 比如网站用户留言的统计 特色是不用matplotlib 而用pandas导入数据( ...

  5. python分析股票数据_Python数据可视化——股票数据分析

    1.背景 GAFATA,它表示的是GOOGLE,AMAZON,FACEBOOK,APPLE,TENCENT,ALIBABA这六家互联网巨头的首字母缩写.本文主要分析GAFATA这六家公司股票近一年的的 ...

  6. python数据分析与可视化-Python数据分析与数据可视化

    数据分析.数据挖掘与数据可视化是一个古老的话题,并非什么新生事物.近些年来,借助于计算机软硬件的飞速发展,数据分析.挖掘.可视化相关理论和技术在各领域的应用更是有了质的飞跃.饭店选址.公交路线与站牌规 ...

  7. python从mongodb里取出数据进行可视化_Python数据分析及可视化实例之MongoDB增删改查...

    1.MongoDB安装 有时候度娘还是给力的,相反一些博客的安装方法则显得凌乱: 最初使用Win7安装经常会出现意料不到的错误, 比如开机启动服务,服务器日志等. 上面链接安装步骤简单,没有炫技的成分 ...

  8. 应用Tableau、Vertica的可视化大数据分析框架

    大数据分析.企业BI.数据可视化等话题在坛子里日趋火热,新的技术,架构也层出不穷,今天借此文跟大家分享一款大数据下的联机分析(ROLAP)解决方案,它应用了当前主流的数据可视化工具Tableau及列存 ...

  9. python数据生成可视化_Python数据分析:手把手教你用Pandas生成可视化图表

    大家都知道,Matplotlib 是众多 Python 可视化包的鼻祖,也是Python最常用的标准可视化库,其功能非常强大,同时也非常复杂,想要搞明白并非易事.但自从Python进入3.0时代以后, ...

最新文章

  1. Citrix XenServer@cloudstack基本功能测试报告2
  2. win10分辨率不能调整_图文介绍win10系统使用hdmi连接电视的处理方法
  3. 向io设备发出中断请求_人们常说的计算机设备管理是什么,深入解读计算机设备管理...
  4. CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)
  5. 关于realarm210 realarmTest.apk不能直接安装问题解决方法
  6. pixhawk position_estimator_inav.cpp思路整理及数据流
  7. OpenGL.Tutorial15_Lightmaps
  8. 如何在博客中插入背景音乐
  9. JQuery Datatables 动态配置参数异步加载数据
  10. Python小白的数学建模课-07.选址问题
  11. 大一计算机在线考试,大一计算机考试题(含答案).pdf
  12. 【Java从0到架构师】Spring - IoC 控制反转、DI 依赖注入
  13. java位图去重_Redis系列(3) Bloom/BitMap/Geo
  14. android 缩放组件,Android控件之ZoomControls缩放控件
  15. android进阶(一)Activity加载模式
  16. webpack5学习与实战-(九)-区分开发和生产环境的配置
  17. 【C++】error: passing ‘const xxx’ as ‘this’ argument discards qualifiers [-fpermissive]
  18. STM32固件库点灯
  19. 回顾2017、展望2018
  20. linux鼠标切换窗口的快捷键设置,Xshell中如何设置鼠标快捷键

热门文章

  1. Eigen3卸载与重装
  2. 统计xml文件中的标签出现框数及出现过的图片数
  3. leetcode python3 简单题232. Implement Queue using Stacks
  4. linux系统安装自主分区,Linux系统的安装(自动引导安装、网络安装、分区选择)...
  5. leetcode 合并数组
  6. Gnome 3.x 安装悬浮菜单栏
  7. 2021年中国仪表阀市场趋势报告、技术动态创新及2027年市场预测
  8. 为什么 MapReduce 再次流行起来了?
  9. 大场面试必问:秒杀90%Java面试者,后悔没有早点知道!
  10. 小米集团国际总部落地深圳;国美电器创始人黄光裕出狱;TiKV 4.0 发布 | 极客头条...