Cass和Cmap在地形图编辑中的一点心得

*注:转载请注明出处*

在地形图制图的过程中,cad是最经典的处理软件,现市面上出现许多面向地形制图的基于cad的二次开发软件,各类软件有各自适用范围。在内业处理过程中,由于人员不严谨及不熟练的成图手段,会使得在成果过程中出现很多小问题,或者对简单问题无法实现流程化、规范化、便捷化。在此,将一些关键节点的处理心得和手段记录在此,供大家自纠自查,加快生产速度,保证生产质量。此次仅对一下三种情况进行不全面的总结:同线连接;点线矛盾处理;闭合等高线添加高程点。若再有其他方面加快生产流程的心得,届时将继续补更。也欢迎各博友互相分享心得,让笔者踩着巨人的肩膀与大家一同进步。

话不多说,

分割线-----------------------------------------------------------------------------------------------------------------------

 

(1)同线连接:由于多人任务分配产生等高线拼接等问题,会出现多段同一条等高线的情况。按规范,应把多段同一条等高线连接成一条等高线,即进行J线连接。在J线连接前需注意,图层CL-将无法进行此操作,若已提前将【DGX】归为【CL-首曲线】层,需将【CL-首曲线】改为【CL首曲线】(去除短横线-),然后进行J线连接(完成后可再将图层改回)。完成J线连接后有些高程值可能会有错误,下一步进行点线矛盾的线间检查(故J线连接与线间矛盾有操作上的先后关系)。

(2)点线矛盾查重:点线矛盾无非是点错误或者线位置不合适(pix4d生线中往往产生大量的近三分之一的错误点),分两步走:第一步,对于明确是线位置不合适的错误,人工对其修正,这种线与附近点往往距离很近,对于线的修正,无论人工修的点线拓扑关系是否合适,CM软件均判断修改正确并自动删除对应error点(一个bug,CM修线后error自动消除,但不一定修正确,实际中显然不合适),故需要在修完后在进行一次点线矛盾检查。第二次检查后,开始对点错误进行修正。若点错误过多,可用代码实现删错误点工作(代码附于下方)。脚本所需要的输入数据是原高程点数据和error层数据(目前仅支持txt格式),代码前的工作如下:

在cass中→【工程应用】→【高程点生成数据文件】→【无编码高程点】,把高程点和error层都导出,然后变为csv格式,保证两类文件的高程位数一致(1:500两位,1:2000一位)(rounddown函数取位数,round函数四舍五入,具体用哪个函数要看原高程点属性值是四舍五入来的还是保留位数来的)。

删除两个文件中的第一列序号列(两文件的同序号行其实并不是同点位数据,无对应关系,故需删除序号列),再将两csv文件保存为txt。

依脚本指令输入对应输入文件(绝对路径+文件名及后缀)和输出路径,即得剔除后点位结果(New_GCD)。再将其转为csv格式,然后在cass中把原高程点删除,重新展高程点,展入New_GCD即可。

需注意,由于CMAP点线查重的bug(不彻底性),需多次查重进行此操作,方可修改完全。

代码原理为寻求子集A在U中的绝对补集,∁uA(非常简单)。具体代码及运行交互指令如下:

#-*-coding:UTF-8-*-
"""
功能:在A文件中删除A与B的子集部分,即寻求集合B在集合A中的绝对补集(常用于点线查重后的删除功能)。
Date:2021.1.21
Author:Kiki
"""

def TXT2LIST(A_file, B_file):
    global las1_table
    global las2_table
    las1_table =[]  #用于存放读取的A文件列表
    las2_table =[]   #用于存放读取的B文件列表
    f=open(A_file,"r",encoding='utf-8')
    line = f.readline()  #逐行读取
    print("START!!")
    while line:
        txt_data = eval(line) #数据转换为列表形式
        las1_table.append(txt_data)  #数据存入列表
        line = f.readline() #读取下一行数据
    print("las1_table is finished")   #A文件列表存入完毕
    #print("las1_table:" + str(las1_table))
    f.close() 

    f=open(B_file,"r",encoding='utf-8')
    line = f.readline()
    while line:
        txt_data = eval(line)
        las2_table.append(txt_data)
        line = f.readline()
    print("las1_table is finished")   #B文件列表存入完毕
    #print("las2_table:" + str(las2_table))
    f.close()
    return las1_table, las2_table


