GeoPandas官方中文文档--译著

GeoPandas是基于Pandas的扩展,增长了地理空间几何对象的处理,本文翻译来自于http://www.cnblogs.com/giserliu/p/4988615.html。原文和工程在http://geopandas.org/
html

GeoPandas官方中文文档--译著

译自GeoPandas 0.1.0 文档(原版译著,有错误欢迎交流,转载请注明)python

  GeoPandas是一个开源项目,它的目的是使得在Python下更方便的处理地理空间数据。GeoPandas扩展了pandas的数据类型,容许其在几何类型上进行空间操做。几何操做由 shapely执行。 GeoPandas进一步依赖于 fiona进行文件存取和 descartes ,matplotlib 进行绘图。git

描述

GeoPandas 的目的是在Python下更容易处理地理数据。它结合了pandas和shaply的功能,提供在pandas下的空间操做和shapel下高层次的处理 多几何构型的接口。GeoPandas 容许你很容易的用Python进行操做,否则的话,你将不得不用一个空间数据库去处理,如PostGIS。github

安装

笔者目前的发现版本是0.1,安装,可使用pip或easy_install:sql

 pip install geopandas

你也能够经过克隆 GitHub上的仓库去安装最新的开发版本,命令脚本以下:数据库

git clone https://github.com/geopandas/geopandas.git
cd geopandas
python setup.py install

一样也能够在PyPI上安装最新的可用开发版本,使用pip,加上--pre安装1.4或者更高的版本,或者直接使用pip从GitHub仓库中安装:json

pip install git+git://github.com/geopandas/geopandas.git

依赖

支持Python版本2.6,2.7,和3.2+数据结构

依赖包:dom

绘图的话会用到另外的一些包:

测试

从源目录下运行当前的测试集,在命令行运行:

nosetests -v

测试自动运行在GitHub库中全部的提交事务上,包括在Travis CI的push请求。

GeoPandas 使用手册

GeoPandas实现了两个主要的数据结构,GeoSeries和GeoDataFrame。它们分别是pandas中Series和DataFrame的子类。

GeoSeries

一个GeoSeries包含一个几何图形的序列。

GeoSeries类实现了几乎全部的Shapely对象的属性和方法。在使用 GeoSeries时,它将应用于序列中全部几何图形的每个元素。二元操做能够在两个GeoSeries对象之间进行,这种状况下二元操做将应用于每一 个元素。这两个序列将按匹配的索引进行对于操做。二元操做也能够应用于单个几何,此时二元操做将对该几何序列的每一个元素进行。在以上两种状况下,操做将会 返回Series或者GeoSeries对象。

在GeoSeries对象中,如下Shapely对象的方法和属性是可使用的:

GeoSeries.area

  返回一个Series,它包含GeoSeries中每一个几何的面积。

GeoSeries.bounds

  返回一个DataFrame,它包含每一个几何的边界,用列值minx, miny, maxx, maxy来表示。

GeoSeries.length

  返回一个Series,它包含每一个几何的长度。

GeoSeries.geom_type

  返回一个字符串的Series,字符串指定每一个对象的几何类型。

GeoSeries.distance(other)

  返回一个Series,它包含与其余GeoSeries对象(每一个元素)或几何对象的最小距离。

GeoSeries.representative_point()

  返回全部点的一个GeoSeries(经简易计算),这些点必须保证在每一个几何的内部。

GeoSeries.exterior

  返回线环(LinearRings)的一个GeoSeries,它表示GeoSeries中每一个多边形的外边界。

GeoSeries.interior

  返回内部环序列的一个GeoSeries,它表示GeoSeries中每一个多边形的内部环。

一元谓词操做

GeoSeries.is_empty

  返回一个布尔型的Series,对于一个空的几何图形,该值就为True。

GeoSeries.is_ring

  返回一个布尔型的Series,对于闭合的要素,该值就为True。

GeoSeries.is_simple

  返回一个布尔型的Series,若是几何体自身不交叉,该值就为True(仅对线串--LineStrings和线环--LineRings有意义)。

GeoSeries.is_valid

  返回一个布尔型的Series,若是几何体是有效的,该值就为True。

二元谓词操做

GeoSeries.almost_equals(other[,decimal=6])

  返回一个布尔型的Series对象,若是在指定的小数位精度下,每一个对象全部点与其余对象大体相等,该值就为True(可见equals())。

GeoSeries.contains(other)

  返回一个布尔型的Series,若是每一个对象的内部包含其余对象的内部和边界,而且它们的边界不相接,该值为True。

GeoSeries.crosses(other)

  返回一个布尔型的Series,若是每一个对象的内部与其余对象的内部相交但不包含,而且相交的部分小于这两个相交对象自身,该值为True。

GeoSeries.disjoint(other)

  返回一个布尔型的Series,若是每一个对象的边界和内部与其余对象的边界和内部都不相交,该值为True。

GeoSeries.equals(other)

  返回一个布尔型的Series,若是几何对象集合的边界,内部,外部都与其余几何对象同样,该值为True。

GeoSeries.intersects(other)

  返回一个布尔型的Series,若是每一个对象的边界和内部以其它任何形式与其余对象相交,该值为True。

