前文再续,书接上一回。
我们简单介绍一下geopandas的数据结构。
1、DataFrame与Series
geopandas做为Pandas的一个扩展,它的数据结构肯定是依附与pandas的,而Pandas的核心数据结构就是DataFrame与Series。
这个两个概念,如果属性pandas的同学,自然不必多说,我这里仅做一个简单介绍,详细的内容大家自行去网上了解学习:
首先,我们可以用一个二维矩阵,或者一个二维表格,来进行类比,DataFrame就是一个二维矩阵或者二维表格:
这个二维表里面的每一列,就可以看成是一个Series。
在一个表格里面,如果我们要范围其中某一行,是如何访问的呢?
(思考题,领导要的第三行数据,到底是CC还是DD?)
(答:普通人是CC,码农是DD,因为码农是从0开始数数的[手动狗头,请勿当真])。
码农参加拓展真实情况:
一般来说,每一行都会有一个标识,这个标识需要是在整个表中是独一无二的,这样在指定的时候,才不会出现歧义,在pandas的DataFrame里面,这个东西叫做index(索引),如下所示:
默认的索引自然就是数字行号,而DataFrame可以自由设置任何一种内容为index,这里就不做演示了,大家可以去查看pandas相关教程文档。
前面说到这个DataFrame的每一列都是一个Series,对应在Python的数据结构里面,一个Series,就是一个带有index的list:
list类似于Java里面的集合,它可以存放任意类型的数据,用下标进行访问,比如一个人的信息,组成成一个list,比如:
这个list里面,可以是数字、字符串、图片对象、文件对象、视频对象、还可以包含另外一个list……
那么Series也是一样,本身就是一个一维的list,可以存放任意对象,不过一般来说,每个Series的类型都是一样的。
结合index之后,Series就可以表示为Python里面的字典结构:{index:[]}
如下所示:
{"name":[……]}
{"age":[……]}
{"sex":[……]}
geopandas做为pandas的扩展库,就在pandas的DataFrame上增加了一个geometry字段:
同时把DataFrame派生为GeoDataFrame;把Series派生为GeoSeries,继承了DataFrame和Series的所有特性和能力。
pandas上面具备的所有DataFrame和Series的能力,比如查询、转换、聚合、切片等等,在GeoDataFrame和GeoSeries都一应俱全,属性上面的操作,大家自行查阅pandas的相关文档即可,这里就不做赘述了。
2、GeoDataFrame和GeoSeries里面的geometry对象。
如果我们直接show出geometry的内容,是这个样子的:
熟悉GIS的同学,肯定对这种格式很熟悉,这种格式称为wkt
WKT(Well-knowntext)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。wkt是一种ascii码描述的文本标记语言,可以用明文表示空间对象,所以在PostGIS里面,也默认采用这种格式来进行显示。但是如果我们直接显示GeoDataFrame的geometry对象:里面的类型个geometry,也就是说,这是一个对象,而不是一个文本字符串。在GeoDataFrame里面,记录空间对象,用的是shapely里面的对象结构shapely库继承自GEOS以及JTS的空间描述,是一个用于在Python中进行地理空间处理的库,主要定义了一系列操作和分析笛卡尔坐标系中的几何对象。(没有三维能力)我们通过help简单扫一眼,就可以看见这个类了:下面我们可以通过两个例子,来看看如何自定义空间对象:首先对点的定义,我们可以直接用过shapely.geometry包下面的Point类进行初始化。我们可以看见,初始化之后,得到的是一个shapely.geometry.point.Point对象。如果是面和线,我们也可以通过wkt字符串来初始化:GeoDataFrame和GeoSeries,除了完全具备pandas的能力以外,还需要一些特殊的空间操作的能力。下面演示一个小案例:
如果裸装绘制行*区划,虽然也能看,但是效果也就这样了,在制图表达的时候,我们可以在外面加一个边界背景——最简单的就是做一个发光的效果:
在geopandas里面,也就是几行代码的事情,如下所示:
打完收工。
godxia