資料科學 地理資訊系統 教學

擷取 Google 地圖圖資並輸出 CSV 格式

擷取 Google 地圖圖資並輸出 CSV 格式

一、教學目標

  1. 知識目標:了解 Google 地圖資料的來源(Google My Maps 與 Google Maps API)及其應用場景。
  2. 技能目標:學會使用兩種方法(KML 轉換與 API 抓取)從 Google 地圖中提取資料並輸出為 CSV 格式。
  3. 態度目標:培養學生對地圖資料處理的興趣,並理解程式化工具在資料分析中的實用性。

二、前置準備

適用對象

  • 對象:高中生、大學生或對 Python 程式設計與地圖資料有興趣的初學者。
  • 先備知識:基本的 Python 程式設計能力(檔案讀寫、套件安裝)。

所需軟硬體

  1. 硬體:具備網路連線的電腦。
  2. 軟體
    • Python 3.x(建議安裝 Anaconda)。
    • 必要 Python 套件:pykml(或 xml.etree.ElementTree)、requests
    • 文字編輯器(如 VS Code)。
  3. 其他
    • Google 帳號(用於 Google My Maps)。
    • Google Cloud 帳號(申請 API Key)。
    • 可選:範例 Google My Maps 地圖(如自訂餐廳地圖)。

教師準備

  • 準備一個範例 Google My Maps 地圖(至少包含 5 個地點)。
  • 預先測試程式碼並確認環境可運行。
  • 提供安裝套件與申請 API Key 的簡易指南(PDF 或投影片)。

三、教學流程

時間分配:總計 90 分鐘

  • 導入(10 分鐘)
  • 方法 1 講解與實作(30 分鐘)
  • 方法 2 講解與實作(40 分鐘)
  • 總結與討論(10 分鐘)

1. 導入(10 分鐘)

活動:情境引導

  • 教師提問
    「假設你想收集台北市所有咖啡廳的位置資料,然後分析它們的分布,你會怎麼做?」
  • 簡介 Google 地圖資料
    • 說明 Google 地圖的資料來源(Google My Maps 與 Places API)。
    • 介紹 CSV 格式的用途(可用於 Excel、GIS 軟體等)。
  • 目標導引
    「今天我們會學習兩種方法,從 Google 地圖提取資料並轉成 CSV,幫助你處理地圖資料!」

2. 方法 1:從 Google My Maps 下載 KML 並轉換為 CSV(30 分鐘)

講解(10 分鐘)

  • 介紹 KML 檔案
    • KML 是什麼?(Keyhole Markup Language,一種地圖資料格式)。
    • 如何從 Google My Maps 取得 KML。
  • 展示步驟
    1. 開啟範例 Google My Maps。
    2. 點選「選單 > 下載 KML」,儲存為 map.kml
    3. 簡介 Python 程式如何解析 KML(名稱、經緯度)。

實作活動(20 分鐘)

  • 學生任務
    1. 使用教師提供的範例地圖,下載 KML 檔案。
    2. 執行以下程式碼,將 KML 轉為 CSV:
import csv
import xml.etree.ElementTree as ET

# 讀取 KML 檔案
kml_file = "map.kml"
tree = ET.parse(kml_file)
root = tree.getroot()

# 定義 KML 命名空間
namespace = {"k": "http://www.opengis.net/kml/2.2"}

# 找出所有地點
places = root.findall(".//k:Placemark", namespace)

# 存儲資料
data = []
for place in places:
    name = place.find("k:name", namespace).text
    coordinates = place.find(".//k:coordinates", namespace).text.strip()
    lon, lat, _ = coordinates.split(",")
    data.append([name, lat, lon])

# 輸出 CSV
csv_filename = "google_map_data.csv"
with open(csv_filename, "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["Name", "Latitude", "Longitude"])
    writer.writerows(data)

print(f"已成功將 KML 轉換為 CSV:{csv_filename}")
  • 成果檢查:學生打開生成的 google_map_data.csv,確認資料正確。

3. 方法 2:使用 Google Maps Places API 抓取地點資料(40 分鐘)

講解(15 分鐘)

  • 介紹 Places API
    • 什麼是 API?(應用程式介面,可從 Google 伺服器提取資料)。
    • 如何申請 API Key(簡述 Google Cloud Console 流程)。
  • 展示步驟
    1. 設定搜尋條件(經緯度、半徑、類型)。
    2. 使用 Python 發送請求並解析回傳資料。
  • 範例展示:以台北 101 附近餐廳為例,生成 CSV。

實作活動(25 分鐘)

  • 學生任務
    1. 使用教師提供的 API Key(或自行申請)。
    2. 修改以下程式碼,搜尋自己感興趣的地區與類型(如景點、商店):
import requests
import csv

API_KEY = "你的API金鑰"
LOCATION = "25.0330,121.5654"  # 台北101
RADIUS = 5000  # 搜尋半徑
TYPE = "restaurant"  # 可改為其他類型

url = f"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={LOCATION}&radius={RADIUS}&type={TYPE}&key={API_KEY}"

response = requests.get(url)
data = response.json()

# 存成 CSV
csv_filename = "google_places.csv"
with open(csv_filename, "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["Name", "Latitude", "Longitude", "Address"])
    for place in data["results"]:
        name = place["name"]
        lat = place["geometry"]["location"]["lat"]
        lon = place["geometry"]["location"]["lng"]
        address = place.get("vicinity", "N/A")
        writer.writerow([name, lat, lon, address])

print(f"已成功擷取地點資料並存為 CSV:{csv_filename}")
  • 成果檢查:學生檢視生成的 google_places.csv,確認包含地點名稱與座標。

4. 總結與討論(10 分鐘)

  • 教師總結
    • 方法 1 適合已有地圖資料,簡單快速。
    • 方法 2 適合動態搜尋,功能強大但需 API。
  • 學生討論
    • 「你覺得哪種方法更適合你的需求?為什麼?」
    • 「這些資料可以用來做什麼?(如地圖視覺化、商業分析)」

四、評量方式

  1. 實作成果(70%)
    • 成功生成 google_map_data.csv(方法 1)。
    • 成功生成 google_places.csv(方法 2)。
  2. 參與討論(30%)
    • 在總結時提出想法或問題。

五、延伸應用

  1. 進階挑戰
    • 在方法 2 中,加入「評分」「評論數」等欄位(查詢 Places API 文件)。
    • 將 CSV 匯入 Google Sheets 或 QGIS,製作地圖視覺化。
  2. 實務專案
    • 收集某城市所有學校位置,分析教育資源分布。
    • 搜尋旅遊景點,規劃旅遊路線。

六、教學資源