さて、本日は ezdxf を使って Python で DXF を扱ってみようと思います。
DXF とは
以下エントリーでも少し紹介しているのですが、DXFは、Autodesk社が開発したファイル形式の1つで、CAD 系のデータですね。しかし、GIS の世界でも DXF はよく使われます。
ezdxf とは
DXF を扱うための Python ライブラリです。データの読み書きを行うことができます。
サンプルデータ
ArcGIS Pro で以下のようなデータを用意しました。
1.浄水場名(アノテーション)
2.浄水場(ポイント)
3.河川(ライン)
4.神奈川県(ポリゴン)
これをジオプロで「ExportCAD.dxf」という名称のDXFに出力します。
できあがった DXF を ArcGIS Pro で読み込むとこのようになります。
ちなみにですが、「2.浄水場(ポイント) 」「3.河川(ライン) 」は国土数値情報からダウンロードしてきました。
ダウンロードの自動化について過去に紹介しているので、興味のある方はぜひ読んでみてください。 www.gis-py.com
また、「1.浄水場名(アノテーション) 」ですが、「2.浄水場(ポイント) 」から作成しました。作成方法は以下のエントリーで紹介しているので、ぜひ読んでみてください。
実行環境
Windows10 64bit
Python3.6.6
ezdxf 0.10.2
Jupyter 6.0.1
サンプルコード
ezdxf の使い方を紹介します。
レイヤー名称一覧を抽出
import ezdxf doc = ezdxf.readfile(r"D:\python\data\CAD\ExportCAD.dxf") for layer in doc.layers: print(layer.dxf.name)
このようになります。「0」と「Defpoints」というレイヤーが抽出されていますが、これは フィーチャクラスを DXF に変換する際にできたもので、特に気にする必要はありません。
特定のレイヤのデータを抽出する
「河川」レイヤーのデータを抽出します。
import ezdxf doc = ezdxf.readfile(r"D:\python\data\CAD\ExportCAD.dxf") msp = doc.modelspace() rivers = msp.query('*[layer=="河川"]') for river in rivers: print(river)
こんな感じで結果の結果になりました。
色々調べてみたのですが、一つ一つのアイテムの属性にアクセスすることはできませんでした。何かやり方があるのかもしれませんが、今回はあきらめます。
DXF を作成する
ラインを一本作図してそれを DXF として出力します。
import ezdxf doc = ezdxf.new() msp = doc.modelspace() doc.layers.new(name='MyLines', dxfattribs={'linetype': 'DASHED', 'color': 7}) msp.add_line((0, 0), (10, 0), dxfattribs={'layer': 'MyLines'}) doc.saveas(r"D:\python\data\CAD\ExportCAD2.dxf")
想定通りラインが作図された状態で DXF を作成することができました。
まとめ
使ってみた感想としては、簡易的に DXF を扱う分には十分だけど、細かな操作を行いたい場合はちょっと厳しいかもしれないと思いました。DXF は専用のソフトで を扱うのが一番かと思います。ただ、今回初めて Python で DXF を扱ってみたのでそれ自体はとてもいい経験になったと思います。興味のある方はぜひ ezdxf を使ってみてください。本日は以上です。