# -*-coding:utf-8-*-
import arcpy
import xlrd
# 探矿权坐标格式举例
# 1,4,111.0657,36.1630,111.0837,36.1630,111.0837,36.1409,111.0657,36.1409,0,0,0,
#2,5,113.3000,40.1830,113.3115,40.1830,113.3115,040.1930,113.3000,040.1930,113.3000,40.1830,0,0,0,5,113.3100,040.1845,113.3030,040.1845,113.3030,040.1900,113.3100,040.1900,113.3100,040.1845,-1,0,0,
# 生成的shp图形存放目录
arcpy.env.workspace = r"E:\tk.gdb"
fc = "tk"
# 读取xls文件
xlsfile = xlrd.open_workbook(r"E:\tk.xls", "r")
mysheet1 = xlsfile.sheet_by_name("tk")
rownum = mysheet1.nrows
colnum = mysheet1.ncols
# 如果工作空间下不存在该FeatureClass,那么新建FeatureClass
isexist = arcpy.Exists(fc)
if not isexist:
print fc + " 要素类不存在!"
exit()
# 创建插入游标,字段根据实际数据情况而定
# cursor = arcpy.da.InsertCursor(fc, ["XMMC", "DKID", "DKMC", "MJ", "SHAPE@"])
cursor = arcpy.da.InsertCursor(fc, ["bh", "OBJUID", "ID_LICENCEID", "NA_ITEM_NAME", "NA_APPLY_PERSON",
"NA_PERAMBULATE_COMP", "IN_COORDINATE_SYSTEM", "NA_AREA_COORDINATE", "SHAPE@"])
try:
# 遍历xls文件中所有行
for i in range(rownum):
row = mysheet1.row_values(i)
# 读取基本信息,这些基本信息主要根据xls文件来定
xh = row[0]
OBJUID = row[1]
ID_LICENCEID = row[2]
NA_ITEM_NAME = row[3]
NA_APPLY_PERSON = row[4]
NA_PERAMBULATE_COMP = row[5]
IN_COORDINATE_SYSTEM = row[6]
NA_AREA_COORDINATE = row[7]
print (ID_LICENCEID + ",is beginging...")
# 外圈坐标,即外圈矿山
_xypolylist = []
# 挖空坐标,即挖空矿山
_wkpolylist = []
# 临时坐标
_tempxylist = arcpy.Array()
# 坐标点的编号
bh = 0
# 获取区块数num_qk,字符串第1个逗号前的数字表示区块数
index_qk = NA_AREA_COORDINATE.find(",")
num_qk = int(NA_AREA_COORDINATE[:index_qk])
# 除过区块数,剩余的字符串
coordlist1 = NA_AREA_COORDINATE[index_qk + 1:]
# 获取坐标点数num_coord,字符串中第1个逗号前的数值表示坐标点数。(已经去掉了区块数)
index_coord = coordlist1.find(",")
num_coord = int(coordlist1[:index_coord])
# 获取外圈的坐标串,并去掉矿体标识0,0,0,(探矿数据中只有1个外圈,挖空可能有多个)
coordlist2 = coordlist1[index_coord + 1:]
index_zero = coordlist2.find(",0,0,0,")
# 检查下外圈是否存在,如果外圈不存在,则矿体标识有可能写错了譬如0,0,0,写成了-1,0,0,
if index_zero == -1:
print (ID_LICENCEID + ",is error...")
continue
_xycoordlist = coordlist2[:index_zero + 1]
# 奇数是经度,偶数是纬度
xylist = _xycoordlist.split(",")
for k in range(num_coord * 2):
if k % 2 == 0:
x = xylist[k].format("000.0000")
degrex = x[0:3]
minix = x[4:6]
secdx = x[6:8]
_x = ("%.15f" % (float(degrex) + float(minix) / 60 + float(secdx) / 3600))
else:
y = xylist[k].format("00.0000")
strstart = y[0]
_y = 0
if strstart == "0":
degrey = y[1:3]
miniy = y[4:6]
secdy = y[6:8]
_y = ("%.15f" % (float(degrey) + float(miniy) / 60 + float(secdy) / 3600))
else:
degrey = y[0:2]
miniy = y[3:5]
secdy = y[5:7]
_y = ("%.15f" % (float(degrey) + float(miniy) / 60 + float(secdy) / 3600))
# 读取坐标值
pnt = arcpy.Point()
# 依次为坐标点编号、纵坐标、横坐标
bh = bh + 1
pnt.ID = bh
pnt.X = _x
pnt.Y = _y
_tempxylist.append(pnt)
# 存放外圈图形
_xytemppolygon = arcpy.Polygon(_tempxylist)
_xypolylist.append(_xytemppolygon)
_tempxylist.removeAll()
# 获取内圈的坐标串,并根据-1,0,0,区分。如果数据中挖空标识不是以“-1,0,0,”结尾,则需要提前规范处理数据
if num_qk > 1:
str = coordlist2[index_zero + 7:]
# 规范处理挖空标识-1,-1,0,
indx = str.find(",-1,-1,0,")
if indx != -1:
str = str.replace(",-1,-1,0,", ",-1,0,0,")
# 规范处理挖空标识0,-1,0,
indx2 = str.find(",0,-1,0,")
if indx2 != -1:
str = str.replace(",0,-1,0,", ",-1,0,0,")
_wkcoordlist = str.split("-1,0,0,")
for m in range(num_qk - 1):
# 获取坐标点数,字符串中第1个逗号前的数值表示坐标点数。
bh = 0
strtemp = _wkcoordlist[m]
index_wkcoord = strtemp.find(",")
num_wkcoord = int(strtemp[:index_wkcoord])
strtemp2 = strtemp[index_wkcoord + 1:]
wkxylist = strtemp2.split(",")
for n in range(num_wkcoord * 2):
if n % 2 == 0:
x = wkxylist[n].format("000.0000")
degrex = x[0:3]
minix = x[4:6]
secdx = x[6:8]
_x = ("%.15f" % (float(degrex) + float(minix) / 60 + float(secdx) / 3600))
else:
y = wkxylist[n].format("00.0000")
strstart = y[0]
_y = 0
if strstart == "0":
degrey = y[1:3]
miniy = y[4:6]
secdy = y[6:8]
_y = ("%.15f" % (float(degrey) + float(miniy) / 60 + float(secdy) / 3600))
else:
degrey = y[0:2]
miniy = y[3:5]
secdy = y[5:7]
_y = ("%.15f" % (float(degrey) + float(miniy) / 60 + float(secdy) / 3600))
# 读取坐标值,当y坐标读取完,说明x坐标已经读取过了,此时可以生成坐标点了
pnt = arcpy.Point()
# 依次为坐标点编号、纵坐标、横坐标
bh = bh + 1
pnt.ID = bh
pnt.X = _x
pnt.Y = _y
_tempxylist.append(pnt)
# 将多个内圈图形存放到列表中
_xytemppolygon = arcpy.Polygon(_tempxylist)
_wkpolylist.append(_xytemppolygon)
_tempxylist.removeAll()
xypolynum = len(_xypolylist)
wkpolynum = len(_wkpolylist)
# 如果外圈矿山只有1个,挖空矿山1个或者多个,则执行裁剪,即交集取反
if xypolynum == 1 and wkpolynum >= 1:
poly = _xypolylist[0]
for p in range(wkpolynum):
poly = poly.symmetricDifference(_wkpolylist[p])
cursor.insertRow(
[xh, OBJUID, ID_LICENCEID, NA_ITEM_NAME, NA_APPLY_PERSON, NA_PERAMBULATE_COMP, IN_COORDINATE_SYSTEM,
NA_AREA_COORDINATE, poly])
print ID_LICENCEID.decode("gbk") + " is finished!"
continue
# 对于多个外圈矿山,1个或者多个挖空矿山,无法判断对哪个外圈矿山挖空
if xypolynum > 1 and wkpolynum >= 1:
print (ID_LICENCEID + ",无法判断挖空矿山!")
continue
# 遍历形成外圈地块
for q in range(xypolynum):
cursor.insertRow(
[xh, OBJUID, ID_LICENCEID, NA_ITEM_NAME, NA_APPLY_PERSON, NA_PERAMBULATE_COMP, IN_COORDINATE_SYSTEM,
NA_AREA_COORDINATE, _xypolylist[q]])
print ID_LICENCEID.decode("gbk") + " is finished!"
except Exception as err:
# print (err.args[0]).decode("gbk")
print " 请检查坐标格式是否正确,或者坐标存在自相交!"
else:
print "全部完成!"
del cursor
批量生成探矿_挖空矿区_十进制度分秒_xls字符串
原文:https://www.cnblogs.com/apromise/p/11496349.html