暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python空间数据计算:4.GeoPandas的读取格式

虾神说D 2021-04-07
4138

前文再续,书接上一回。


GeoPandas的安装一直都是比较麻烦,不过如果你装好了,那简直就太好用不过了。今天我们就来说说GeoPandas对数据的读写能力。


我们都知道,要GeoPandas最底层是依托的GDAL/OGR,所以GeoPandas能够支持的格式,首先需要GDAL/OGR能够支持才行,先看看GDAL/OGR能够支持的格式有哪些。


按我目前按照的GDAL/OGR 3.12版本,支持的格式一共有79种,如下所示:


那么是不是这79种geopandas都能支持呢?答案是否定的,因为在ogr和geopandas之间,还有一个fiona在中间做了封装……
所以,具体GeoPandas能支持那些格式,还得看看Fiona:
如上所示,在Fiona里面, 仅支持22种数据格式了,而且后面的raw,表示支持程度,其中:
r:代表可以读取
a:代表可以追加(编辑)
w:代表可以写(导出)

刨除掉特殊情况,一般我们能够遇上的空间数据格式,基本上都没有啥问题了。

下面我们来看看几种具体格式的示例:
geopandas的读取数据的方法很简单,直接用geopandas.read_file方法就可以了,它会根据你输入的数据格式,去自动适配数据驱动(这点比gdal/ogr强太多了……特么还要自己指定驱动才能进行读取)。

题外话:
shapefile虽然最早是由Esri提出来的,但是现在已经成为了事实上的数据交换标准,市面上只要是平台级的GIS软件,都支持shapefile,而后两个平台之间的数据交换,也大都选择Shapefile做为中间数据
但是,Shapefile的优势和劣势同样出名,优势我就不说了,我这里给大家说说劣势:
1、Shapefile的字段名,最多只支持8个字节(四个汉字)。
2、Shapefile的单文件,最多仅能支持2GB(这个是当年为了契合windows的老FAT磁盘格式的标准)
3、Shapefile是离散的文件结构格式,由一系列文件组组成,容易丢失和被破坏。
4、空间索引和属性索引机制不够完善。
5、不支持ST_Geometry的结构化查询语言进行空间查询。
6、只能支持简单的空间数据格式(点线面,实际上空间上的对象很多,如下所示:)。

所以很多时候,我们都建议使用空间数据库来做为数据载体,如果说企业级数据库(Oracle、MSSQL、Postgresql等)太过庞大复杂了,我们还可以使用本地文件型数据库,比如Esri的file GDB,或者是OGC的GPKG

下面我们来看看这两种文件型数据库在geopandas里面怎么用:
1、Esri 的File GDB,属于Esri特有的格式,目前已经开源了,大家可以去网络查一下对于File GDB的相关资料,所以在GDAL/OGR/Fiona里面,直接把这个驱动就叫做Open File GDB了。

但是,目前Fiona不支持对FileGDB的写入和编辑,仅支持读取。如下所示:

如果我们想看看gdb里面有哪些图层,geopandas不支持,所以需要用fiona.listlayers方法,来读取,读取完了之后,就可以看见这个gdb里面有哪些图层了。
在用geopandas读取gdb的时候,在输入文件路径的时候,只能输入到gdb这一层,读取的时候,需要加一个参数,就是layer,指定你要读取的图层是那个:
gdbdata = geopandas.read_file("./data/china.gdb",layer="省界2012")

同样,如果我们要读取另外一个图层,直接改layer就行:
2、对于OGC的gpkg(GeoPackage),则是另外一种格式,它本质上是基于sqlite的一种开源文件型空间数据库。
所以,直接用能够打开Sqlite数据库的工具,就可以直接打开gpkg了(不像File GDB,必须要用GIS平台软件),比如下面用的是DB Browser:
在geopandas里面,读取的方式和GDB完全一样:
先用fiona读取到layer,然后用geopandas读取就行。

下面看看两种不同的json,第一种的geojson,这也是用得最广的一种json,mapbox、echarts或者Leaflet都直接可以加载:
第二种的Esri的json,这种json用的比较少,主要是ArcGIS系列软件在用,不过支持的属性更加全面:
其实两种json,都直接可以用json为后缀名,我为了标识,所以改成了格式命名

下面来看看比较有意思,比如dxf格式:
dxf是AutoCAD的数据交换文件,CAD的默认文件是dwg,geopandas无法打开dwg的,但是可以打开dxf,效果看起来还挺不错的……

最后是gpx,这是gps的标准导出格式,一般就是个xml:
除了这些格式以外,大家还可以去试试其他的格式,我这里就不一一展现了。

上面是读取都是文件(包括文件型数据库),如果你的数据是标准的企业级空间数据库的话,geopandas也可以读取,比如postgis

先看看我的postgis库里面,有个schma,叫做world,里面我放了两个图层,一个是世界地图(面要素)、一个是世界主要城市(点要素)

用qgis打开是这个样子的:
那么我们在geopandas里面,也可以通过read_postgis方法,直接打开,但是要注意的是,打开PostGIS库,需要先安装两个包:
一个是sqlalchemy包,这是Python里面最出名的ORM包,如果你不知道ORM(数据库对象映射),那就只要知道这个包是用来把数据库里面的表转化成Python里面的对象的包就行;
第二个就是psycopy2包,这是Python用来连接Postgresql的驱动包。
两个包都很好安装,直接pip就可以了:
读取方式如下:
1、创建连接字符串:格式如下:
postgresql://用户名:密码@服务器地址(ip或者机器名):数据库端口/数据库名称(默认是postgis)

2、通过sql语句,读取数据,然后变成GeoDataframe。
如果有熟悉pandas的同学,肯定对这个流程没啥疑问了,这是标准的pandas读取数据库数据的流程,只不过这里加载了自动读取空间数据的部分。
读完之后,就变成了标准的空间数据框了:



最后,又到了每篇一个小技巧时间,我们知道中国最权威的(官方)数据来自国家统计局,而统计局也提供了一个对外查询网站:

https://data.stats.gov.cn/index.htm

我们可以在里面查询分省数据,而且查询出来的结果,返回的是标准的json字符串:

爬虫基本技能,大家可以去其他地方学习,我这里就不多说了——

下面是我们通过国家统计局的数据,配合GeoPandas,直接制作一张中国人口专题图:

首先是获取国家统计局数据,然后清洗成一个DataFrame:(代码我就不解释了,原因见上图)
得到的结果如下:
接下去,我们来获取中国行政区划的数据,比如我们可以直接用阿里的DataV提供的中国行政区划的geojson:
小贴士:geopandas可以直接读取在线的数据(内置,request能力)。

下面就是直接join之后做专题图即可,如下所示:
其中>650000那句,是筛选出港澳台来,然后用斜杆填充,表示没有获取到数据。

打完收工。

文章转载自虾神说D,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论