4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

国や地方自治体のオープンデータで遊んでみる

Last updated at Posted at 2025-12-12

はじめに

先日、ZOZO.swiftにて登壇させていただき、「MapKitとオープンデータで実現する地図情報の拡張と可視化」というタイトルで発表させていただきました。

5分間の発表でしたので、具体的な変換方法やコードを省いて紹介しました。

概要

本記事では、SwiftのMapKitとオープンデータを使用して地図にデータを表示するまでの方法の説明をします。
※発表スライドと内容が重複する箇所があります

国や地方自治体のオープンデータとは

国や自治体が二次利用可能な状態で公開しているデータのこと

例えば...

公衆無線LANアクセスポイント

東京都港区内にある80箇所のアクセスポイントの座標、住所

東京消防庁管内の消火栓及び防火水槽等の位置

消火栓および防火水槽の座標

都道の街路樹リスト

東京都の都道の街路樹の計測データ、座標など(一部の区のみ)

交通違反重点取締場所一覧

東京都内の交通違反重点取締場所の座標、取締理由など

使い道は?

わかりません。表示してみると次のような感じになります。

データ取得から表示までの流れ

データを取得する→データを整形する→データを表示する

このフローは一見して簡単に見えますが、データ量が多いと整形にするために時間がかかります。
Pythonで整形する、データ形式を変換するなどケースバイケースですが、手間のかかる作業が入ってきます。

データを取得する

データの取得方法は主に2つあります。

  • MCPを使用して欲しいデータを検索し、取得
  • オープンデータを公開しているサイトにてダウンロードする

MCPを使用して欲しいデータを検索し、取得

MCPはまだ多くのデータに対応しているわけではないことと、データ量が多いと取得に失敗するといったことがあるので、まだまだ一般的に使えそうではないですが、APIの知識が不要で取得できるのはとても便利だと感じます。

国土交通省が2025年11月に公開したMCPがありますので、ご興味がある方は使ってみてください。
※ご利用にはAPIの利用登録(無料)が必要です

MCP自体はローカルで動かすので、GithubのリポジトリのREADME.mdを参考にしてみてください。

オープンデータを公開しているサイトにてダウンロードする

例えば東京都のオープンデータだとこのようなサイトがあります。

検索してみるとこんな感じで街路樹のデータにたどり着きます。『探索』というユーモアあふれるボタンを押してダウンロードすることができます。

データ形式は様々ありますが、こちらの例では.csvです。

image.png

データを整形する

地図に関するデータを保持することを考えた時には、まず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のおかげで大量のデータを短時間で処理することができ、昔は気軽にできなかったことができるので、皆さんも遊んでみてください。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?