shpファイルからdxfファイルへの変換

2,251 views
Skip to first unread message

sakuya

unread,
Jan 30, 2019, 10:01:35 PM1/30/19
to QGIS初心者質問グループ
こちらsakuyaです。
shpファイルからdxfファイルへの変換を行いたいと思うのですが、shpファイルがたくさんあるのでQGISから行うのがちょっと苦しいなとおもい、
gdalでワールドつきラスタをgeotiffに変換できるみたいに、OsGeo4W shellを使おうと思いました。
その時の構文なのですが、多分あっていると思うのですが、ラーが発生したと出てしまい不安があります。図形自体は正常出力されております。

その時の構文は
ogr2ogr -s_srs EPSG:2449 -t_srs EPSG:2449 -f "dxf" 50km_Circle_line.dxf 50km_Circle_line.shp
としました。
元ファイルの座標系が「EPSG2449」 変換先の座標系が「EPSG2449」 変換フォーマットは「dxf」 変換ファイル名は「50km_Circle_line.dxf 」
元ファイル名は「50km_Circle_line.shp」ですと指定しました。

そうした結果
「Warning 1: The output driver does not seem to natively support Integer64 type for field id.
Converting it to Real instead. -mapFieldType can be used to control field type conversion.
ERROR 1: DXF layer does not support arbitrary field creation, field 'id' not created.
ERROR 1: DXF layer does not support arbitrary field creation, field '距離' not created.」


質問①
ERROR 1という部分については、dxfなので属性データは消えちゃうよという意味合いに取っているのですが、
Warning 1のほうが意味が変わってません。何をどうすればよいのでしょうか?

質問②
prjファイルを持っているshpファイルをdxfに変換する場合に-s_srs EPSG:2449 -t_srs EPSG:2449の部分を省略しても大丈夫なのでしょうか?

質問③
フォルダ内一括、順番に変換してくれるようなことはできるのでしょうか?現在は構文をエクセルで作成した後に張り付けています。

質問④
後は、できれば出力されたdxfのレイヤ名=ファイル名になればうれしいとは思うのですが、そのようなことはできますでしょうか?

すみませんが教えてください。
shp_to_dxf_convert.zip

sakuya_izayoi

unread,
Jan 30, 2019, 10:51:02 PM1/30/19
to QGIS初心者質問グループ
sakuyaへ
こちらizayoiです。
とりあえず、分かるところだけ。

質問3に関してですが。質問2も少し入るけど、明確な答えは持ってません。shp全部の座標系が2449ならば、
for %N in (C:\Users\izayoi\Desktop\shp_to_dxf_convert\*.shp) DO  ogr2ogr  -s_srs EPSG:2449 -t_srs EPSG:2449  -f "dxf"  %~nN.dxf    %N
と赤い部分に注視して書き換えてもらえればちゃんと回るはず。その時に、色々と混ざっているならば
for %N in (C:\Users\izayoi\Desktop\shp_to_dxf_convert\*.shp) DO  ogr2ogr  -f "dxf"  %~nN.dxf    %N
と座標指定外したほうが良いとともいます。出力座標系だけを設定したい場合には -t_srs EPSG:2449 だけ設定しておけば良いのかな?
(あと、聞かれるかな?って思ってますが %~nN.dxf となる理由は私では分からない。 %N.dxfでは回らないはず。なんで~nいるんだろう? )

sakuya

unread,
Jan 31, 2019, 3:37:12 AM1/31/19
to QGIS初心者質問グループ
sakuyaです。
izayoiへ。
フォルダの中でクルクル回す方法ありがとうございます。うまくいきました。
あと、ポリゴンなんですが、全部ハッチングで出力されてしまうんですが、何か良い処理ありますか?

sakuya_izayoi

unread,
Jan 31, 2019, 3:43:44 AM1/31/19
to QGIS初心者質問グループ
-nlt LINESTRING
-nlt MULTILINESTRING
を付ければ行けるはず。

for %N in (C:\Users\izayoi\Desktop\shp_to_dxf_convert\*.shp) DO  ogr2ogr  -f "dxf" -nlt LINESTRING  %~nN.dxf    %N

と実施してみてください。
参考ページは
です。

・・・2.5Dっての設定できるのか。どうやってコマンド書けばいいのだろう?

ありた

unread,
Jan 31, 2019, 8:15:19 AM1/31/19
to QGIS初心者質問グループ
こんにちは



1-1. Error について
CAD は GIS と違い、属性値をもつことができません。
しかし、どのレイヤに属しているかや線種といった情報は管理されています。そのため、それらの
情報を扱うため、入力データは Layer や Linetype といった属性を持つことができます。
逆に、それ以外の任意の属性 (arbitrary field) をもっているとエラーとなります。
他の属性を持った入力データに対して、明示的に属性を削除してエラーを避けるには
ogr2ogr -f DXF -select "" 50km_Circle_line.dxf 50km_Circle_line.shp
とします。 -select オプションは 変換に使用する属性を指定するものです。

1-2. Warning について
古い DXF の仕様では、64ビット長の整数をサポートしていません。
32ビットで表現できる整数は -2,147,483,648 〜 2,147,483,647 なので、10桁以上を表現するには
(形式として)64ビット整数が必要となりますが、対応していないという警告です。
属性の形式を変更するには、メッセージにあるように -mapFieldType オプションを使えば
よいのですが、 id 属性は切り捨て るため 1-1 のコマンドを打つと警告も発生しません。


