譯自GeoPandas 0.1.0 文檔(原版譯著,有錯誤歡迎交流,轉載請注明)
GeoPandas是一個開源項目,它的目的是使得在Python下更方便的處理地理空間數據。GeoPandas擴展了pandas的數據類型,允許其在幾何類型上進行空間操作。幾何操作由 shapely執行。 GeoPandas進一步依賴於 fiona進行文件存取和 descartes ,matplotlib 進行繪圖。
描述
GeoPandas 的目的是在Python下更容易處理地理數據。它結合了pandas和shaply的功能,提供在pandas下的空間操作和shapel下高層次的處理多幾何構型的接口。GeoPandas 允許你很容易的用Python進行操作,不然的話,你將不得不用一個空間數據庫去處理,如PostGIS。
安裝
筆者目前的發現版本是0.1,安裝,可以使用pip或easy_install:
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倉庫中安裝:
pip install git+git://github.com/geopandas/geopandas.git
依賴
支持Python版本2.6,2.7,和3.2+
依賴包:
- numpy
- pandas (version 0.13 or later)
- shapely
- fiona
- six
- geopy 0.99 (optional; for geocoding)
- psycopg2 (optional; for PostGIS connection)
繪圖的話會用到另外的一些包:
測試
從源目錄下運行當前的測試集,在命令行運行:
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.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
