从pandas到geopandas

浏览: 1428

pandas简介

Pandas是Python的一个结构化数据分析的利器。其中,DataFrame是比较常用的处理数据的对象,类似于一个数据库里的table或者excel中的worksheet,可以非常方便的对二维数据读取(xls,csv,hdf等)、增删改查、基本绘图等。pandas应该是用python做数据分析必不可少的工具。

看一个dataframe的实例:


geopandas简介

DataFrame相当于GIS数据中的一张属性表,为了将pandas的特性用到空间数据,就有了geopandas。其目标是使得在python中操作地理数据更方便。

GeoPandas is an open source project to make working with geospatial data in python easier. GeoPandas extends the datatypes used by pandas to allow spatial operations on geometric types. Geometric operations are performed by shapely. Geopandas further depends on fiona for file access and descartes and matplotlib for plotting.

geopandas结合了pandas和shapely的功能,扩展了pandas在空间数据操作方面的能力,从而使得可以轻松的用python实现空间数据分析。

看一个geodataframe的实例:


与dataframe相对,直观的区别是多了一个geometry的字段。

安装

pip install geopandas
# or
conda install -c conda-forge geopandas

官网示例

先直接照搬官网上的例子

p1 = Polygon([(0, 0), (1, 0), (1, 1)])
p2 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
p3 = Polygon([(2, 0), (3, 0), (3, 1), (2, 1)])
g = gpd.GeoSeries([p1, p2, p3])
g.plot()


可以非常方便的计算面积和缓冲区:

print g.area
g.buffer(0.5).plot()


还有其他空间数据分析的功能,有兴趣可以去官网了解下。

示例2:构建geodataframe对象

gepandas提供了多个读取矢量空间数据的接口,支持包括shapefile,geojson等。也支持直接从已有的dataframe对象生成geodataframe,示例如下:

df = pd.DataFrame(np.random.randn(50, 3),columns=['X', 'Y', 'Z'])
geom = [shapely.geometry.Point(xy) for xy in zip(df.X, df.Y)]
gdf = geopandas.GeoDataFrame(df, geometry=geom)
print type(gdf)

输出为

<class 'geopandas.geodataframe.GeoDataFrame'>

例子3. osm路网

下面这个例子,首先获取一个城市(如青岛)的空间范围,根据这个范围下载openstreetmap的道路数据存入geodataframe对象,然后绘制出来。

1. 获取空间范围

这里用之前提到的geocoder这个工具,网友也提到这些地理编码获取的坐标并不准确,我们暂且先考虑精度的问题。

import geocoder
from shapely.geometry import Polygon

g = geocoder.arcgis(u"青岛")
min_lat = g.bbox.get('southwest')[0]
min_lon = g.bbox.get('southwest')[1]
max_lat = g.bbox.get('northeast')[0]
max_lon = g.bbox.get('northeast')[1]

boundary = Polygon([(min_lon, min_lat),(min_lon,max_lat),(max_lon,max_lat), (max_lon, min_lat)])

这样获取到的青岛市的空间范围(外接矩形)为

{'northeast': [36.209606, 120.482939], 'southwest': [35.987606, 120.260939]}

2. 下载osm数据

这里用到geopandas_osm这个工具,安装命令为

pip install git+https://github.com/jwass/geopandas_osm.git

将空间范围的polygon对象作为参数即可,可以查看一下对象类型和投影参数:

import geopandas_osm.osm
df = geopandas_osm.osm.query_osm('way', boundary, recurse='down', tags='highway')

print type(df)
print df.crs

输出为

<class 'geopandas.geodataframe.GeoDataFrame'>
{'init': 'epsg:4326', 'no_defs': True}

直接获取到的osm数据比较乱,做进一步筛选:

way = df[df.type == 'LineString'][['highway', 'name', 'geometry']]
way.head()


可以计算道路的长度,这里只是示意。直接计算length并不对,应该先投影到平面坐标系。

df.ix[0].geometry.length

输出为

0.0014679943869086182

3. 绘制路网

可以直接用plot命令,绘制出来:

way.plot(column="name",colormap=cm.coolwarm_r)


有兴趣大家可以试试自己城市的。

代码下载

如果对本文中的代码(.ipynb文件)感兴趣,百度网盘链接:http://pan.baidu.com/s/1mh8FghE, 密码请在关注个人微信公众号stdrei后,输入口令‘pandas2geo’自动获取。

推荐 1
本文由 时空Drei 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册