2
3

More than 1 year has passed since last update.

「平面直角座標への換算」(国土地理院)のoutファイルからPythonでDXF作図する

Posted at

国土地理院さんの「平面直角座標への換算」
https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2xyf.html
↑で一括計算すると作成されるoutファイルからCADに一気に作図(円をプロット)するプログラムを書きました。

10個程度の座標であれば手入力でも良いでしょうが、50個100個となると入力ミスも増えてストレスが溜まるものだと思います。
私の直近で行った業務では約17000個の座標入力が必要であり、仮に1個の入力で10秒かかるとしても170000秒(約47時間)、8時間勤務だとしても5日で終わらない量のデータを取り扱う必要がありました。
数週間前に作成したプログラムが予想以上に便利だったので、皆さまにも使って頂きたいと思い記事にしました。

※データ量が10億個以下であれば1秒程度で作図が完了します。
※Windowsでの使用を想定していますが、Mac,Linuxでも動作確認済みです。(コマンドが若干異なります...)

導入

1.Pythonをインストール

2.コマンドプロンプトで以下のコマンドを実行

pip install ezdxf

使い方

1.ソースコードをどこでもいいので保存します。(拡張子は.py)
2.コマンドプロンプトで以下のコマンドを実行します。(pythonファイルはドラッグ&ドロップがオススメ)

python ******.py

3.outファイルをドラッグ&ドロップ(またはファイルパスを手入力)

コードの説明

①outファイルの6行目以降をリストへ追加
②半角スペースで区切りリストへ追加
③X座標を抽出しリストへ追加
④Y座標を抽出しリストへ追加
⑤X座標とY座標および半径を引数として円を作成する

ソースコード

import os
import ezdxf 
from decimal import Decimal

i = 0
list1 = []
list2 = []
x_list = []
y_list = []

filepath = input(".outファイルをドラッグアンドドロップしてください。>>")
with open(rf"{filepath}",encoding="utf-8") as f:
    for line in f:
        i += 1
        if i > 5:
            list1.append(line)

for i in range(len(list1)):
    list2.append(list1[i].split())
for j in range(len(list2)):
    x_list.append(list2[j][2])
for k in range(len(list2)):
    y_list.append(list2[k][3])

doc = ezdxf.new("R2010", setup=True)
doc.layers.new(name="MyLine2", dxfattribs={'linetype': 'CONTINUOUS', 'color': 1})
msp = doc.modelspace()

for l in range(len(x_list)):
    x = Decimal(y_list[l])
    y = Decimal(x_list[l])
    msp.add_circle(center=[x,y], radius=10, dxfattribs={'layer': 'MyLine2'})

msp.add_circle(center=[x,y], radius=1000, dxfattribs={'layer': 'MyLine2'})
doc.saveas('sample.dxf')

print("作図完了")
print("ファイル名:sample.dxf")
print("ファイル作成場所",os.getcwd())

半径はradius=10の部分を変更して使ってください。
(最後にradius=1000と大きめの円を入れている理由は見つけやすいためです。)

参考記事

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3