批量生成探矿_挖空矿区_十进制度分秒_xls字符串

# -*-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
 
posted @ 2019-09-10 11:13  kkqq8860928  阅读(262)  评论(0编辑  收藏  举报