玩玩看地理空間資料!(2) — 地理資料幾何運算

Buffer, Dissolve, Clip, Overlay

Elena
11 min readOct 9, 2023

上一章製作了幾張資料視覺化的地圖,接下來是更進階的分析~

地理空間分析是透過幾何運算、空間統計來對地理空間特徵進行研究、處理、決策的過程。本篇將會介紹空間資訊分析中常見的幾何運算,Buffer (環域分析), Dissolve (融合分析), Clip (切割), Overlay(疊圖分析) 的功能。

本篇將分為五部份來進行介紹:

  1. 資料讀取
  2. Clip
  3. Dissolve
  4. Buffer
  5. Overlay

程式與資料已整理至Github

Let’s Start!

資料讀取

現在有四份資料從政府開放資料平台獲得 (已做前處理):

  1. 全台捷運車站 shp (source: https://data.gov.tw/dataset/73233)
  2. 全台捷運路線圖 json (source: https://data.gov.tw/dataset/121208)
  3. 大台北地區shp (前一章前處理獲得)
  4. 台北市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圖層。

source: https://pro.arcgis.com/en/pro-app/latest/tool-reference/analysis/clip.htm

現在我想要用台北地圖裁切出只有台北捷運的站點,不要新北的捷運站點。首先,先將捷運站圖層的坐標系跟台北地區的坐標系轉換成二度分帶,確保兩者是相同的坐標系才可以做後續操作。用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的功用是將相似的特徵進行融合,利用相同屬性值融合成一個圖徵,並產出新圖層。

source: https://pro.arcgis.com/en/pro-app/latest/tool-reference/data-management/dissolve.htm

大台北地區的圖層包含台北及新北所有行政區的資訊,如果不想保留行政區的資訊,只顯示台北市和新北市的輪廓,我們可以使用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 (環域分析)

環域分析在地理空間分析是很常使用的一個分析方式,藉由設置距離,可以知道該地理現象(點、線、面)會影響的範圍。

source: https://pro.arcgis.com/en/pro-app/latest/tool-reference/analysis/buffer.htm

現在我想要知道捷運站方圓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等 (如下圖),建立新的幾何圖形,並保留兩種屬性。

source: https://geopandas.org/en/stable/docs/user_guide/set_operations.html

將台北地圖和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')
台北地圖和buffer 500 公尺的捷運站範圍之差集

本篇介紹了常見的地理空間資料幾何操作,也用了相關實例來進行實作。如果喜歡這篇文章或覺得有幫助,可以按下 👏 👏 👏支持或分享給更多人!

相關系列

玩玩看地理空間資料!(1) — 用Geopandas資料視覺化
玩玩看地理空間資料!(3) — 地理空間資料連接與分組操作
玩玩看地理空間資料!(4) — Folium互動式地圖

--

--

Elena

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