複数のGeojsonファイルの結合方法について

1,525 views
Skip to first unread message

sakuya

unread,
Feb 28, 2019, 3:45:02 AM2/28/19
to QGIS初心者質問グループ
こちらsakuyaです。お世話になります。
フォルダの中にあるGeojsonファイルを一つのgeojsonファイルにまとめたいという質問です。
フォルダごとに
ポリゴン
ライン
ポイント
といったように分けてはあります。
QGISのベクタレイヤの結合機能を使うと、ファイル数が多いためか、スタート時点でQGISがハングアップしてしまい、動かなくなってしまいます。
ogr2ogrやgdalを使えるOsgeo4w shellを使えばできるかもと思って構文を調べようとしたのですが、どの機能の何を使えばいいのか見当がつかず、投稿させていただきました。
すみませんがフォルダ内にあるすべてのgeojsonファイルをmerge.geojsonにする構文を教えてください。

sakuya_izayoi

unread,
Feb 28, 2019, 4:24:26 AM2/28/19
to QGIS初心者質問グループ
sakuyaへ
こちらizayoiです。
う~ん。ちょっと難しいかなと思ったけど、一つ上の階層フォルダに出力でいいならば
`for %d in (*.geojson) do ogr2ogr -f "geojson" -append ..\merge.geojson %d`
でいけると思います。

いつもどおり、最初の
`for %d in (*.geojson) do`の部分でフォルダ内のgeojsonをループ取得します。
` -append`の部分でgeojsonに既存の結合させるという指示を出しています。
`..\merge.geojson`で一つ上の階層にあるmerge.geojsonを参照させます。
最後の
%dの部分でmerge.geojsonとループさせているshpファイルを結合させています。

全部の座標系が同じで、もともとの座標系に出力すればいい場合です。座標系を変えたい場合は
-s_srs
などを使用してください。

もっといい構文があればよろしくお願いします。

sakuya

unread,
Feb 28, 2019, 4:40:24 AM2/28/19
to QGIS初心者質問グループ
izayoiへ。
ありがとうございます。
結合はできたのとできないファイルに分かれました。
できていた場合も出力されていたエラーが気になるので記載します。
Warning 1: The output driver does not natively support Date type for field lfSpanFr. Misconversion can happen. -mapFieldType can be used to control field type conversion.
なんだか、作成されているデータフィールドの形が変だよってことかな?このエラーはどうやって対処すればよいでしょうか?

あと、変換に失敗したフォルダでは
ERROR 1: Layer '26141' does not already exist in the output dataset, and cannot be created by the output driver.
ERROR 1: Terminating translation prematurely after failed translation of layer 26141 (use -skipfailures to skip errors)
という記載が出てきました。これらはどのような意味合いでしょうか?

sakuya

unread,
Feb 28, 2019, 9:33:18 PM2/28/19
to QGIS初心者質問グループ
こちらsakuyaです。
なんのファイルをベースに処理したかったかを記載するのを忘れておりました。
国土地理院が配信してくれているベクトルタイル提供実験
から河川の中心線と道路中心線(木曽川流域)のGeojsonをダウンロードして、河川は河川、道路は道路のGeojsonにまとめようとしておりました。
その際に、上記のようなエラーが出ていました。
よろしくお願いします。

ありた

unread,
Mar 1, 2019, 9:51:48 AM3/1/19
to QGIS初心者質問グループ
こんにちは

バージョン2.4.0を使って、以下のデータで確認しました。

ひとつめの Warning は、以前、 DXF の変換でも Integer64 (10桁以上の整数)で発生して
いましたが、出力先の形式でサポートされていないため、発生している警告です。
警告メッセージ内に -mapFieldType オプションを使用すればデータ形式の調節ができると
書かれてあるので、言われるとおり、これを使って変更します。
ここでは、非対応の形式は Date (日付)だといっているので、文字列に変更するのが適当かと
思いますので -mapFieldType Date=String を付け加えます。


