玩玩看地理空間資料!(3) — 地理空間資料連接與分組操作

Group by, Spatial join, Geocoding

Elena
7 min readOct 16, 2023

上一篇介紹了幾個常見的地理空間資料操作,接下來本篇要來玩玩看更進階的地理空間資料工具—Group by (分組)及Spatial join (空間連接),除此之外,Geocoding(地理編碼)的概念也會結合空間連接一起實作~

本篇將會分為兩部分:

  1. Group by (分組)
  2. Spatial join (空間連接) + Geocoding(地理編碼)

使用資料:

  1. Youbike2.0 於2023 2月的租借資料(為了方便運算,已將幾百萬筆資料濃縮成1000筆)。
  2. 台北行政區(shp)。

程式與資料已整理至Github

Let’s Start!

Groupby (分組)

geopandas 中的分組操作與 pandas 中的分組類似,它允許你根據一個或多個列對地理空間資料進行分組,然後對每個分組應用聚合函數(例如求和、計數、平均值等)。

2023年2月Youbike2.0租借資料有當月各站點的租借時間、歸還日期等紀錄。如果我想看這份資料中各個站點的租借次數,可以用groupby 組成群組,並使用size參數來進行計算。如圖列出各rent_station的租借次數。

Youbike_groupby = Youbike_rent.groupby(['rent_station']).size()
Youbike_groupby

Spatial join (空間連接)

空間連接是基於它們之間的空間關係,允許你將兩個地理空間資料集合併(merge)或連接(join)。這種關係可以是交叉、包含、相交等。空間連接的主要目的是在不同的空間資料集之間進行查詢和分析。

2023年2月Youbike2.0租借資料裡的資訊包含租借時間(rent_time)、租借站點(rent_station)、歸還時間(return_time)、歸還地點(return_station)、租借時長(rent)、日期(infodate),如下圖所示。但這份資料並沒有行政區的資訊,這時候就可以用spatial join來獲得該空間資訊。

2023年2月Youbike2.0租借資料

進行空間連結前,會需要先做前處理。由於這份資料並沒有各站點的經緯度,所以可以透過geocoding,輸入站點獲得相對應的經緯度坐標。

geocoding (地理編碼) : 輸入實體地址、地標以獲得地理座標的方式。

我們會使用geopy套件,geopy 套件里包含多個地圖API,如Google地圖, open map, Nominatim等,Nominatim是一個地理編碼(geocoding)的套件,透過輸入地址、地標,可以獲得相對應的經緯度。

Youbike2.0 租借資料裡的rent_station做為要獲得的地理坐標的輸入,並將經緯度加入至table欄位。

設定geocode的參數時,可以限制查找區域 (country_codes = “TW”),雖然已限制查找區域,但因為不是給定詳細地址,還是會定位到非台北地區的座標點。

## geocoding
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="my-exercise")

def geocoder(row):
try:
point = geolocator.geocode(row, country_codes = "TW").point
return pd.Series({'Latitude': point.latitude, 'Longitude': point.longitude})
except:
return None

Youbike_rent[['Latitude', 'Longitude']] = Youbike_rent.apply(lambda x: geocoder(x['rent_station']), axis=1)
Youbike_rent.head()
添加經緯度的2023年2月Youbike2.0租借資料

將經緯度轉成geometry格式,並設定投影坐標參考系統。

Youbike_rent = Youbike_rent.loc[~np.isnan(Youbike_rent["Latitude"])]
Youbike_rent = gpd.GeoDataFrame(
Youbike_rent, geometry=gpd.points_from_xy(Youbike_rent.Longitude, Youbike_rent.Latitude))
Youbike_rent.crs = "EPSG:4326"
Youbike_rent = Youbike_rent.to_crs(epsg=4326)
Youbike_rent.head()

接下來輸入要連接的大台北地區圖層,含有行政區資料。

Big_Taipei_data = gpd.read_file('./Town/Taipei.shp', encoding='utf-8')
Big_Taipei_data.head()
Big_Taipei_data = Big_Taipei_data.to_crs(epsg=4326)

透過geopandas 的sjoin來進行空間屬性連接,其中參數how 決定連接的方式,left 代表使用 left_df 中的key;僅保留 left_df gemetry那欄。可以看到連接結果出現行政區欄位了!

Youbike_sjoin = gpd.sjoin(Youbike_rent, Big_Taipei_data, how = 'left')
Youbike_sjoin.head()

最後視覺化透過gecoding所獲得的站點地理座標(已裁切掉非大台北地區的點位)。

以上就是常見的地理空間資料幾何操作~如果喜歡這篇文章或覺得有幫助,可以按下 👏 👏 👏支持或分享給更多人!

相關系列

玩玩看地理空間資料!(1) — 用Geopandas資料視覺化
玩玩看地理空間資料!(2) — 地理資料幾何運算
玩玩看地理空間資料!(4) — Folium互動式地圖

--

--

Elena

AI Engineer | Data | GIS | 金魚腦女子,希望可以透過文字記錄以喚起被遺忘的記憶。