采矿权EXCEL文件坐标串矢量化和信息提取

解决思路:

1.采矿权文件坐标格式规则,百度出来的规则。

 2.将规则输入chatgpt中,让其给出arcpy的代码,如下结果

 

不得不说,chatgpt确实很强大,事半功倍。检查测试下了代码:xy坐标互换了下,解析坐标时列值有点不正确,index+1,好了,能正确输出矢量了。

 3.提取excel文件中的信息,转为矢量。

 (1)文件内容如下

(2)这里没有使用pandas库,直接粘贴信息值到记事本中,用“;”替换了制表符tab空格。然后读取txt文档,提取信息。读取记事本时由于utf-8字符的问题,换为了codecs库,这是代码。

#coding:utf-8
import arcpy
import os
import codecs


# 设置工作空间和输出shp文件名
arcpy.env.workspace = r"d:\data"
output_shp = "output_polygon.shp"
# 指定txt文件路径
txt_file_path = u"D:\\data\\ckq.txt"

# 创建空的shp文件
if os.path.exists(r"d:\data\output_polygon.shp"):
    arcpy.Delete_management(output_shp)

arcpy.CreateFeatureclass_management(arcpy.env.workspace, output_shp, "Polygon")

# 添加字段
arcpy.AddField_management(output_shp, "xh", "SHORT")
arcpy.AddField_management(output_shp, "ckxkzh", "TEXT","", "", 50)
arcpy.AddField_management(output_shp, "ckqr", "TEXT","", "", 100)
arcpy.AddField_management(output_shp, "ksmc", "TEXT","", "", 100)
arcpy.AddField_management(output_shp, "kckz", "TEXT","", "", 20)
arcpy.AddField_management(output_shp, "djmj", "DOUBLE")
arcpy.AddField_management(output_shp, "bz", "TEXT","", "", 50)

arcpy.AddField_management(output_shp, "cssj", "DOUBLE")
arcpy.AddField_management(output_shp, "csxj", "DOUBLE")
arcpy.AddField_management(output_shp, "qkbh", "TEXT")
arcpy.AddField_management(output_shp, "qkxz", "TEXT")

# 检查文件是否存在
if not os.path.isfile(txt_file_path):
    print(u"文件不存在。")
else:
    # 逐行读取txt文件
    with codecs.open(txt_file_path, 'r','utf-8-sig') as file:
        # 从坐标列表中提取数据并生成多边形
        with arcpy.da.InsertCursor(output_shp,
                                   ["SHAPE@", "xh", "ckxkzh", "ckqr", "ksmc", "kckz", "djmj", "bz", "cssj", "csxj",
                                    "qkbh", "qkxz"]) as cursor:

            for line in file:
                # 处理每一行数据
                #print(line.strip())  # .strip()用于去除行尾的换行符

                strline=line.strip()
                str_list =strline.split(";")
                xh = int(str_list[0])
                ckxkzh=str_list[1]
                ckqr=str_list[2]
                ksmc=str_list[3]
                kckz=str_list[4]
                djmj=float(str_list[5])
                zb=str_list[6]
                bz=str_list[7]

                # 读取示例坐标串
                coordinates_str = zb
                # 按照逗号分隔,解析坐标数据
                coordinates_list = coordinates_str.split(",")
                num_blocks = int(coordinates_list[0])

                index = 1
                for i in range(num_blocks):
                    num_vertices = int(coordinates_list[index])
                    block_vertices = []
                    for j in range(num_vertices):
                        x = float(coordinates_list[index + 3])
                        y = float(coordinates_list[index + 2])
                        block_vertices.append(arcpy.Point(x, y))
                        index += 3
                    if coordinates_list[index + 1]=='':
                        upper_elevation=0
                    else:
                        upper_elevation = float(coordinates_list[index + 1])
                    if coordinates_list[index + 2]=='':
                        lower_elevation=0
                    else:
                        lower_elevation = float(coordinates_list[index + 2])
                    block_id = coordinates_list[index + 3]
                    block_property = coordinates_list[index + 4]
                    index += 5

                    # 构建多边形
                    polygon = arcpy.Polygon(arcpy.Array(block_vertices))
                    cursor.insertRow([polygon,xh, ckxkzh, ckqr, ksmc,kckz,djmj,bz, upper_elevation, lower_elevation, block_id, block_property])

    print("Shapefile生成完成!")



# 在这里可以对每一行数据进行进一步处理,例如解析数据或进行其他操作

4.问题

(1)坐标串内容中部分坐标采深上届、采深下届缺失。

(2)遇到坐标点数与实际坐标不一致的情况。

处理:由于我要转的记录数较少,运行代码中遇到采深上届和采深下届坐标缺失的情况,直接用调试模式,发现到哪条记录错误,就直接改记事本上的属性值了。转完成功后,打开矢量文件,可以看其他列,特别是采深上届、采深下届、备注、区块性质的值,有异常的就检查原始值,改正后,重新执行输出。如果数据量较大,可以自行加上判断条件处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值