ふたつめの Error ですが、 GeoJSON は複数のレイヤをもつことができません。
OGR では、ファイル等のことをデータセットと呼び、その中のデータのことをレイヤと呼びます。
SpatiaLite や GeoPackage のように、ファイル内に複数のレイヤをもつことができる形式も
ありますが、 GeoJSON や Shapefile などは単独のレイヤしかもつことができません。

例として、実際のファイルで確認してみます。

まず ogrinfo を使うと、 GeoJSON のドライバで正しく開くことができ、1番目のレイヤは 25797 という

名前で、ジオメトリ型は LineString ということがわかります。

$ ogrinfo 25797.geojson

INFO: Open of `25797.geojson'

      using driver `GeoJSON' successful.

1: 25797 (Line String)


実際に 25797 という名前がつけられている可能性もありますが、今回のケースでは

名前がつけられていなかったため、ファイル名からレイヤ名が自動的に命名されています。

(ファイル名を変えたら、レイヤ名の表記も変わります。)


次に、 ogr2ogr で GeoJSON から GeoJSON に変換してみます。

(ここでは、後のコマンドと統一するため -append を使っていますが、省略しても構いません。)

$ ogr2ogr -f GeoJSON -append -mapFieldType Date=String merged.geojson 25797.geojson


エラーも警告もなく、コマンドの実行ができました。

できたものを ogrinfo で確認してみます。


$ ogrinfo merged.geojson

INFO: Open of `merged.geojson'

      using driver `GeoJSON' successful.

1: 25797 (Line String)


今度はファイル名とレイヤ名が異なっています。


merged.geojson の中を確認すると次のように、レイヤ名が明示されています。

(冒頭の4行)

{

"type": "FeatureCollection",

"name": "25797",

"features": [



この状態で、次のファイルを結合しようとするとエラーが発生します。

$ ogr2ogr -f GeoJSON -append -mapFieldType Date=String merged.geojson 25798.geojson

ERROR 1: Layer '25798' does not already exist in the output dataset, and cannot be created by the output driver.

ERROR 1: Terminating translation prematurely after failed

translation of layer 25798 (use -skipfailures to skip errors)


これは 25798.geojson というファイルから 25798 というレイヤで追加( append )しようと

したけれど、出力ファイルの形式では複数のレイヤを作成することができないため発生したエラーです。


これを避けるにはレイヤ名を明示して、既存のレイヤ名に揃える必要があります。既に存在しているのは 25797 という

名前ですので -nln オプションを使ってレイヤ名を指定します。

$ ogr2ogr -f GeoJSON -append -mapFieldType Date=String -nln 25797 merged.geojson 25798.geojson




これでエラーがでなくなりました。しかし、ひとつめのファイル名にあわせるのもどうかと思うので、

ひとつめのコマンドから -nln merged といったようにレイヤ名を指定してやるとよいと思います。

(そのほうがループもしやすいと思います。)

sakuya

unread,
Mar 1, 2019, 8:56:03 PM3/1/19
to QGIS初心者質問グループ
ありた さま
こちらsakuyaです。毎回詳しいご解説ありがとうございます。
正直なところ、あたしもizayoiもまだまだコマンドラインでそうさするOsGeo4w shellが実際どのように制御すればいいのかわかってない部分が多すぎるので助けられています。

エラーの一つ一つの詳細、説明していただいたらよくわかりました。結合できていたデータの場合、ファイルの内部で同じレイヤ名称を持っていたようで、くっつけれていたようです。そのため、なんで?ということに陥っていました。

最終的に教えていただいた構文に対していつも通りの
`for %d in (*.geojson) do`
構文を使ってクルクル回してファイルを作成することができました。

気が付いたこととしては、appendでファイルをつけていくとだんだん動作が遅くなってしまうので、複数のフォルダにファイルを分けておいて、merge1.geojson、merge2.geojson、merge3.geojsonというような感じでファイルを作っておいて最後に一つのファイルを作ったほうが時間短縮になりますね。

おかげさまで研究で使ったファイルの整理が全部終わりました。これでようやく一旦一息つけます。ありがとうございました。

Reply all
Reply to author
Forward
0 new messages