2020年7月26日日曜日

Choroplethとデータ

都道府県境界データ

コロプレスといういと、毎回このデータを探し回っては大騒ぎするのが常である。もうここで、はっきりさせておこう
「国内にはこのデータはありません」。
国土地理院にも、e-stat にも市区町村や、更に細分化された地区とか街区とかのレベルのものは存在するが、都道府県境界だけのデータはない。

では、どこにあるのか?
ここ、Natural Earth にしかない(と思われる)。
探しにくいので説明する。境界データは、

  • Large scale data, 1:10m の Cultural をクリックし、
  • 1:10m Cultural Vectors の中の 「Admin 1 – States, Provinces」で
    「Download states and provinces」をクリック
    で取得できる。
    ファイル名:ne_10m_admin_1_states_provinces.zip(約14MB)

日本の都道府県境界の抽出

zip ファイルを解凍して出てきた shp ファイルは、全世界の境界データなので、ここから日本のデータのみを抽出する必要があるのだが、 如何せんバイナリの shp ファイルを覗く手段もないので、一旦は全体を GeoJSON に変換する。
変換にはogr2ogrを使用する。無条件に変換する場合は以下の通り。

ogr2ogr -f GeoJSON ne_10m_admin_1_states_provinces.geojson ne_10m_admin_1_states_provinces.shp

64MBほどの巨大なGeoJSONファイルが出来上がる。
エディタによっては開けないかもしれない。
この中に admin というプロパティがあり、その値は国名になっている。
これを手掛かりに、日本のデータのみを抽出することにする。

ogr2ogr -f GeoJSON -sql "SELECT * FROM ne_10m_admin_1_states_provinces WHERE admin = 'Japan'"  japan.geojson ne_10m_admin_1_states_provinces.shp

なんとデータベース宜しく、SELECT 文が使えるのが嬉しい。
これで都道府県境界データを抽出できるのだが、実際中を見ると不要な項目(例えば、都道府県名は英語、ロシア語、アラビア語等々の言語によってエントリされている)も多いので、実際に使用する項目のみに絞ることもできる。
【例】

ogr2ogr -f GeoJSON -sql "SELECT type,iso_3166_2,name_ja,latitude,longitude FROM ne_10m_admin_1_states_provinces WHERE admin = 'Japan'"  japan.min.geojson ne_10m_admin_1_states_provinces.shp

GeoJSON に必須な

  • features
  • geometry
    は選択できないが、その配下のプロパティは選択できる。

抽出データの問題点

  1. 静岡県の “name_local” の値が “???” になっている。手修正したら読み込めなくなってしまい、結局元に戻したので未修正のままになっている。原因が分からない。
  2. ファイル内のデータの並びが都道府県順になっていない。完全ランダム状態。例えば北海道に “population” というプロパティを追加するには、38番目の行(インデクス値は 37)まで探して設定する必要がある。ソートできないか。

追記

抽出データのソートについて、散歩しながらあれこれ考えた。
Javascript での配列ソートが使えないかとか、jq でファイル自体をソートできないかとか、どれも今一な案ばかり。
そんな時、ふと思いついたのが「SQL」が使えるということ。
実際「SELECT」を使って必要プロパティのみを選択したではないか。
これに「ORDER BY」を指定したら昇順にソートできるのではないか。
早速、自宅に帰って試してみた。

ogr2ogr -f GeoJSON -sql "SELECT type,iso_3166_2,name_ja,latitude,longitude FROM ne_10m_admin_1_states_provinces WHERE admin = 'Japan' ORDER BY iso_3166_2"  japan.min.sort.geojson ne_10m_admin_1_states_provinces.shp

ドンピシャ!
問題解決だ。

Written with StackEdit.

0 件のコメント:

ただいま作業中

2022/04/13 MySTの翻訳環境作り サイドメニューをプログラムで変換可能にすること 作業の中心場所 – jupyter notebook : g:\jupyter\python pythonをwebでも可能に – g:\webapp\Doc-tools ...