中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中如何使用Geopandas

發布時間:2021-11-30 15:26:38 來源:億速云 閱讀:808 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“python中如何使用Geopandas”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“python中如何使用Geopandas”這篇文章吧。

關鍵詞:Python Geopandas  空間數據分析

本文講述了借助Python語言和Geopandas工具包完成一個空間數據分析操作的過程~

作為一名程序員兼職業余空間數據分析師,空間數據的處理一直是一抹揮之不去的烏云。雖然GIS軟件可視化的操作界面、包羅萬象的功能,已經能解決日常工作中幾乎所有問題,但對于身為程序員的我來說,一切不能用鍵盤上26個字母解決的問題,都是不科學的~所以這些年我一直致力于思考一個問題,如何把Arcgis的功能,用代碼的方式實現

我了解到,Geopandas是一個極好的工具,今天我們就以一個案例來管窺一二。

 數據準備&任務明確 

我有一張上海的街鎮地圖,一份上海的房源數據和一份上海餐廳數據。

python中如何使用Geopandas

今天,我們需要制作每一個房源的1KM緩沖區,計算緩沖區內有多少家餐廳,并且計算上海每個街鎮內有多少家餐廳,然后繪制在地圖上展示

這是一個理論上簡單但操作繁瑣的過程,有些同學可能已經知道GIS的操作:

導入地圖數據——導入兩份EXCEL——并關聯經緯度——獲得點數據——并保存點數據圖層——然后對房源點數據進行緩沖區制作——保存緩沖區圖層——分別使用空間關聯把餐廳數據關聯到上海街鎮和房源緩沖區圖層中——并分別保存圖層……

好了好了,我已經說不下去了,我們來看看代碼怎么解決吧~

 導入數據 

先導入各種包

import pandas as pd
import geopandas as gpd
from shapely import geos
from shapely.geometry import Point
import fiona
import matplotlib.pyplot as plt
from fiona.crs import from_epsg,from_string

我們來觀察下python中用到的地理處理工具包的名字:Geopandas. 顧名思義,這個包可以讓我們像使用pandas一樣處理地理數據,大家可以想象一下這過程,一定如絲般順滑!

Geopandas其實是各種地理數據分析包的集大成者,包括shapely,Fiona等,當然還有數據分析相關的包numpy,pandas,所以,在這些提及的包中的功能,都可以混合使用,切換不留痕跡。這里就一并導入了。

導入地圖shp

shanghai_map = gpd.GeoDataFrame.from_file('./上海街鎮/上海街鎮.shp') #讀取shapfile數據為geodataframe格式

Geopandas提供了一種數據格式叫GeoDataFrame,用直白的話概括就是DataFrame加了一列數據,表達地理信息。導入功能Geopandas底層調用的是Fiona包,所以,一些基本參數和可以導入的數據格式,可以參考Fiona的說明文檔。

python中如何使用Geopandas

 查看導入后的數據

python中如何使用Geopandas

和DataFrame如出一轍,但多了一列Geometry來存放地理信息,繪圖看一下

python中如何使用Geopandas

嗯!是長這樣!

接下來,導入房源和餐廳數據

python中如何使用Geopandas

 *這兩份數據是CSV格式,導入成DataFrame,我們發現數據中含有經緯度字段,我們可以根據這兩個字段,也把數據轉換成GeoDataFrame格式

通過經緯度轉換點數據:

def point_to_geo(df,lon,lat):
    df['geometry'] = gpd.GeoSeries(list(zip(df[lon],df[lat]))).apply(Point) #識別經緯度,轉換點數據
    df = gpd.GeoDataFrame(df) #轉換Geodataframe格式
    df.crs = {'init':'epsg:4326'} #定義坐標系WGS84
    del df[lon]
    del df[lat]
    return df


house_data = point_to_geo(house_data,'lon_WGS','lat_WGS') #轉換Geodataframe格式
restaurant_data = point_to_geo(restaurant_data,'lon_WGS','lat_WGS') #轉換Geodataframe格式

*官方文檔請看這里:

python中如何使用Geopandas

繪圖,看看成功與否——以上海街鎮為底圖,兩份點數據疊加在底圖上

base = shanghai_map.plot(color='lightyellow',edgecolor='black',figsize=(15, 15)) #畫底圖
restaurant_data.plot(ax=base,marker='o', color='green', markersize=5) #在底圖上疊加餐廳點數據
house_data.plot(ax=base,marker='o', color='red', markersize=5) #在底圖上疊加房源點數據
plt.gca().xaxis.set_major_locator(plt.NullLocator())#去掉x軸刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator())#去掉y軸刻度
plt.savefig('./map.png',dpi=400) #保存圖片

*這里設置下圖形的基本參數,畫圖功能是基于matplotlib,所以它的一些寫法和功能是通用的。

