2023年11月26日发(作者:)
ArcGIS以表格显⽰分区统计区域重叠解决⽅案dbf⽂件合并
ArcGIS以表格显⽰分区统计 区域重叠解决⽅案/dbf⽂件合并
⽂章⽬录
1.⼯具分析
以表格显⽰分区统计,是arcmap⾥空间分析⼯具中区域分析下的⼀个⼦⼯具。它通过指定要素数据集和栅格数据集,以及对应分区字段,
将
汇总另⼀个数据集区域内的栅格数据值并将结果报告到表。
这个⼯具对于某些⽆重叠的区域⾮常好⽤,⽐如统计每个⾏政区域的指数。但是对于某些重叠的数据集区域,就会出现问题。
2.出现问题的原因
我遇到这个问题是因为任务要求计算,全国333个村庄的植被覆盖指数。333个村庄只有点的数据信息,需要先对其做缓冲区分析,得出
1km、3km、5km的圆形缓冲区再计算。
然⽽⼀些村庄相邻的很近,最后⽣成的表格⾥,有的村庄直接消失了。经排查发现,是由于区域重叠导致的,丢失的村庄是因为和别的村庄
重叠过多。使⽤以表格显⽰分区统计的时候,分区统计会⾃动剔除掉重叠的部分,以⾄于有些缓冲区根本没法得到数据值。
3.解决⽅法
针对这⼀问题我们没有找到相关的设置能够解决,于是想了⼀个⽐较笨的⽅法,核⼼思想就是将所有的对象⼀个⼀个的计算从⽽避免重叠,
具体步骤如下:
2).使⽤python编程
打开ArcMap中的对应python⼯具(⼯具栏->地理处理->Python),输⼊以下代码:
import arcpy
from arcpy import env
from arcpy.sa import *
village=260 #
遍历村庄
year=2001 #
遍历年数
oup="D:地理经济2output3" #
输出⽂件夹
cfileP="D:地理经济2hi" #
栅格⽂件夹
inp="D:地理经济" #gdb.gdb
村庄缓冲区⽂件夹,注意我把其放在了下,⽂件夹名称下的⼀定不能扔掉
for year in range(2001,2002): #
选择遍历年数
for village in range (260,334): #
选择遍历刚刚⽣成的村庄
inp1=inp+str(viilage) #str(village)
每⼀轮的真实输⼊路径,⼀定要,不能直接加
oup1=oup+""+str(year)+""+str(i)+".dbf" #
每⼀轮的输出路径(注意要双杠不能单杠,否则报错)
cfileP1=cfileP+""+str(year)+"ndvi"+str(year)+"a" #
每⼀轮的栅格路径
outZSat=ZonalStatisticsAsTable(inp1,"OBJECTID",cfileP1,oup1,"DATA","ALL") #
调⽤函数
关于上述的路径,
1) 村庄的缓冲区是放在gdb下的
2) 栅格数据是按年分别放在对应⽂件夹下的
3) 输出⽂件夹⾥,事先准备好了各年份的⽂件夹,⽅便数据分类,当然可以根据⾃⼰的需要调整
其实原理很简单其实就是调⽤了其函数,函数的各个值的含义如下
语法
ZonalStatisticsAsTable (in_zone_data, zone_field, in_value_raster, out_table, {ignore_nodata}, {statistics_type})
参数说明
数据类
型
Raster
Layer
Fieldzone_field保存定义每个区域的值的字段。该字段可以是区域数据集的整型字段或字符串型字段
Raster
Layer
Tableout_table将包含每个区域中值的汇总的输出表。
in_zone_data定义区域的数据集。可通过整型栅格或要素图层来定义区域。
in_value_raster含有要计算统计数据的值的栅格。
指⽰值输⼊中的 NoData 值是否会影响其所落⼊区域的结果。DATA — 在任意特定区域内,仅使⽤在输⼊值栅格中拥有
ignore_nodata(可值的像元来确定该区域的输出值。在统计计算过程中,值栅格内的 NoData 像元将被忽略。NODATA — 在任意特定区
选)域内,如果值栅格中存在任何 NoData 像元,则会视作对该区域中所有像元执⾏统计计算的信息不⾜;因此,整个区域在
输出栅格中都将接收 NoData 值。
要计算的统计类型。
ALL —将计算所有的统计数据。这是默认设置.
MEAN — 计算值栅格中与输出像元同属⼀个区域的所有像元的平均值。
MAJORITY — 确定值栅格中与输出像元同属⼀个区域的所有像元中最常出现的值。
MAXIMUM — 确定值栅格中与输出像元同属⼀个区域的所有像元的最⼤值。
MEDIAN — 确定值栅格中与输出像元同属⼀个区域的所有像元的中值。
MINIMUM — 确定值栅格中与输出像元同属⼀个区域的所有像元的最⼩值。
MINORITY — 确定值栅格中与输出像元同属⼀个区域的所有像元中出现次数最少的值。String
RANGE — 计算值栅格中与输出像元同属⼀个区域的所有像元的最⼤值与最⼩值之差。
STD — 计算值栅格中与输出像元同属⼀个区域的所有像元的标准差。
SUM — 计算值栅格中与输出像元同属⼀个区域的所有像元的值的总和。
VARIETY — 计算值栅格中与输出像元同属⼀个区域的所有像元中唯⼀值的数⽬。
MIN_MAX —既计算最⼩值统计数据也计算最⼤值统计数据。
MEAN_STD —既计算平均值统计数据也计算标准差统计数据。
MIN_MAX_MEAN —同时计算最⼩值、最⼤值和平均值统计数据。
Boolean
Statistics_type(可
选)
TIPS贴⼠
参数说明
数据类
型
命名⼀定要到位,不管是输⼊还是输出,可以减少很多⿇烦
⼀般来说选择Data和ALL,这⾥给出各个参考值的实际含义⽅便之后对数据进⾏解释
输出⽂件路径⼀定要加⽂件格式,这⾥我选择的是.DBF
这⾥其实还可以多加循环,⼀次性把1km,3km,5km的缓冲都给算了,但是奈何笔记本算⼒有限,⼀下⼦算很多容易卡,出问题,
所以还是不推荐使⽤很多的for循环嵌套。当然算⼒很强的随意鸭,
4).合并dbf表格
这样最后的出来的就是⼀⼤堆⼀⾏的表格,但是实际操作的时候肯定是要⼀个完整具有所有数据的表格鸭。这⾥使⽤了Excel的⼀段函数,
进⾏修改,则可以合并每个⽂件夹中所有的dbf⽂件到⼀个表格。
但是啊这个效率也是奇慢⽆⽐!!不得⽐统计的快……欢迎提出更好的⽅法!
操作如下:
Sub 合并当前⽬录下所有⼯作簿的全部⼯作表()
Dim MyPath, MyName, AWbName
Dim Wb As Workbook, WbN As String
Dim G As Long
Dim Num As Long
Dim BOX As String
Updating = False
MyPath =
MyName = Dir(MyPath & "" & "*.dbf")
AWbName = ActiveWorkbook.Name
Num = 0
Do While MyName <> ""
If MyName <> AWbName Then
Set Wb = Workbooks.Open(MyPath & "" & MyName)
Num = Num + 1
With Workbooks(1).(.Range("B65536").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
For G = 1 To
(G). .Cells(.Range("B65536").End(xlUp).Row + 1, 1)
Next
WbN = WbN & Chr(13) & Wb.Name
Wb.Close False
End With
End If
MyName = Dir
Loop
Range("B1").Select
Updating = True
MsgBox "共合并了" & Num & "个⼯作薄下的全部⼯作表。如下:" & Chr(13) & WbN, vbInformation, "提⽰"
End Sub
上述代码还可以把dbf改为xml,就可以合并excel的表格了,还是有那么⼀点实⽤的
3. 合并之后的表有表头,全选所有数据,再选择菜单栏上的数据->筛选
点击任意⼀个表头勾掉除了数字以外的字符即可获得完整表
4. 这样完了之后还差原来的村庄数据,所以再连接⼀次!注意排序!这⾥的排序是⽂本排序,即1,10,100酱紫的。
命名真的很重
要
,依次连接⽣成数据表和原来的村庄信息表,即完成处理。
4. 总结
总的来说这个⽅法还是挺暴⼒的,⽽且算的⾮常慢噢,包括后⾯的表格合并,需要耗费⼤量的时间,确实算不上是个好⽅法,欢迎交流如果
有别的⽅法~


发布评论