一般做测绘地籍的应该会涉及到报部数据的生成,这是一个比较麻烦的事情,在网上搜了搜几乎没有这方面的软件,于是自己用python开发了个小脚本,可以实现批量转换。
注意:只支持由“cass 工程应用-复合线生成数据文件”直接生成的dat文件转化,或者与其格式相同的也行。
说明:有不懂的可以私信,我正在开发一款同样转换功能的便于使用的exe程序,等开发完再贴上来
(代码里路径默认是桌面,带号默认为39度带,可以根据注释自行修改代码)
(属性描述-转换参数都可以统一修改代码,根据自己情况改一遍就行了)
(地块坐标这个由于直接导出来的dat没有,所以最后需要自己在生成的报部数据txt文件中,逐个写入,打开文件后有提示,看一遍就懂了)
我下面直接贴python代码
# -*- coding: utf8 -*-
import os
import sys
path0=r"C:\Users\Administrator\Desktop"# 文件路径 下句是下面包括的子目录
path1=r"C:\Users\Administrator\Desktop"+'\\'
sys.path.append(path1)
files = os.listdir(path0)
#print('files',files)# 打印当下目录下的文件
txtcount = 0 #记录写完的报部数据txt个数
print("正在写入文件")
for filename in files:
portion = os.path.splitext(filename) #分割文件名和扩展名
if portion[1] == ".dat" or portion[1] == ".DAT":
newname = portion[0] + ".txt"
filenamedir=path1 +filename #dat文件
newnamedir=path1+newname #要建立的txt新文件
with open(filenamedir) as f:
lines = f.readlines() #读取dat所有数据为列表格式
lines.append(lines[0]) #把读取的数据第一行复制粘贴到最后一行
lines_len =len(lines) #表示读取的数据有几行
with open(newnamedir,'w',encoding='ANSI') as f:
f.write("[属性描述]\n")
f.write("格式版本号=1.01版本\n")
f.write("数据产生单位=公司名称\n")
f.write("数据产生日期=年-月-日\n")
f.write("坐标系=2000国家大地坐标系\n")
f.write("几度分带=3\n")
f.write("投影类型=高斯克吕格\n")
f.write("计量单位=米\n")
f.write("带号=39\n") #注意:修改此处的话,别忘了底下(替换x,y坐标并在y坐标前加带 号39)这儿还有个带号39
f.write("精度=0.001\n")
f.write("转换参数=0.0,0.0,0.0,0.0,0.0,0.0,1.0\n")
f.write("[地块坐标]\n")
f.write("自己写数据=总点数为:{},格式为界址点数,地块面积,地块编号,地块名称,记录图形属性(点、线、面),图幅号,地块用途,地类编码,@\n".format(lines_len))
line_count = 0 #记录当前写入的行数,最后知道是不是最后一行
for line in lines:
line_count += 1
with open(newnamedir,'a',encoding='ANSI') as f:
tmp_a = line.split(",") #按分隔符,把每一行分割保存成列表
tmp_b = tmp_a[:-1] #去掉最后一列,只保存前面的
# tmp_b2 = "39"+tmp_b[2]
# tmp_b3 = tmp_b[3]
#
# tmp_b[2] = tmp_b3
# tmp_b[3] = tmp_b2
tmp_b[2],tmp_b[3] = '%.03f'%float(tmp_b[3]),'%.03f'%float("39"+tmp_b[2]) #替换x,y坐标并在y坐标前加带号39
for i in tmp_b: #每一行,如果不是最后一个值,则加逗号;如果是最后一个值,则不加
if i != tmp_b[-1]:
f.write(i+',')
else:
f.write(i)
if line_count != len(lines): #如果不是最后一行,则加换行符
f.write('\n')
txtcount += 1
print("已写入第{}个报部数据".format(txtcount))
print("已写完全部报部数据")