地理與地點資料 是做什麼的?
將地名、地址、座標和郵遞區號轉換為結構化的地理資訊,全部使用無需金鑰的 API。此技能避免的錯誤:因為訓練記憶而直接使用 Google Maps/Places API——需要付費金鑰與啟用帳單——但 Nominatim 能免費回答相同的查詢;或者在數十個列出的地理編碼器中猶豫不決,不知道哪個實際可用。
API 排名
- Nominatim (nominatim.openstreetmap.org) - 地理編碼與反向地理編碼的預設 API。使用 OSM 資料,全球適用,無需金鑰。下方有嚴格的禮儀規則。
- Open-Meteo Geocoder - 僅供城市/城鎮名稱查詢經緯度。速度更快且無規則限制;當輸入是單純的聚落地名而非地址或地標時使用。
- Zippopotam.us - 郵遞區號查詢地點/州/座標,支援超過 60 個國家,無需金鑰。
- APICountries (www.apicountries.com) - 國家資訊:首都、貨幣、語言、人口、國旗、邊界。無需金鑰。(它提供舊版 REST Countries 的回應格式;REST Countries 本身現在在無金鑰的情況下會回傳棄用錯誤——請參閱「請勿使用」章節。)
操作流程
- 分類輸入:地址/地標 → Nominatim 搜尋;座標 → Nominatim 反向查詢;純城市名稱 → Open-Meteo 地理編碼器;郵遞區號 → Zippopotam;國家名稱/代碼 → APICountries。
- 遵守 Nominatim 禮儀——這些是強制執行的規則,而非建議:最多每秒 1 個請求,使用能識別你應用程式的真實 User-Agent(匿名 UA 會被封鎖),禁止批次地理編碼數千行資料。對於批次任務,請在迴圈中加入至少 1 秒的延遲並告知使用者;對於極大量的批次,請告訴使用者此需求需要使用自託管的 Nominatim 或付費地理編碼器,而非持續對公開實例發送請求。
- 將 Nominatim 的座標視為字串讀取——回傳的
lat/lon是 JSON 字串,而非數字。在進行運算前請先解析。
僅在使用者遺漏以下資訊時詢問:地點/座標輸入本身,以及用於辨識模糊名稱(如 "Springfield")的國家背景資料——預設取用 Nominatim 的第一個結果並告知使用者是哪一個。
URL 模板 + 實際回應格式
地理編碼 (搜尋):
https://nominatim.openstreetmap.org/search?q={URL 編碼後的查詢}&format=jsonv2&limit=1
[{"lat":"48.8582599","lon":"2.2945006","name":"Tour Eiffel",
"display_name":"Tour Eiffel, 5, Avenue Anatole France, ..., 75007, France",
"category":"man_made","type":"tower","importance":0.62}]
頂層是一個陣列;空陣列代表無匹配結果。加入 &addressdetails=1 可取得結構化的 address 物件,加入 &countrycodes=us 可限制搜尋國家。
反向地理編碼:
https://nominatim.openstreetmap.org/reverse?lat={經度}&lon={緯度}&format=jsonv2
回傳一個單一物件(而非陣列):display_name,以及在使用 &addressdetails=1(反向查詢預設開啟)時包含 address.{road,city,state,postcode,country_code}。
城市名稱 → 經緯度(當你不需要完整地址時):
https://geocoding-api.open-meteo.com/v1/search?name={城市名稱}&count=1
{"results":[{"name":"Berlin","latitude":52.52437,"longitude":13.41053,
"country_code":"DE","timezone":"Europe/Berlin","population":3426354}]}
當完全沒有匹配結果時,不會有 results 這個鍵——請檢查鍵是否存在,而非檢查是否為空陣列。
郵遞區號:
https://api.zippopotam.us/{國家代碼}/{郵遞區號} ← 例如 /us/90210, /de/10115
{"country":"United States","places":[{"place name":"Beverly Hills",
"state":"California","state abbreviation":"CA","latitude":"34.0901","longitude":"-118.4065"}]}
注意事項:鍵名包含空格("place name"、"post code");座標是字串;未知的郵遞區號會回傳 404 狀態碼且內容為空,而非 JSON。
國家資訊:
https://www.apicountries.com/name/{名稱} ← 模糊搜尋,回傳陣列
https://www.apicountries.com/alpha/{代碼} ← ISO alpha-2/alpha-3 代碼,回傳物件
[{"name":"Japan","capital":"Tokyo","region":"Asia","population":126476461,
"currencies":[{"code":"JPY","symbol":"¥"}],"languages":[{"name":"Japanese"}],
"alpha2Code":"JP","flags":{"png":"https://flagcdn.com/w320/jp.png"}}]
產出結果
結構化的結果(座標轉換為數字、地址組成部分或國家資訊)以及所使用的確切 URL。對於批次任務:迴圈確實有加上節流,並說明速率限制。
請勿使用——請改用 X 代替
- Google Maps / Places, Mapbox, HERE——需要金鑰且會產生帳單費用;上述所有 API 都是免費的。請勿要求使用者註冊。
- REST Countries (restcountries.com)——其傳統端點會回傳棄用錯誤,而替代方案需要驗證金鑰;APICountries 以無需金鑰的方式提供相同的格式。
- ip-api.com 及大多數免費 IP 地理定位方案——免費方案僅支援 HTTP(無法滿足任何 HTTPS 要求);此技能包不包含任何 IP 地理定位 API。
- 你剛完成地理編碼的位置的天氣——請改用 weather-climate。
- 時間序列的國家統計資料——請改用 government-open-data。
品質標準
- Nominatim 請求必須攜帶真實的 User-Agent,且每秒不超過 1 個請求——包括在迴圈內部。
- 字串形式的座標在進行任何數學運算前,必須先解析為數字。
- 模糊的地名必須明確告知解析結果(例如「取用了 Springfield, Illinois——Nominatim 的第一個結果」)。
資料來源及可用性驗證來自 public-apis 專案 (MIT 授權)。