一日一技:geopandas,用python画地图原来这么简单!

一日一技:geopandas,用python画地图原来这么简单!_第1张图片

文章来源:Python大数据分析 

作者:朱卫军

pandas应该是大家非常熟悉的Python第三方库,其主要用于数据整理和分析,这次来介绍pandas的一个近亲-geopandas

geopandas是用来处理地理空间数据的python第三方库,它是在pandas的基础上建立的,完美地融合了pandas的数据类型,并且提供了操作地理空间数据的高级接口,使得在python中进行GIS操作变成可能。

先看个示例,我们在python中显示世界地图

import pandas as pdimport geopandasimport matplotlib.pyplot as plt%matplotlib inline
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))world.plot()plt.show()

一日一技:geopandas,用python画地图原来这么简单!_第2张图片

当然除了上面的平面效果,你还可以做出这样的:

一日一技:geopandas,用python画地图原来这么简单!_第3张图片

一日一技:geopandas,用python画地图原来这么简单!_第4张图片

一日一技:geopandas,用python画地图原来这么简单!_第5张图片

还可以给地图着色:

一日一技:geopandas,用python画地图原来这么简单!_第6张图片


下面言归正传,正式讲解geopandas是如何工作的

前面说过,geopandas沿用了pandas的数据类型,所以geopandas中也有两种数据类型:

  • GeoSeries

  • GeoDataFrame

它们继承了pandas数据结构的大部分方法。

你可以把这两个数据结构当作地理空间数据的存储器,shapefile文件的pandas呈现。

Shapefile文件用于描述几何体对象:,折线与多边形。例如,Shapefile文件可以存储、河流、湖泊等空间对象的几何位置。除了几何位置,shp文件也可以存储这些空间对象的属性,例如一条河流的名字,一个城市的温度等等。

稍作解释:

  • GeoSeries对应Series,只有一列,里面的每个元素都是代表地理空间图形,有可能是点、线或者面。

  • GeoDataFrame是包含GeoSeries的数据结构,它是多列的,但其中一列必然是GeoSeries列,这个GeoSeries列被称作GeoDataFrame中的几何列。

  • GeoDataFrame的其他列,可以是几何图形的名字、属性等信息,比如国家的人口、面积、GDP等等。

解析一下前面的例子中完整代码:

import pandas as pdimport geopandasimport matplotlib.pyplot as plt%matplotlib inlineworld = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))world.plot()plt.show()

对于下面一行:

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))

geopandas的read_file方法可以读取shape文件,转化为GeoSeries和GeoDataFrame数据类型。

geopandas.datasets.get_path('naturalearth_lowres')则是从geopandas自带的数据集中获取世界地图的shapefile文件。

你也可以用read_file方法读取自己的shapefile文件

所以说,world变量被赋予了一个GeoDataFrame数据列,它长这样:

一日一技:geopandas,用python画地图原来这么简单!_第7张图片

这个数据列中,不仅有几何列geometry,还有其它属性列

比如:人口pop_est、大洲continent、国家名字name等

world.plot()则是将GeoDataFrame变成图形展示出来,得到世界地图:

一日一技:geopandas,用python画地图原来这么简单!_第8张图片

假如说,我只想显示每个地区的中心点,像这样:

一日一技:geopandas,用python画地图原来这么简单!_第9张图片

代码如下:

import pandas as pdimport geopandasimport matplotlib.pyplot as plt%matplotlib inline
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))# 新增一列,每个国家的中心点world['centroid_column'] = world.centroid# 将新增列设置为几何列world = world.set_geometry('centroid_column') world.plot()plt.show()

world.centroid返回一个GeoSeries,里面包含每个地区的中心点空间数据。

.set_geometry函数则是将新增列设置为几何列,这样就会按照新的几何列显示地图。

GeoDataFrame文件的输出形式

前面讲到将shapefile读成GeoDataFrame格式,反过来你也可以将GeoDataFrame格式输出为shapefile文件。

比如前面的world:

world.to_file("countries.shp")

还可以输出为GeoJson、GeoPackage等地理空间文件类型。

world.to_file("countries.geojson", driver='GeoJSON')world.to_file("package.gpkg", layer='countries', driver="GPKG")

按照地区人口数量给世界地图着色

前面的世界地图都是一个颜色,如果我想按照每个地区人口数量给世界地图上色,该怎么办?

一日一技:geopandas,用python画地图原来这么简单!_第10张图片

代码如下:

import pandas as pdimport geopandasimport matplotlib.pyplot as plt%matplotlib inline
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))fig, ax = plt.subplots(1, 1)world.plot(column= 'pop_est', ax=ax, legend=True)plt.show()

其实简单,只需要在world.plot(column= 'pop_est', ax=ax, legend=True) 中加上分类参数column,分类标准为人口列:pop_est

你还可以改色系:

world.plot(column='gdp_per_cap', cmap='OrRd');

一日一技:geopandas,用python画地图原来这么简单!_第11张图片

world.plot(column='gdp_per_cap', cmap='OrRd', scheme='quantiles');

一日一技:geopandas,用python画地图原来这么简单!_第12张图片

总结:

geopandas是非常有用的地理空间处理工具,它很好的结合了pandas的功能,让你很轻松的探索空间数据,在python上快捷、批量进行gis操作。

geopandas还有许多的功能供爱好者探索,这里不做赘述,大家可以自行去官网学习。

最后展示一些官网案例:

一日一技:geopandas,用python画地图原来这么简单!_第13张图片

一日一技:geopandas,用python画地图原来这么简单!_第14张图片

一日一技:geopandas,用python画地图原来这么简单!_第15张图片

一日一技:geopandas,用python画地图原来这么简单!_第16张图片

一日一技:geopandas,用python画地图原来这么简单!_第17张图片

一日一技:geopandas,用python画地图原来这么简单!_第18张图片

如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。

老表Pro已经满了

所以大家加老表Max吧

每日留言

说说你最近遇到的一个编程问题

或者新学的一个小技巧?

(字数不少于15字)


完整Python基础知识要点

Python小知识 | 这些技能你不会?(一)

Python小知识 | 这些技能你不会?(二)

Python小知识 | 这些技能你不会?(三)

Python小知识 | 这些技能你不会?(四)

近期推荐阅读:

【1】整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了

【2】【终篇】Pandas中文官方文档:基础用法6(含1-5)

觉得不错就点一下“在看”吧 

你可能感兴趣的:(一日一技:geopandas,用python画地图原来这么简单!)