python中如何使用Geopandas

 顯示OK,那么就進入核心環節~

 分析過程 

在制作緩沖區和空間關聯之前,先需要對圖形進行投影變換,這里仍然寫一個函數:

def wgs84_to_CGCS2000(df,code):
    result = df.to_crs(from_epsg(code))
    return result

shanghai_map_pcs = wgs84_to_CGCS2000(shanghai_map,4549)
house_data_pcs = wgs84_to_CGCS2000(house_data,4549)
restaurant_data_pcs = wgs84_to_CGCS2000(restaurant_data,4549)

*只要知道投影坐標系的ESPG代碼,就可以任意轉換,我們使用GSC2000坐標系。

接著,構建緩沖區圖層,使用buffer()方法,參數為緩沖區的半徑

house_data_buffer = house_data_pcs.buffer(1000) #建立一公里緩沖區

base = shanghai_map_pcs.plot(color='lightyellow',edgecolor='black',figsize=(15, 15))
house_data_buffer.plot(ax=base,color='gray', markersize=5,alpha=0.5)
plt.gca().xaxis.set_major_locator(plt.NullLocator()) #去掉x軸刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator()) #去年y軸刻度
plt.savefig('./map2.png',dpi=400) #保存圖片

構建完成,同樣輸出成地圖查看效果

python中如何使用Geopandas

增加了透明度,我們可以看到市中心的房源密度較高。生成的數據為GeoSeries,數據為緩沖區的地理信息。這里需要使用任意方法把地理信息和其他字段匹配在一起。

buffer_temp = house_data_pcs[['name','geometry']]
buffer_temp['geometry'] = house_data_buffer
house_data_buffer = buffer_temp

下面,我們使用空間關聯,連接餐廳點數據,并獲取餐廳的個數。

spacial_join_restaurant = gpd.sjoin(house_data_buffer,restaurant_data_pcs,how='left',op='contains') #空間連接
spacial_join_restaurant = spacial_join_restaurant.groupby(['name']).count()['title'].to_frame().reset_index() #聚合計算個數
spacial_join_restaurant.columns = ['name','restaurant_count'] #更改列名,方便操作
buffer_result = pd.merge(house_data_pcs,spacial_join_restaurant,left_on='name',right_on='name',how='left') #字段匹配

 *方法是sjoin(),功能和GIS相同,分相交,包含和被包含三種。我們使用包含進行連接,并使用pandas的groupby()方法分組計數。

python中如何使用Geopandas

這樣我們就完成了空間關聯和計算,我們可以使用地圖顯示,并添加圖例:

base = shanghai_result.plot(column='restaurant_count', cmap='Oranges',scheme = 'fisher_jenks'
                             ,legend=True,edgecolor='black',figsize=(15, 15)) #按個數多少疊加底色
plt.gca().xaxis.set_major_locator(plt.NullLocator()) #去掉x軸刻度
plt.gca().yaxis.set_major_locator(plt.NullLocator()) #去年y軸刻度
plt.savefig('./map3.png',dpi=400) #保存圖片

這樣就可以繪制出以街鎮為單位的點密度圖:

python中如何使用Geopandas

最后,我們需要把數據導出保存。我們可以保存為shapfile格式,這里推薦大家直接保存為csv格式,方便分享。也可以根據需要,轉成任意格式。

shanghai_result = wgs84_to_CGCS2000(shanghai_result,4326) #轉換成地理坐標系
shanghai_result.columns = ['town','region','geometry','restaurant_count'] #更改列名為英文,因為數據保存對中文支持不佳
buffer_result = wgs84_to_CGCS2000(buffer_result,4326) #轉換成地理坐標系

shanghai_result.to_csv('./result/shanghai_result.csv') #保存成csv
shanghai_result.to_file('./result/shanghai_result.shp') #保存成shapfile
buffer_result.to_csv('./result/buffer_result.csv') #保存成csv
buffer_result.to_file('./result/buffer_result.shp') #保存成shapfile

 結果檢查 

我們把保存的數據導入Arcgis,可以正常使用~太棒了!

python中如何使用Geopandas

以上是“python中如何使用Geopandas”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肥东县| 新丰县| 武夷山市| 营口市| 尉氏县| 漳浦县| 曲水县| 抚州市| 买车| 嘉禾县| 湾仔区| 尉氏县| 新晃| 安乡县| 介休市| 常宁市| 贡觉县| 皋兰县| 安化县| 九龙坡区| 水富县| 翼城县| 松溪县| 阳新县| 雷山县| 五指山市| 库伦旗| 清水河县| 阳原县| 稷山县| 临西县| 浦县| 乌拉特前旗| 共和县| 嘉鱼县| 建湖县| 顺平县| 丰顺县| 扎鲁特旗| 株洲市| 黄大仙区|