这个可以用arcpy做,但太麻烦了,想了个简单的法子,直接用属性计算器计算了。
我用的是10.2版本的arcgis,而且是没汉化的英文版
主要分两部分,一部分是提取图斑包络四边形顶点,另一个是计算图幅号
如果发现计算的坐标不是经纬度,那得转地理坐标系。我转的是CGCS2000,大家按照数据本来的坐标系转对应的坐标系
不想转的话也可以,直接改图层frame属性
方法参考于:liuxupiaoshi的博客文章
第一步、新建一个属性ID 直接从零开始赋值(等于FID就可以了)
第二步、生成包络图形
第三步、提取特征点
第四步、新建X 、 Y 属性 ,计算点坐标
第五步、把点特征叠加到包络矩形,并作汇总
这里用的是相交工具:
对结果用提前设置好的ID作汇总
输出的是一个dbf表格
第六步、把这个表格用接回去
在原始图斑的属性表内利用ID属性进行join操作
其中,图幅号计算方法思路参考了darlun的博客文章中的代码
第一步、新建多个属性字段:
除了那个计数的属性,其他都是TEXT属性的
第二步,计算四个角点的图幅号,并用逗号隔开输出到 “总输出“ 属性
打开Field Calculator
LatCharArray = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V']
#图幅比例尺
scaleArray = [1000000,500000,250000,100000,50000,25000,10000,5000]
#图幅纬差,单位秒
latDArray = [14400,7200,3600,1200,600,300,150,75]
#图幅经差,单位秒
lonDArray = [21600,10800,5400,1800,900,450,225,112.5]
SCALE_1000000 = 0
SCALE_500000 = 1
SCALE_250000 = 2
SCALE_100000 = 3
SCALE_50000 = 4
SCALE_25000 = 5
SCALE_10000 = 6
SCALE_5000 = 7
#lat 为 纬度, lon为经度 1:5000的scaleID为7
def getSheetNumber(lat,lon,scaleID):
f = lat*3600; #以秒表示的纬度
r = lon*3600; #以秒表示的经度
numString = ''
a = int(f/(4*3600)); #纬度序号
b = int(r/(6*3600))+31; #经度序号
c = int(4*3600/latDArray[scaleID])-int((f%(4*3600))/latDArray[scaleID]); #在1:1000000万图幅中的序号 纬度
d = int((r%(6*3600))/lonDArray[scaleID])+1; #在1:1000000万图幅中的序号 经度
numString += LatCharArray[a];
numString += ""+ str(b);
#1:1000000万
if(scaleID==0):
return numString;
numString +=LatCharArray[scaleID];
if c<10:
numString += "00"
numString += str(c)
elif c<100:
numString += "0"
numString += str(c)
elif c<1000:
numString += str(c)
else:
return ""
if d<10:
numString += "00"
numString += str(d)
elif d<100:
numString += "0"
numString += str(d)
elif d<1000:
numString += str(d);
else:
return ""
return numString
def f(xmin,xmax,ymin,ymax):
return getSheetNumber(ymax,xmax,7)+ ',' + getSheetNumber(ymax,xmin,7)+ ',' + getSheetNumber(ymin,xmax,7)+ ',' + getSheetNumber(ymin,xmin,7)
# F1 F2 是我自己写的小代码,
# 补零位
def F1(a):
if a<10:
strout = '00' + str(int(a))
elif a < 100:
strout = '0' + str(int(a))
else:
strout = str(int(a))
return strout
def F2(x,y):
#区域编号头部
str1 = "I50H"
#1:5000标准经差
d1 = 1.0/60 + 52.5/3600
#标准纬度差
d2 = 1.0/60 + 15.0/3600
c = 4/d2 - int(( y % 4) /d2)
d = int((x % 6) / d1) + 1
str2 = F1(c)
str3 = F1(d)
str4 = str1 + str2 + str3
return str4
用field计算器开始运行代码,把代码粘到对应的框子里面
结果
第三步,计算重复与输出结果的中间步骤
中间输出格式为 [跨图幅数],[所有的图幅号]
代码是
#中间
def f(str0):
str0 = str0.split(',')
a = str0[0]
b = str0[1]
c = str0[2]
d = str0[3]
count = 1
str1 = a
if b!=a:
count +=1
str1 =str1 + ',' + b
if c !=a and c != b:
count +=1
str1 =str1 + ',' + c
if d != a and d != b and d != c:
count +=1
str1 =str1 + ',' + d
return str(count) + ',' + str1
第四步,输出结果
分别提取跨图幅数和图幅号
#count
def f (a):
return int(a[0])
#图幅号
def f (a):
return a[2:]