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