譯自GeoPandas 0.1.0 文檔(原版譯著,有錯誤歡迎交流,轉載請註明)html
GeoPandas是一個開源項目,它的目的是使得在Python下更方便的處理地理空間數據。GeoPandas擴展了pandas的數據類型,容許其在幾何類型上進行空間操做。幾何操做由 shapely執行。 GeoPandas進一步依賴於 fiona進行文件存取和 descartes ,matplotlib 進行繪圖。python
GeoPandas 的目的是在Python下更容易處理地理數據。它結合了pandas和shaply的功能,提供在pandas下的空間操做和shapel下高層次的處理多幾何構型的接口。GeoPandas 容許你很容易的用Python進行操做,否則的話,你將不得不用一個空間數據庫去處理,如PostGIS。git
筆者目前的發現版本是0.1,安裝,能夠使用pip或easy_install:github
pip install geopandas
你也能夠經過克隆 GitHub上的倉庫去安裝最新的開發版本,命令腳本以下:sql
git clone https://github.com/geopandas/geopandas.git cd geopandas python setup.py install
一樣也能夠在PyPI上安裝最新的可用開發版本,使用pip,加上--pre安裝1.4或者更高的版本,或者直接使用pip從GitHub倉庫中安裝:數據庫
pip install git+git://github.com/geopandas/geopandas.git
支持Python版本2.6,2.7,和3.2+json
依賴包:數據結構
繪圖的話會用到另外的一些包:dom
從源目錄下運行當前的測試集,在命令行運行:ide
nosetests -v
測試自動運行在GitHub庫中全部的提交事務上,包括在Travis CI的push請求。
GeoPandas實現了兩個主要的數據結構,GeoSeries和GeoDataFrame。它們分別是pandas中Series和DataFrame的子類。
一個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是一個列表數據結構,它包含一個叫作包含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。
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.0 dtype: 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 \ BoroCode 1 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 BoroCode 1 (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 BoroCode 1 0.602015
2 0.523457
3 0.585901
4 0.577020
5 0.559507 dtype: float64