资讯专栏INFORMATION COLUMN

从pandas到geopandas

dunizb / 2041人阅读

摘要:也支持直接从已有的对象生成,示例如下输出为示例路网下面这个例子,首先获取一个城市如青岛的空间范围,根据这个范围下载的道路数据存入对象,然后绘制出来。

(欢迎转载,需要保留文末的个人微信公众号二维码)

pandas简介

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

看一个dataframe的实例

geopandas简介

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

Pandas 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)

输出为

示例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

输出为


{"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’自动获取。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44327.html

相关文章

  • Python绘制数据动态图的方法详解

      小编写这篇文章的一个主要目的,主要是给大家去做一个介绍,介绍的内容是,利用Python这门语言,去绘制相关的数据动态图表,那么,具体的绘制方法是什么呢?下面小编就给大家详细的解答。  数据动态图怎么做,效果图,  多子图联动竞赛图  安装  pipinstallpandas_alive   #或者   condainstallpandas_alive-cconda-forge   玩起来  支...

    89542767 评论0 收藏0
  • 用Python做地图投影 - 多面孔的世界

    摘要:如需转载,请在显著位置注明个人微信公众号为什么要做地图投影简而言之,地球表面是一个三维的曲面,在曲面上进行测量是非常困难的。拓展同一个世界,不同的面孔链接在不同投影下的这个世界。。。 (如需转载,请在显著位置注明个人微信公众号stdrei) 为什么要做地图投影 简而言之,地球表面是一个三维的曲面,在曲面上进行测量是非常困难的。不信你拿个地球仪量一下两点的距离或者计算个夹角试试。将三维的...

    widuu 评论0 收藏0
  • 还在抱怨pandas运行速度慢?这几个方法会颠覆你的看法

    摘要:它还使用执行所谓的链式索引,这通常会导致意外的结果。但这种方法的最大问题是计算的时间成本。这些都是一次产生一行的生成器方法,类似中使用的用法。在这种情况下,所花费的时间大约是方法的一半。根据每小时所属的应用一组标签。 作者:xiaoyu 微信公众号:Python数据科学 知乎:python数据分析师 showImg(https://segmentfault.com/img/bVboe...

    keelii 评论0 收藏0
  • Pandas之旅(一): 让我们把基础知识一次撸完,申精干货

    为什么你需要pandas 大家好,今天想和大家分享一下有关pandas的学习新的,我因工作需要,从去年12月开始接触这个非常好用的包,到现在为止也是算是熟悉了一些,因此发现了它的强大之处,特意想要和朋友们分享,特别是如果你每天和excel打交道,总是需要编写一些vba函数或者对行列进行groupby啊,merge,join啊之类的,相信我,pandas会让你解脱的。 好啦,闲话少说,这篇文章的基础...

    tuomao 评论0 收藏0
  • 一文带你斩杀Python之Numpy☀️Pandas全部操作【全网最详细】❗❗❗

    目录Numpy简介Numpy操作集合1、不同维度数据的表示1.1 一维数据的表示1.2 二维数据的表示1.3 三维数据的表示2、 为什么要使用Numpy2.1、Numpy的ndarray具有广播功能2.2 Numpy数组的性能比Python原生数据类型高3 ndarray的属性和基本操作3.1 ndarray的基本属性3.2 ndarray元素类型3.3 创建ndarray的方式3.4 ndarr...

    asoren 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<