2. srs について
-s_srs はなくても大丈夫なはずです。 -t_srs は目的に応じて使用してください。


4. レイヤについて
上でちらっと触れましたが Layer 属性があれば、それを DXF のレイヤ名になります。
もし QGIS 上の操作が可能であれば、フィールド演算機等で処理するのがわかりやすいと思います。

コマンドで行う場合には次のようにします。
ogr2ogr -f DXF -sql "SELECT '50km_Circle_line' AS Layer FROM '50km_Circle_line'" 50km_Circle_line.dxf 50km_Circle_line.shp

-sql オプションで SQL 文を実行し、変換用の属性リストとして新たな Layer 属性を作成しています。
SELECT '50km_Circle_line' AS Layer で 50km_Circle_line という文字列定数を Layer 属性の値に
指定しています。(ファイル名が希望とのことでしたが、別名にしたい場合は、書き換えれば別名になります。)

表から抽出するわけではありませんが、どうやら OGR SQL の場合 FROM がないとエラーになるみたいなので
FROM '50km_Circle_line' としています。これは 50km_Circle_line テーブル(レイヤ)からという意味です。

SQL 文が 1-1 の -select オプションの代わりになっているため、 -select はつける必要ありません。


3. 繰り返し処理について
バッチファイルの文法がいまいちわからないので、 bash (Linux) での構文ですが

for f in *.shp; do ogr2ogr -f DXF -sql "SELECT '${f%.shp}' AS Layer FROM '${f%.shp}'" ${f%.shp}.dxf $f; done


5. ポリゴンのハッチについて
設定オプションの DXF_WRITE_HATCHFALSE にすればよいとありますので、

ogr2ogr -f DXF --config DXF_WRITE_HATCH FALSE -sql "SELECT '50km_Circle_polygon' AS Layer FROM '50km_Circle_polygon'" 50km_Circle_polygon.dxf 50km_Circle_polygon.shp



参考

ogr2ogr 全般(コマンドラインオプション等)
DXF ドライバの説明( DXF 特有の問題について)

sakuya_izayoi

unread,
Jan 31, 2019, 9:23:25 PM1/31/19
to QGIS初心者質問グループ
再起処理の補足というか、わかったことです。

「%~n」にすることで、「拡張子を除いたファイル名を取得できる」とのこと。今回は%Nで取得したファイルのフルパス、つまり
C:\Users\izayoi\Desktop\shp_to_dxf_convert\hogehoge.shp
からファイル名だけ「hogehoge」%~nNに入るという事です。

%~nN.dxf
には
hogehoge.dxf
となるという事みたいです。
参考ページは
になります。これ分かっていると、bat処理がはかどる気がします。

フリード・ティンクス

unread,
Mar 30, 2019, 9:29:18 PM3/30/19
to QGIS初心者質問グループ
こちらフリードです。
お疲れ様です。

上ににある ありた様の投稿
ogr2ogr -f DXF -sql "SELECT '50km_Circle_line' AS Layer FROM '50km_Circle_line'" 50km_Circle_line.dxf 50km_Circle_line.shp
レイヤーを作る構文なのですがで
"SELECT '50km_Circle_line' AS Layer FROM '50km_Circle_line'"
となっています。'50km_Circle_line' という部分が50km_Circle_line.shpにはないのにどうやって持ってきた感じになるのでしょうか?QGISでのフィールド計算の知識しかなくてすみませんが、これはnullと返ってきそうなのものですが・・・?今回の私が質問した文字を作りたいという投稿の答えとなる文章は、もとのフィールドから値を貰ってきているのに? select '50km_Circle_line' にある' 'のシングルマークは何を表しているのでしょうか?
また
https://groups.google.com/forum/#!topic/qgisshitumon01/zYSoSnu6fLo
上記のadachi様の答えでは' 'マークもなく、XXXXに「layer」としてセットしたい属性フィールド名を入れるとあり、混乱中です。ありた様の文章で流れてしまうのは何で?

sakuya_izayoi

unread,
Mar 31, 2019, 10:08:44 PM3/31/19
to QGIS初心者質問グループ
フリードさま
こちらizayoiです。

質問内容ですが、' 'というシングルクオテーションの間は「文字列」つまり固有値として認識されます。そのため、'sample'としていると、列の1行目から最終行までsampleという文字が書かれます。
確かエクセルがお得意でしたね。エクセルで言う ="text" に近いと言えば分かりやすいかと思います。
ありた さまの文章では、'50km_Circle_line'となっていますので、50km_Circle_line という文字列をLayerという列に上から下まで代入しました という感じですかね。
もしも' 'が無ければエラーとなるはずです。参照できるフィールドが存在してないので。

もっと詳しい方のフォロー、あるいは全然違う、ならば訂正していただけると自分も勉強になるのでお願いします。

フリード・ティンクス

unread,
Apr 1, 2019, 2:30:42 AM4/1/19
to QGIS初心者質問グループ
izayoi先生
情報ありがとうございます。sqlというのも図書館いって調べてこようとおもいます。
エクセルのたとえでわかりました。文字列というのはこのような日本語をいうのですね。


Reply all
Reply to author
Forward
0 new messages