GeoSeries.touches(other)

  返回一个布尔型的Series,若是对象与其余对象至少有一个点相同,且它们的内部任何部分都不相交,该值为True。

GeoSeries.within(other)

  返回一个布尔型的Series, 若是每一个对象的边界和内部只与其余对象的内部相交(不包括边界和外部),该值为True(与contains()方法相反)。

集合理论方法

GeoSeries.boundary

  返回一个低维对象每一个几何体的边界集合的GeoSeries。

GeoSeries.centroid

  返回表示几何重心点的一个GeoSeries。

GeoSeries.difference(other)

  返回每一个几何体不在其余对象中的点的一个GeoSeries。

GeoSeries.intersection(other)

  返回每一个几何对象与其余几何对象相交的一个GeoSeries。

GeoSeries.symmetric_difference(other)

  返回一个GeoSeries,它表示每一个几何对象中的点不在其余几何对象中,同时其余几何对象中的点也不在这个几何对象中的部分(注:对称差别)。

GeoSeries.union(other)

  返回每一个几何对象与其余几何对象联合的一个GeoSeries。

构造方法(这样

GeoSeries.buffer(distance,resolution=16)

  返回几何图形的一个GeoSeries,他表示每一个几何对象在给定的距离内的全部点。

GeoSeries.convex_hull

  当对象的点多于三个的时候,返回表示每一个对象全部点的最小凸包多边形的一个GeoSeries;只有两个点的时候,凸包变成了线串;只有一个点的时候,就是当个点。

GeoSeries.envelope

  返回几何图形的一个GeoSeries,它表示包含其它对象的点或者最小矩形(边平行于坐标轴)。注:即包络线

GeoSeries.simplify(tolerance,preserve_topology=True)

  返回包含每一个对象简化表示的一个GeoSeries。

仿射变换

GeoSeries.rotate(self,angle,origin='center',use_radians=False)

  旋转GeoSeries的坐标。

GeoSeries.scale(self,xfact=1.0,yfact=1.0,zfact=1.0,origin='center')

  沿着(x,y,z)上各个方向的尺寸缩放几何图形。

GeoSeries.skew(self,angle,origin='center',use_radians=False)

  按角度沿着x和y维剪切/倾斜几何图形。

GeoSeries.translate(self,angle,origin='center',use_radians=False)

  转变GeoSeries的坐标。

聚合方法

GeoSeries.unary_union

  返回GeoSeries中全部几何体联合的一个几何体。

另外,如下的方法也实现了:

GeoSeries.from_file()

  从文件中加载任何能被fiona识别的格式。

GeoSeries.to_crs(crs=None,epsg=None)

  转换GeoSeries中的几何图形到不一样的坐标参考系统。当前GeoSeries的crs属性必须被设置。crs属性须要被指定以用于输出,或是用字典形式或是用EPSG编码方式。

  这种方法将改变全部对象中的全部点。它没有概念或转换整个几何图形。全部链接点的片断在当前的投影中被认为是线段,而不是测地线。对象跨越国际日期变动线(或其余投影边界)是不被容许的。

GeoSeries.plot(colormap='Set1',alpha=0.5,axes=None)

  进行GeoSeries中几何图形的绘制。colormap能够被matplotlib承认,可是推荐诸如Accent,Dark2,Paired,Pastel1,Pastel2,Set1,Set2,Set3这些离散的colormap。这些都封装在plot_series()函数中。

GeoSeries.total_bounds

  返回一个元组,包含整个series边界的minx,miny,maxx,maxy值。包含在序列中的几何体的边界,能够参照GeoSeries.bounds。

pandas中Series对象的方法也是能够用的,尽管不是全部的都能适用于几何对象,而且一些结果可能返回Series而不是GeoSeries。在GeoSeries中专门实现了copy(), align(), isnull()和fillna()方法,它们是能够正常使用的。

GeoDataFrame

一个GeoDataFrame是一个列表数据结构,它包含一个叫作包含geometry的列,这个geometry包含一个GeoSeries。

如今,GeoDataFrame实现了如下方法:

类方法 GeoDataFrame.from_file(filename, **kwargs)

  从文件中加载能够被fiona识别的任何格式的一个GeoDataFrame。参见read_file()。

类方法GeoDataFrame.from_postgis(sql,con,geom_col='geom',crs=None,index_col=None,coerce_float=True,params=None)

  从PostGIS数据库文件中加载GeoDataFrame。

GeoSeries.to_crs(crs=None,epsg=None,inplace=False)

  转 换GeoDataFrame的geometry列中的全部几何图形到其余坐标参考系统。当前GeoSeries的crs属性必须被设置。crs属性须要被 指定以用于输出,或是用字典形式或是用EPSG编码方式。若是inplace=True,在当前的dataframe中geometry列将被替换,不然 将返回一个新的GeoDataFrame。

  这种方法将改变全部对象中的全部点。它没有概念或转换整个几何图形。全部链接点的片断在当前的投影中被认为是线段,而不是测地线。对象跨越国际日期变动线(或其余投影边界)是不被容许的。

GeoSeries.to_file(filename,driver="ESRI Shapefile",**kwargs)

  将GeoDataFrame写入文件。默认状况下,写成ESRI的shapefile格式。可是经过Fiona,任何OGR数据源也被支持写入。**kwargs被传给Fiona驱动器。

GeoSeries.to_json(**kwargs)

  将GeoDataFrame以字符串的方式表示为GeoJSON对象返回。

GeoSeries.plot(column=None,colormap=None,alpha=0.5,categorical=False,legend=False,axes=None)

  绘制GeoDataFrame中几何图形。若是列参数给定,颜色根据这列的值绘制,不然在geometry列调用GeoSeries.plot()函数。都封装在plot_dataframe()函数中。

全部pandas中DataFrane对象的方法也是能够用的,尽管可能有些针对geometry列正当的操做没有意义也可能不返回GeoDataFrame。

Geopandas函数

GeoSeries.geocode.geocode(strings,provider='googlev3',**kwargs)

  对字符串列表进行地理编码,返回一个GeoDataFrame,它包含在geometry列生成的点。可用的提供者有googlev3,bing,google,yahoo,mapquest和openmapquest,**kwargs将做为参数传递给适当的地理编码器。

  须要使用geopy。请咨询选择的提供商的服务条款。

示例

复制代码

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 = GeoSeries([p1, p2, p3])
g
0    POLYGON ((0.0000000000000000 0.000000000000000...
1    POLYGON ((0.0000000000000000 0.000000000000000...
2    POLYGON ((2.0000000000000000 0.000000000000000...
dtype: object

复制代码

 

一些地理操做返回标准的pandas对象。一个GeoSeries对象的area属性将会返回一个pandas.Series,它包含GeoSeries中每一项的面积.

print g.area
0    0.5
1    1.0
2    1.0dtype: float64

其余操做返回GeoPandas对象:

g.buffer(0.5)
Out[15]:
0    POLYGON ((-0.3535533905932737 0.35355339059327...
1    POLYGON ((-0.5000000000000000 0.00000000000000...
2    POLYGON ((1.5000000000000000 0.000000000000000...
dtype: object

GeoPandas对象能后绘制这些图像。GeoPandas 使用descartes ,用matplotlib库绘制。为生产咱们的GeoSeries图形,使用如下命令:

g.plot()

GeoPandas也实现了替代构造函数,可以读取被fiona识别的格式。为读取包含纽约市镇文件(file containing the boroughs of New York City):

复制代码

boros = GeoDataFrame.from_file('nybb.shp')
boros.set_index('BoroCode', inplace=True)
boros.sort()
boros
               BoroName    Shape_Area     Shape_Leng  \
BoroCode1             Manhattan  6.364422e+08  358532.956418
2                 Bronx  1.186804e+09  464517.890553
3              Brooklyn  1.959432e+09  726568.946340
4                Queens  3.049947e+09  861038.479299
5         Staten Island  1.623853e+09  330385.036974

                                                   geometry
BoroCode1         (POLYGON ((981219.0557861328125000 188655.3157...2         
(POLYGON ((1012821.8057861328125000 229228.264...3         
(POLYGON ((1021176.4790039062500000 151374.796...4         
(POLYGON ((1029606.0765991210937500 156073.814...5         

(POLYGON ((970217.0223999023437500 145643.3322...

复制代码

复制代码

>>> boros['geometry'].convex_hull
0    POLYGON ((915517.6877458114176989 120121.88125...
1    POLYGON ((1000721.5317993164062500 136681.7761...
2    POLYGON ((988872.8212280273437500 146772.03179...
3    POLYGON ((977855.4451904296875000 188082.32238...
4    POLYGON ((1017949.9776000976562500 225426.8845...
dtype: object

复制代码

为展现更复杂的操做,咱们生产包含2000个随机点的一个GeoSeries:

from shapely.geometry import Point

xmin, xmax, ymin, ymax = 900000, 1080000, 120000, 280000
xc = (xmax - xmin) * np.random.random(2000) + xmin
yc = (ymax - ymin) * np.random.random(2000) + ymin
pts = GeoSeries([Point(x, y) for x, y in zip(xc, yc)])

如今在每一个点周围按固定的半径绘制圆:

circles = pts.buffer(2000)

咱们可使用如下命令使这些圆合并成单个shapely的MutiPolygon几何对象:

mp = circles.unary_union

提取在每一个区内的上一步生成的几何对象的部分,可使用:

holes = boros['geometry'].intersection(mp)

而且能够获得区域内这些部分之外的其余部分面积:

boros_with_holes = boros['geometry'].difference(mp)

注意,这个能够简化一点,由于geometry能够在GeoDataFrame中做为属性获得,intersection和difference方法分别是由“&”和“-”操做符实现的。例如,后者能够简单的表示为boros.geometry -mp。

计算每一个区中这些由点缓冲生成的holes的比例,是很容易作到的

复制代码

holes.area / boros.geometry.area
BoroCode1           0.602015
2           0.523457
3           0.585901
4           0.577020
5           0.559507dtype: float64

复制代码

相关文章
相关标签/搜索