玩玩看地理空間資料!(2) — 地理資料幾何運算
上一章製作了幾張資料視覺化的地圖,接下來是更進階的分析~
地理空間分析是透過幾何運算、空間統計來對地理空間特徵進行研究、處理、決策的過程。本篇將會介紹空間資訊分析中常見的幾何運算,Buffer (環域分析), Dissolve (融合分析), Clip (切割), Overlay(疊圖分析) 的功能。
本篇將分為五部份來進行介紹:
- 資料讀取
- Clip
- Dissolve
- Buffer
- Overlay
程式與資料已整理至Github。
Let’s Start!
資料讀取
現在有四份資料從政府開放資料平台獲得 (已做前處理):
- 全台捷運車站 shp (source: https://data.gov.tw/dataset/73233)
- 全台捷運路線圖 json (source: https://data.gov.tw/dataset/121208)
- 大台北地區shp (前一章前處理獲得)
- 台北市Youbile 2.0 站點csv
首先先將所需的資料讀入。Youbike 2.0站點的csv檔要先將其轉換為geopandas的地理資訊格式並設置坐標系以做後續應用。
# read Youbike station csv
Youbike_data_df = pd.read_csv('./Youbike2.0.csv', encoding = "Big5")
# covert csv file to geopandas format (geometry)
Youbike_data_gdf = gpd.GeoDataFrame(
Youbike_data_df, geometry=gpd.points_from_xy(Youbike_data_df.lng, Youbike_data_df.lat)
)
Youbike_data_gdf.head()
# set CRS and transform crs
Youbike_data_gdf.crs = "EPSG:4326"
Youbike_data_gdf = Youbike_data_gdf.to_crs(epsg = 3857)
Youbike_data_gdf.plot(markersize = 1)
讀取全台捷運車站、台北捷運路網圖,並將坐標系轉成TM二度分帶顯示。全台捷運車站視覺化後如圖所示,包含台北、台中、高雄的捷運。
# read MRT shp
MRT_data = gpd.read_file('./MRT/MARK_捷運車站_1111103.shp', encoding='utf-8')
MRT_data.head()
MRT_data = MRT_data.to_crs(epsg=3857)
MRT_data.head()
MRT_data.plot(markersize = 1)
台北捷運路網圖
# Read MRT route
MRTRoutes_gdf =gpd.read_file("TpeMRTRoutes_TWD97.json")
print(MRTRoutes_gdf.head())
MRTRoutes_gdf = MRTRoutes_gdf.to_crs(epsg=3857)
MRTRoutes_gdf.plot()
讀取大台北地區縣市界shp ,並只保留臺北市的範圍。
# read Taipei shp
Big_Taipei_data = gpd.read_file('./Town/Taipei.shp', encoding='utf-8')
Taipei_data = Big_Taipei_data[(Big_Taipei_data['COUNTYNAME']=='臺北市')]
print(Taipei_data.head())
Taipei_data.plot()
接下來要進入幾何操作囉~
Clip (切割)
第一個要介紹的是幾何功能是clip,clip 功能可以將想要的資料透過給定的範圍切割出來。如下圖input就是要被切割的圖層,clip feature就是切割的範圍,切完就會變output圖層。
現在我想要用台北地圖裁切出只有台北捷運的站點,不要新北的捷運站點。首先,先將捷運站圖層的坐標系跟台北地區的坐標系轉換成二度分帶,確保兩者是相同的坐標系才可以做後續操作。用clip
的function,截取出只在台北地區的捷運站。
## 確保相同CRS(Coordinate Reference System)
Taipei_data = Taipei_data.to_crs(epsg=3857)
clip_station = gpd.clip(MRT_data, Taipei_data)
print(clip_station.head())
clip_station.plot(cmap = 'Oranges')
將地圖一起畫出來展示。台北捷運的站點透過clip 幾何操作裁切出來囉~
fig, ax = plt.subplots(figsize=(10, 10))
Taipei_data.plot(cmap='Greys',
ax=ax,
alpha=.5)
clip_station.plot(cmap = 'Oranges', ax=ax,
column='MARKNAME2', markersize = 8, zorder = 2)
MRTRoutes_gdf.plot(color = 'cadetblue', ax = ax, zorder = 1)
plt.axis('equal')
Dissolve (融合分析)
Dissolve的功用是將相似的特徵進行融合,利用相同屬性值融合成一個圖徵,並產出新圖層。
大台北地區的圖層包含台北及新北所有行政區的資訊,如果不想保留行政區的資訊,只顯示台北市和新北市的輪廓,我們可以使用Dissolve功能,將相同屬性的地理圖徵融合。geopandas.dissolve
參數中的by
是你要群組的分類標籤,在這個case 就是臺北市及新北市兩個標籤。
## dissolve
Big_Taipei_data_dissolve = Big_Taipei_data.dissolve(by = 'COUNTYNAME')
Big_Taipei_data_dissolve.plot(cmap = 'summer')
Big_Taipei_data_dissolve.head()
Buffer (環域分析)
環域分析在地理空間分析是很常使用的一個分析方式,藉由設置距離,可以知道該地理現象(點、線、面)會影響的範圍。
現在我想要知道捷運站方圓500公尺內是否有可租借的Youbike2.0站點,我們就可以使用環域分析。
目前坐標系已轉成二度分帶投影,所以單位為公尺。
橘色圓形為buffer區域,在橘色範圍內含有綠色Youbike2.0 站點,表示出捷運站500公尺內就有共享單車。
buffer_station = clip_station.buffer(500)
# visualization
fig, ax = plt.subplots(figsize=(12, 12))
Taipei_data.plot(cmap='Greys', ax=ax, alpha=.5)
buffer_station.plot(ax=ax,
alpha=.5, color = 'orange', zorder = 1)
clip_station.plot(color = 'red', ax=ax,
column='MARKNAME2', markersize = 4, zorder = 4)
Youbike_data_gdf.plot(color = 'green', ax=ax,
column='station', markersize = 1, zorder = 3)
MRTRoutes_gdf.plot(color = 'cadetblue', ax = ax, zorder = 2)
Overlay (疊圖分析)
疊圖分析在空間分析中很常應用於環境的變遷,來看不同時期的環境改變、或是不同資料形式(點、線、面)的疊合,以進行後續的分析。疊圖分析的運算會使用到邏輯運算子,如Instersection, Union, Difference等 (如下圖),建立新的幾何圖形,並保留兩種屬性。
將台北地圖和buffer 500 公尺的捷運站範圍作差集來看看效果(如下圖所示)。當然還有其他邏輯運算子可以自己試試看,根據自己的目的來選擇需要的疊圖分析。
buffer_station_df = gpd.GeoDataFrame(geometry=gpd.GeoSeries(buffer_station))
station_overlay = Taipei_data.overlay(buffer_station_df, how = 'difference')
station_overlay.plot(color = 'orange')
本篇介紹了常見的地理空間資料幾何操作,也用了相關實例來進行實作。如果喜歡這篇文章或覺得有幫助,可以按下 👏 👏 👏支持或分享給更多人!
相關系列
玩玩看地理空間資料!(1) — 用Geopandas資料視覺化
玩玩看地理空間資料!(3) — 地理空間資料連接與分組操作
玩玩看地理空間資料!(4) — Folium互動式地圖