GIS奮闘記

元GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

ezdxf を使って Python で DXF を扱ってみよう!

さて、本日は ezdxf を使って Python で DXF を扱ってみようと思います。

DXF とは

以下エントリーでも少し紹介しているのですが、DXFは、Autodesk社が開発したファイル形式の1つで、CAD 系のデータですね。しかし、GIS の世界でも DXF はよく使われます。

www.gis-py.com

ezdxf とは

DXF を扱うための Python ライブラリです。データの読み書きを行うことができます。

pypi.org

サンプルデータ

ArcGIS Pro で以下のようなデータを用意しました。

1.浄水場名(アノテーション)
2.浄水場(ポイント)
3.河川(ライン)
4.神奈川県(ポリゴン)

f:id:sanvarie:20200118081144p:plain

f:id:sanvarie:20200118081240p:plain

これをジオプロで「ExportCAD.dxf」という名称のDXFに出力します。

f:id:sanvarie:20200118081650p:plain

できあがった DXF を ArcGIS Pro で読み込むとこのようになります。 f:id:sanvarie:20200118082247p:plain

ちなみにですが、「2.浄水場(ポイント) 」「3.河川(ライン) 」は国土数値情報からダウンロードしてきました。

国土数値情報 上水道関連施設データの詳細

国土数値情報 河川データの詳細

ダウンロードの自動化について過去に紹介しているので、興味のある方はぜひ読んでみてください。 www.gis-py.com

また、「1.浄水場名(アノテーション) 」ですが、「2.浄水場(ポイント) 」から作成しました。作成方法は以下のエントリーで紹介しているので、ぜひ読んでみてください。

www.gis-py.com

実行環境

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 に変換する際にできたもので、特に気にする必要はありません。

f:id:sanvarie:20200118084615p:plain

特定のレイヤのデータを抽出する

「河川」レイヤーのデータを抽出します。

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)

こんな感じで結果の結果になりました。

f:id:sanvarie:20200118100421p:plain

色々調べてみたのですが、一つ一つのアイテムの属性にアクセスすることはできませんでした。何かやり方があるのかもしれませんが、今回はあきらめます。

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 を作成することができました。 f:id:sanvarie:20200118101319p:plain

まとめ

使ってみた感想としては、簡易的に DXF を扱う分には十分だけど、細かな操作を行いたい場合はちょっと厳しいかもしれないと思いました。DXF は専用のソフトで を扱うのが一番かと思います。ただ、今回初めて Python で DXF を扱ってみたのでそれ自体はとてもいい経験になったと思います。興味のある方はぜひ ezdxf を使ってみてください。本日は以上です。