はじめに
先日、ZOZO.swiftにて登壇させていただき、「MapKitとオープンデータで実現する地図情報の拡張と可視化」というタイトルで発表させていただきました。
5分間の発表でしたので、具体的な変換方法やコードを省いて紹介しました。
概要
本記事では、SwiftのMapKitとオープンデータを使用して地図にデータを表示するまでの方法の説明をします。
※発表スライドと内容が重複する箇所があります
国や地方自治体のオープンデータとは
国や自治体が二次利用可能な状態で公開しているデータのこと
例えば...
公衆無線LANアクセスポイント
東京都港区内にある80箇所のアクセスポイントの座標、住所
東京消防庁管内の消火栓及び防火水槽等の位置
消火栓および防火水槽の座標
都道の街路樹リスト
東京都の都道の街路樹の計測データ、座標など(一部の区のみ)
交通違反重点取締場所一覧
東京都内の交通違反重点取締場所の座標、取締理由など
使い道は?
わかりません。表示してみると次のような感じになります。
データ取得から表示までの流れ
データを取得する→データを整形する→データを表示する
このフローは一見して簡単に見えますが、データ量が多いと整形にするために時間がかかります。
Pythonで整形する、データ形式を変換するなどケースバイケースですが、手間のかかる作業が入ってきます。
データを取得する
データの取得方法は主に2つあります。
- MCPを使用して欲しいデータを検索し、取得
- オープンデータを公開しているサイトにてダウンロードする
MCPを使用して欲しいデータを検索し、取得
MCPはまだ多くのデータに対応しているわけではないことと、データ量が多いと取得に失敗するといったことがあるので、まだまだ一般的に使えそうではないですが、APIの知識が不要で取得できるのはとても便利だと感じます。
国土交通省が2025年11月に公開したMCPがありますので、ご興味がある方は使ってみてください。
※ご利用にはAPIの利用登録(無料)が必要です
MCP自体はローカルで動かすので、GithubのリポジトリのREADME.mdを参考にしてみてください。
オープンデータを公開しているサイトにてダウンロードする
例えば東京都のオープンデータだとこのようなサイトがあります。
検索してみるとこんな感じで街路樹のデータにたどり着きます。『探索』というユーモアあふれるボタンを押してダウンロードすることができます。
データ形式は様々ありますが、こちらの例では.csvです。
データを整形する
地図に関するデータを保持することを考えた時には、まずGeoJSON形式が良さそうです。
座標のデータや場所に関するデータ(建物名、住所、説明など)をまとめて保持できます。
GeoJSONとは
地理情報をエンコードするためのフォーマットのこと
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [123.5678, 12.3456]
},
"properties": {
"name": "Sample Office"
}
}
こちらのGeoJSONを例に取ると、以下のキーがあります。
-
type
GeoJSONの全体の形式を決定するもの -
geometry
それがどこにあるかの地理情報を持つ -
properties
それが何かを示す情報を持つ
データをGeoJSON形式に変換する
XML形式からGeoJSONに変換するなら?
→ Pythonでコードを実行して変換する
def xml_to_geojson(xml_file: str, output_file: str = None) -> dict:
tree = ET.parse(xml_file)
root = tree.getroot()
geojson = {
"type": "FeatureCollection",
"features": []
}
for location in root.findall('location'):
coords = location.find('coordinates')
lat = float(coords.find('latitude').text)
lon = float(coords.find('longitude').text)
feature = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [lon, lat]
},
"properties": {
"id": location.get('id'),
"name": location.find('name').text,
"description": location.find('description').text,
"category": location.find('category').text
}
}
geojson["features"].append(feature)
if output_file:
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(geojson, f, ensure_ascii=False, indent=2)
return geojson
※コードは一部省略しております
こんな感じのコードを実行して変換します。ちなみに生成AIに依頼すれば爆速で作ってくれます。
データを表示する
SwiftでMapKitを使用して表示します。
やることはシンプルで、GeoJSONをデコード→マップ上に表示
デコードする
普通のJSONデータと同じで、JSONDecoderでデコードするだけで大丈夫です。
let data = try Data(contentsOf: url)
let decoder = JSONDecoder()
let json = try decoder.decode(HogeHogeGeoJSON.self, from: data)
※コードは一部省略しております
データをMapKitで表示する
基本的な書き方はこんな感じです。
MKPolygon
var polygons: [MKPolygon] = []
for feature in HogeHogeGeoJSON.features {
let polygon = MKPolygon(coordinates: &coordinates, count: coordinates.count)
polygons.append(polygon)
}
mapView.addOverlays(polygons)
※コードは一部省略しております
MKPointAnnotation
var annotations: [MKPointAnnotation] = []
let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
annotation.title = ""
annotations.append(annotation)
mapView.addAnnotations(annotations)
※コードは一部省略しております
さいごに
生成AIを使えばデータの変換から表示までを1つのプロンプトで実行することができます。
生成AIのおかげで大量のデータを短時間で処理することができ、昔は気軽にできなかったことができるので、皆さんも遊んでみてください。