#定义函数提取两个文件的子集   
def REMOVE_SAME_ELEM(list1, list2):
    set1 = set(list1)
    set2 = set(list2)
    iset = set1.intersection(set2)
    lst = list(iset)
    print("The intersection is over")
    #print(lst)

    for i in lst:
        las1_table.remove(i)   #A中移除子集
        las2_table.remove(i)   #B中移除子集
    global New_las1,New_las2
    New_las1 = las1_table
    New_las2 = las2_table
    print("TheBigFile and TheSmallFile have updated completely!")
    #print("new las1_table:"+str(New_las1))
    #print("new las2_table:"+str(New_las2))

    




#输出结果
def EXPORT(Output_path, Output_name):
    t=''
    file = open(Output_path + Output_name, 'w')  #创建文件并开始写入
    with file as q:
        for i in New_las1:                
            print(str(i)+"Start Storing")
            for e in range(len(New_las1[0])-1):
                #print(e)
                t=t+str(i[e])+','
            t=t+str(i[e+1])  #每行最后不是逗号
            q.write(t.strip(' '))
            q.write('\n')
            t=''
    print("Finished!!")
    file.close()


print("在此功能开始之前,您将键入两个需要处理的输入文件和一个需要创建的结果文件")
A_file = input("请输入大文件路径及文件名字(如C:\\BigFile.txt):\n")
B_file = input("请输入小文件路径及文件名字(如C:\\SmallFile.txt):\n")
Output_path = input("请输入生成文件的路径(如C:\\):\n")
Output_name = input("请输入新文件名字(如New.txt):\n")  #输出文件名

TXT2LIST(A_file,B_file)
REMOVE_SAME_ELEM(las1_table, las2_table)
EXPORT(Output_path, Output_name)

 

图 删重代码

在此功能开始之前,您将键入两个需要处理的输入文件和一个需要创建的结果文件
请输入大文件路径及文件名字(如C:\BigFile.txt):

请输入小文件路径及文件名字(如C:\SmallFile.txt):

请输入生成文件的路径(如C:\):

请输入新文件名字(如New.txt):

 

图 交互指令

(3)闭合线圈补高程点:由于高程点稀释步骤(1:500高程点间距8m,1:2000高程点间距32m),将导致部分闭合等高线圈内缺少高程点,高程点的缺失将使得无法判断闭合圈内部是凹地形还是凸地形,导致地形信息缺失问题。由此,在闭合线圈内部添加高程点是地形图制作的规范流程,而所添加的高程点值源于原始高程点(未稀释前),由此问题转换为如何排查出所有的最小闭合线圈(线圈内不再包含其他闭合线圈)。流程如下:

基于地形图大致情况,给定等高线面积阈值,快速选取出面积小于给定阈值的闭合线圈。此举将导致套和线圈的出现,在新工程文件中对套和线圈的外部线圈删除,仅保留最小闭合线圈,结果另存备用;

把已知闭合线圈和原始点云数据一同加载到GIS中,按位置选择提取出位于闭合线圈内部的原始点云,导出新文件(线圈内点云集合)并移除原始点云数据层。此刻所有高程点将位于闭合线圈内,下一步将在各闭合线圈内选取一个高程点数据作为闭合线圈的内部点;

把所有点添加xy数据,使其具有坐标位置(xyz)。把闭合线圈要素转点,用【空间连接】把距离闭合点最近的高程点的属性值(xyz)赋值给闭合点,其提取的最近唯一点属性值即是所需的闭合线圈内的高程点;

把闭合点的属性表导出dbf,在excel中打开,保留xyz列,利用展高程点展到cass中。此时,有些闭合线圈内原已有高程点,在最终检查中需要进行取舍(邻近高程点取其一即可)。

 

欢迎大家留言交流,有新的心得会来补更。

上一篇:Matlab中rgb2ind函数用法


下一篇:linux常用日志命令