ストリートビューサービスAPIのひかく
Google StreetView | Mapillary | |
概要 | ||
APIドキュメント | https://developers.google.com/maps/documentation/streetview/intro?hl=ja | https://www.mapillary.com/developer/api-documentation/ |
費用 | 7.00 USD per 1000 | 無料 |
地名指定 | 可能 | 外部サービス(Nominatimなど)との組み合わせが必要 |
取得枚数 | 1つのみ | 複数可能(per_page=10) |
カバー範囲 | 広い | 濃淡あり |
360画像 | すべて | 一部のみ |
フィルター(検索条件) | 少ない | 多様 |
画像保存、利用 | 禁止 | 可能(CC BY-SA) |
画像サイズ | size :{width}x{height}で指定 | thumb-320.jpg, 640, 1024, 2048から選択 |
返り値フォーマット | JSON | GeoJSON |
画像取得エンドポイント | https://maps.googleapis.com/maps/api/streetview?parameters | https://images.mapillary.com/{key}/thumb-2048.jpg |
メタデータ取得エンドポイント | https://maps.googleapis.com/maps/api/streetview/metadata?parameters | https://a.mapillary.com/v3/images? |
フィルター | ||
座標指定 | location=lat,lon | closeto=lon,lat |
地名指定 | location=Tokyo | なし |
検索半径 | radius=100 | radius=100 |
検索座標範囲 | bbox | |
終了日 | end_time=2016-05-01 | |
開始日 | start_time=2016-05-01 | |
視点座標 | lookat=lon,lat | |
作成組織 | organization_keys=** | |
360画像 | すべて360度画像であるが、平面写真としてしか取り出せない | pano=true |
非公開画像 | private=true | |
シーケンス | sequence_keys=** | |
ユーザキー | userkeys=** | |
ユーザ名 | usernames=** | |
画像種類 | source=default/outdoor |
ルート検索API
ルート検索APIの無料枠で使える量を比較します。
サービス | 無料枠 |
---|---|
Graphhopper | 500リクエスト/日 |
OSRM | 過度な利用禁止 |
openrouteservice | 2000リクエスト/日 |
1333リクエスト/日(200ドル/月まで無料、0.005ドル/リクエスト) | |
Mapbox | 3333リクエスト/日 |
Small tools for OpenStreetMap and Mapillary
Here are the list of small tools I made for OpenStreetMap and Mapillary.
QGISを使ったOSMデータの品質チェック
OSMデータの品質チェック
OSMデータの品質チェックツールは、OsmoseやOSM inspectorなど様々なツールが提供されています。しかしこれらのツールはタグのエラーチェックであり、地物が実在しているのかはチェックできません。
地物が実在しているかどうかを間接的にチェックする方法として、他データと比較検証する方法があります。ここでは、国が提供している国土数値情報(KSJ)とOSMデータを比較してみます。
下図のように、KSJデータとOSMデータをプロットし、両者の位置がほぼ一致(例えばデータ間の距離が200m以内に収まっている、といった基準で判断できます)していればそのデータは正しいと考えることができます。一方、KSJにはあるがOSMにはないデータは、OSMに追加する必要があるでしょう。また、OSMにあってKSJにないデータは、地物の実在性が怪しかったり、タグが間違っている可能性があります。データのチェックが必要です。
以下本文では、QGISを使ってOSMデータとKSJデータを比較する方法について説明します。
注意:KSJにあってOSMにないデータが見つかった場合、KSJデータをソースにしてOSMデータを作成してはいけません。規約でKSJデータのインポートは禁止されています。追加が必要な地物が見つかったら、他のデータソース(例えば地理院地図)を参照してデータを追加してください。
データの準備
例として、鹿児島県の学校データをチェックしてみます。
- まず見やすいように、背景地図として日本地図データを入手します。「地球地図日本」から「全レイヤ」をダウンロードします*1。ZIPファイルの中に入っている"polbnda_jpn.shp"をあとで使います。"polbnda_jpn.*"ファイルは同じフォルダにまとめておいてください。
- Overpass-turboからOSMデータを取得します。ウィザードに、"amenity=school in 鹿児島県"と入力して実行し、《エクスポート》→《ダウンロード/GeoJSON》でファイルを保存します。"export.geojson"という名前でファイルが保存されます。
- 国土数値情報(KSJ)からデータを取得します。学校データの「鹿児島」を選んでファイルをダウンロードします。"P29-13_46.shp"を使います。
QGISに読み込み
- QGISをダウンロード・インストールし、起動します。
- 日本地図を読み込みます。まず、《レイヤ》→《レイヤの追加》→《ベクタレイヤの追加》をメニューから選び…
-
ベクタデータセットのアイコンを押して、"polbnda_jpn.shp"を選択します。日本のデータを読み込むときはShiftJISを選択するのが無難。
-
「 座標参照系選択」の画面が出た場合は、《フィルター》にJGD2000と入力し、《世界の座標参照系》の《地理参照系》の下にあるJGD2000を選びます。二つありますが、どっちでも大して変わりません。JGD2000はたくさんありますが、《投影座標系》のものを選んではダメです。
- これで日本地図が読み込めました。
- 次にOSMデータを読み込みます。先ほどと同じように、《レイヤ》→《レイヤの追加》→《ベクタレイヤの追加》をメニューから選び、Overpass-turboからダウンロードした"export.geojson"を選択します。OSMデータはUTF-8です。
- ノード(ポイント)で作成された学校と、エリア(ポリゴン)で作成された学校が混在しているようです。どちらも使うので、《全てを選択》して進みます。
- 鹿児島県のOSM学校データが読み込めました。
- 読み込まれたデータは左下の《レイヤー》に表示されます。読み込んだOSMデータはノードデータとエリアデータに分かれて読み込まれました。
- ノードとエリアが混在しているのも扱いが面倒なので、全部ノードにしてしまいましょう。《ベクタ》→《ジオメトリツール》→《中心点》を選び…
-
入力レイヤにOSMのエリアデータを指定します。
- エリアデータをノードに変換した「中心点」というデータができました。
-
元からあったノードデータとエリアを変換したノードデータをまとめましょう。《ベクタ》→《データ管理ツール》→《ベクタレイヤの結合》を選び…
- 《入力レイヤ》から結合するノードデータを選びます。この画面だと"export export"という同じ名前のデータが二つあり、エリアとノードが区別できませんね。あらかじめ名前をわかりやすく変更しておくべきでした。
- 「結合された」データが作成されました。結合前のデータ(レイヤ)は削除して構いません。
- KSJデータの読み込みます。同じように、《レイヤ》→《レイヤの追加》→《ベクタレイヤの追加》をメニューから選び、"P29-13_46.shp"ファイルを読み込みます。
- 見やすいように色を適当に変更しましょう。レイヤ名も分かりやすいようにOSMとKSJに変えました。
データ処理
まず、KSJにはあるがOSMにはないデータを抽出します。手順としては、(1)OSMデータを中心に半径200mの円を描き、(2)作成した円の中に入っていないKSJデータを抽出する、ことになります。その後、同じようにOSMにはあるがKSJにはないデータを抽出(KSJデータを中心にしたの円に入っていないOSMデータを抽出)します。
- まずはデータの前処理です。メニューから、《ベクタ》→《データ管理ツール》→《レイヤの再投影》を選び…
- 《入力レイヤ》に"OSM"を指定します。《変換先CRS》のボタンを押して…
- 《投影座標系》から"EPSG:2444"を選んで実行します。処理するデータを赤い枠がカバーするものを選ぶとよいです。すると「再投影された」という名前のレイヤができるはずです。
-
次に、OSMデータを中心にした反映200mの円を作成します。メニューから《ベクタ》→《空間演算ツール》→《バッファ》を選び…
- 《入力レイヤ》に先ほど作成した「再投影された」レイヤを選びます。《距離》には、冒頭で説明したOSMデータとKSJデータの同一性を判断する距離を入力します。ここでは200mにしました。ちなみに、《投影座標系》に変換することでここでの距離をメートル単位で指定することができていますが、入力レイヤに《地理参照系》のデータを指定すると距離を「角度」で指定しなければなりません。《投影座標系》は北緯**度、東経**度という表記なので距離も角度で指定しなければならないのです。《投影座標系》に再投影する際に、北緯**メートル、東経**メートル、という形に変換されたので、距離をメートル単位で指定することができるようになったのです。
- 実行すると、「バッファ」という名前でOSMデータを中心にした反映200mの円が作成されます。
-
200m円の外側にあるKSJデータを抽出します。メニューから《ベクタ》→《調査ツール》→《場所による選択》を選び…
- 《地物の選択》に「KSJ」を指定し、《地物のあるところ》に「disjoint」(含まれないという意味)を選択し、《からの特徴を比較することによって》に先ほど作成した200mの円「バッファ」を指定します。
- 実行すると条件に該当する点が選択されます。ウィンドウ下部に
と表示されているはずです。KSJにはあるがOSMにはないデータが6個見つかりました。
- ではこの6個のデータをファイルに保存します。「KSJ」レイヤを選択して、《地物をコピー(Ctrl+C)》します。
- 《新規レイヤへの地物貼り付け》→《新規ベクタレイヤ》を選び…
-
ファイル形式は「GeoJSON」に、ファイル名は適当に、CRSは「WGS 84」を選んで、ファイルを保存します。これで、KSJにはあるがOSMにはないデータをファイルに保存することができました。
- 同じように、OSMにはあるがKSJにはないデータを作成してgeojsonファイルに保存してください。
JOSMに読み込んでOSM編集
- では最後にOSM編集です。JOSMの《ファイル》 →《開く…》で、先ほど作成したgeojsonファイルを開きます。
- ファイルを開いても、ノードなのでどこにデータがあるのか見えにくいです。《すべて選択》するとデータが見やすくなります。データのひとつを拡大してみると、学校が見つかりました。地理院地図の標準地図に載っているのでマッピング可能ですね。
- OSMデータを作成するために、まずOSMデータをダウンロードします。ここで重要な点ですが、《新しいレイヤーとしてダウンロード》してください。普通の《ダウンロード》だと、ダウンロードしたデータが読み込んだgeojsonデータ(元KSJデータ)と混ざってしまうため、場合にKSJデータがOSMにアップロードされてしまいます。ご注意ください。
- あとはいつもと同じようにマッピングして終了です。お疲れさまでした。Happy validation!
備考
ここでは学校データを検証してみましたが、現在のOSMデータには以下のような課題がありそうです。
- OSMにデータインポートされたのちに、廃止された学校がかなりありそう。
- 自動車学校や専門学校が`amenity=school`でタグ付けされている。これらの施設はタグが確立されていないけれど、`amenity=school`はあまり適切でないと思われる。
注意
- QGISについては初心者なので何か間違ったことを書いているかもしれません。
- 今回はOSMデータの品質チェックを目的にしたので、位置情報の精度については気にしていません。本当は、座標系の違い(WGS84とJGD2000の違い)などを気にしてデータを処理すべきなのでしょうが、大した違いはないので無視します。
- 国土数値情報の学校データには大学が含まれていますが、OSMのamenity=schoolには大学が含まれません。ちゃんとやる場合はここは修正したほうがよいです。
- このやり方では、学校の名称が変わった場合についてはチェックできません。
本資料の画像およびデータは以下のものを使用しています。
- QGISのスクリーンショット
- OSM学校データ (C)OpenStreetMap contributors
- 国土数値情報学校データ:国土交通省国土政策局「国土数値情報(学校データ)」を加工して使用
- 日本地図:地球地図日本
- 日本地図:OpenStreetMap contributors
*1:データは粗いのですが軽いので便利
kepler.glの使い方メモ
この記事では、地理情報をこんな風に可視化する手順を説明します。
始めに
地理空間データは可視化が非常に重要です。普段は可視化にuMapを使うのですが、GeoSaturdayに参加した際に、Jupyter+GeoPandas+KeplerGLだとかっこいい可視化ができる事例を見ました。その際は、Pythonはよくわからないし、**.glってことはプログラミング用ライブラリなので難しそう、と思って手を付けませんでした。そのあとに調べてみると、kepler.glはuMapやGoogleマイマップのようにデータをアップロードすれば地図上に可視化してくれるものだと分かりました。
そこで、GeoSaturdayで見た事例を再現してみることにしました。
データ作成
まずは可視化するデータを探します*1。今回は、ある都道府県から別の都道府県に転居した人数のデータを使いました。
Excelファイルはいまいち使いにくいフォーマットなので、DBのリンク先に飛んで、ある程度整形したデータを入手したほうがよいです。
こんな感じのデータが入手できます。
北海道から青森への移住者が1662人、青森から北海道への移住者が2157人だそうです。
双方向のデータがあると表示が面倒なので、一方通行のデータにします。Excelでvlookupなどを使ってデータを加工して、逆移動人口との差をとり、差し引き移動人口を求めます。差し引き移動人口が正の値のデータだけを抽出すれば完成です。
kepler.glで可視化するためには座標データが必要です。各都道府県の座標は、こちらのページからデータを使わせてもらいました。
またvlookupを活用してデータを加工して、こんな感じのデータを作ります。データはCSV形式で保存します。
これでデータ作成・加工は完了です。
データ表示
kepler.glにアクセスし、ボタンを押して始めます。
作成したCSVファイルを画面にドロップするとデータを読み込んでくれます。項目名をそれっぽい名前にしておいたので、座標も自動で読み込んでくれました。
今回は人口の移動をアーチ状のラインで表示させたいので、目玉マークをクリックして表示させます。
するとぐちゃぐちゃな画面が表示されます。
右上の3Dアイコンをクリックして、
斜め上から表示させます。
できました。色味を調整して、こんな感じにしてみました。
これでもいいのですが、GeoSaturdayで見た例では、マウスオーバーした場所のデータだけを表示させていましたので、そちらもやってみます。
操作パネルの"Interactions"タブから、Brushを有効化して、Brush Radiusを少し大きく変更します。
すると、マウスオーバーした場所のアーチラインだけが表示されるようになりました。
— muramoto (@muramototomoya) 2020年1月5日
なお、kepler.glウェブサイトはアップロードしたデータを保存してくれません*2。ですので、可視化マップを保存・共有するためには、Shareボタンからデータをdropboxにアップロードする必要があります。
まとめ
- kepler.glを使うといい感じで地理データの可視化ができます
- うまく表示するためには、データの前処理が大事です