パントレ開発部

GeoJSON とは?PHP を使った生成方法も紹介

Map

 Web 地図で利用される代表的なデータ形式、GeoJSON について説明します。

GeoJSON とは

JSON とは

 JSON とは JavaScript Object Notation の略で、JavaScript におけるオブジェクトの書き方をもとにしたデータ形式のことです。人間とコンピュータ双方にとって可読性が高く、データが重くなりづらいという特徴を持つため、今では JavaScript に限らず、PHP や Python、Java など幅広い言語で扱われています。

 以下に JSON の例を示します。キーと値をコロンで区切って記述する形になっており、値をオブジェクトにすることで、入れ子構造もとることができます。そのため、CSV よりも複雑な構造をとることができます。XML に比べると文字数も少ないため、比較的軽量なデータになるのが特徴です。なお、キーは必ずダブルクォーテーションで囲む必要があり、シングルクォーテーションだとエラーになります。

{
    "key1": "value1",
    "key2": "value2",
    "key3": {
        "key3-1": "value3-1",
        "key3-2": "value3-2" 
    }
}

 

GeoJSON について

 GeoJSON は JSON に基づく地理データを記述するためのデータ形式です。点や線、面などの表現が可能になっています。GeoJSON の議論自体は 2007 年に始まり、2008 年にはフォーマット仕様が確定した、歴史あるファイル形式になっています。ブラウザ上での地理データの表示はフロントエンド側が担うことが多く、JavaScript を用いて地理データを表示させるケースが一般的なため、JSON に基づくデータ形式になったのかもしれません。

 以下に GeoJSON の例を示します。複数の点を表現している例になるのですが、入れ子構造になっているデータの中に、type や coordinates(座標)といった情報が決められたフォーマットで記述されていることが分かります。

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {
                "description": "札幌",
            },
            "geometry": {
                "type": "Point",
                "coordinates": [141.3507794, 43.0686498]
            }
        },
        {
            "type": "Feature",
            "properties": {
                "description": "函館",
            },
            "geometry": {
                "type": "Point",
                "coordinates": [140.7257372, 41.7742072]
            }
        },
        {
            "type": "Feature",
            "properties": {
                "description": "苫小牧",
            },
            "geometry": {
                "type": "Point",
                "coordinates": [141.5968821, 42.6400714]
            }
        }
    ]
};

 

GeoJSON の例

 もう少し掘り下げて、点データを記述する場合、線データを記述する場合、面データを記述する場合、複合データを記述する場合について、簡単な GeoJSON の例を示します。

点データ

 単一点データでは type を Point に設定します。非常にシンプルですね。

{
    "type": "Point",
    "coordinates": [141.3507794, 43.0686498]
}

 

線データ

 線データでは type を LineString に設定します。座標は二次元配列で定義します。

{
    "type": "LineString",
    "coordinates": [
        [141.3507794, 43.0686498],
        [140.7257372, 41.7742072]
    ]
}

 

面データ

 面データ(いわゆるポリゴン)です。こちらも座標は二次元配列で定義します。始点と終点の座標は一致している必要があります。

{
    "type": "Polygon",
    "coordinates": [
        [141.3507794, 43.0686498],
        [140.7257372, 41.7742072],
        [141.5968821, 42.6400714],
        [141.3507794, 43.0686498]
    ]
}

 

複合データ

 複合データを記述する場合、type を FeatureCollection に設定し、各図形を入れ子構造で記述します。以下の GeoJSON は前述の例でも挙げましたが、再掲します。

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "properties": {
                "description": "札幌",
            },
            "geometry": {
                "type": "Point",
                "coordinates": [141.3507794, 43.0686498]
            }
        },
        {
            "type": "Feature",
            "properties": {
                "description": "函館",
            },
            "geometry": {
                "type": "Point",
                "coordinates": [140.7257372, 41.7742072]
            }
        },
        {
            "type": "Feature",
            "properties": {
                "description": "苫小牧",
            },
            "geometry": {
                "type": "Point",
                "coordinates": [141.5968821, 42.6400714]
            }
        }
    ]
};

 

PHP を使った生成方法

 以下、PHP を使った GeoJSON の生成方法の例です。WordPress 環境だとこんな感じになるかと思います。最初に空の FeatureCollection を作って、そこに array_push で各図形を追加していっています。なおここで wp_example というデータベースのテーブルに、点の名前、緯度、経度が格納されているものとします。

$sql = "SELECT * FROM {$wpdb->prefix}example ORDER BY name";
$example_db_data = $wpdb->get_results($wpdb->prepare($sql));
$geojason_data = ['type' => 'FeatureCollection', 'features'  => []];

if(!empty($example_db_data)){
    foreach($example_db_data as example_data) {
        $feature = [
            'type' => 'Feature',
            'properties' => [
                'description' => esc_attr($example_data->name),
            ],
            'geometry' => [
                'type' => 'Point',
                'coordinates' => [(double)esc_attr($example_data->longitude), (double)esc_attr($example_data->latitude)]
            ]
        ];
        array_push($geojason_data['features'], $feature);
        }
    }
}
$geojson_data_save = json_encode($geojason_data, JSON_UNESCAPED_UNICODE);
file_put_contents( WP_CONTENT_DIR.'/themes/hogehoge/hogehoge_geojson.json', $geojson_data_save);

 

少し宣伝

 当サイトは地図(GeoJSON も含む)を用いた海外旅ブログまとめサイトとなっています。トップページに地図がありますが、地名を押すと画像が開き、画像を押すと関連記事一覧(クリック数順)が開きます。記事数が多い国ほど赤く、地名もその国で記事が多い都市の文字が大きくなるようにしています。ぜひ覗いてみてください。
 当サイトで海外旅ブログを執筆することも可能です(もちろん無料です)! また既にブログをお持ちの方も、当サイトからリンクを貼ることができるようになっています。パントレ開発部までお気軽にお問い合わせください。


 このページが皆様のプログラミングの一助となりますことをお祈りいたします

パントレ開発部