简单的说明:
这篇文章与作者的另一篇文章使用的方法、工具部分相同,但目的不同,核心工具不同,达到的效果不同。如果需求不适用本文章的方法,可以看看另一篇:
ArcGis-批量出图-利用“数据驱动”实现完美批量出图,只显示“当前驱动的要素”及“与当前要素属性相同的其他要素”_arcgis数据驱动页面批量出图
-----下面正式开始--------------------
首先介绍一下本次所用到的数据,以及需要实现的目标
1. 数据介绍
红色的范围: 表示分区 蓝色&黑色的叉叉: 表示像控点
标注为分区对应的分区号
上方是模拟制作 “像控点+摄区” 结合图,所需要用到的数据,如果了解航空摄影测量或者正射影像、倾斜影像的制作会比较熟悉。(用于演示的数据是随便制作的,不要在意点密度)
简单的来说:就是每个分区需要输出一张图片,并且每张图片只显示本分区的范围线与本分区的像控点,另外,像控点需要可以完整包含本分区,(像控点需要围绕着分区,离分区太远的点不显示)
下图为本方法实现的结果
-----情况分析与数据处理--------------------
依据我们需要得到的结果,可以得,需要一个,让像控点与分区对应上的要素,并且公共点需要对应两个或多个分区
所以,我们采用缓冲区+空间连接的方式,将分区号赋予像控点
1.首先,建立分区的缓冲区,缓冲的距离,依据公共点的分布情况进行设定,缓冲至可包含所有公共点即可
结果如上图黑色范围,每个分区对应缓冲区包含了其所需的像控点
2.再使用空间连接,将缓冲区的“分区号”属性,赋予像控点
注意:一定要改合并规则,不然公共点提取属性会错误
结果如上图属性表,空间连接后,生成的像控点_SpatialJoin,就有了分区号的属性,并且处于多分区交叉处的点,会写入多个分区号。
处理完成后,就可以通过筛选,来选择所需要的像控点了。如下,将分区内,分区外,以及公共的像控点全部选择了出来。如下图。(此条为非必要步骤,仅作展示用)
使用sql查询函数:分区号 LIKE '%分区1%'(此条为非必要步骤,仅作展示用)
-----准备工作结束,下面开始制图--------------------
制图我们需要用到的要素有:
原始的分区 以及空间连接工具生成的 像控点_SpatialJoin
1.然后切换到布局视图(符号我就不调整了)
2.将分区复制一个(右键分区,复制,然后右键“图层”,粘贴图层)
3.将分区-复制的符号改为无颜色,并关闭分区-复制的标注!!!!!
4.开启数据驱动,并将数据驱动要素设置为分区-复制,名称字段改为分区号(空间连接时,给予像控点属性的字段)
5.右键分区,打开属性,配置页面定义查询并应用,
此时我们跳转数据驱动就可以发现,其他的分区不会显示了,但其他分区的点还是显示着的。
但是!保存工程!关闭工程!打开一个新的ArcMap窗口!
处理点的话,就交给万能的 ArcPy吧!!!!
-----ArcPy启动!!!-------------------
1.出图的代码如下,改变 5-11行的参数即可,具体要求看注释,另外,路径需要用双斜杠分割,u'里边的才是具体内容',u'’不要删掉,基于arcgis10.4编写,低版本可能不适用,pro所有版本不适用
import arcpy, os, sys
reload(sys)
sys.setdefaultencoding('utf-8')
mxd_path = u'D:\\test\\csdn.mxd' # arcmap出图工程路径
fc_path = u'E:\\test\\csdn_1.gdb\\分区' # 驱动要素路径
fc2_name = u'像控点_SpatialJoin' # 像控点图层名称(在图层内显示的名称,不是要素名)
ddp_FieldName = u'分区号' # 数据驱动名称字段
Export_NameField = u'分区号' # 输出文件命名字段 # 可自定义,可与 数据驱动名称字段 保持一致,但本字段要素内必须有
output = u'E:\\test\\图' # 输出位置
rtion = 100 # 输出像素
if Export_NameField in ['', ' ', None]:
Export_NameField = ddp_FieldName
x = {}
cursor = arcpy.SearchCursor(fc_path) # 遍历 数据驱动要素的 驱动字段 和 文件命名字段组成 字典“x”
for row in cursor: #
x[row.getValue(ddp_FieldName)] = row.getValue(Export_NameField) #
pp = 0
for pageName in x.keys(): # 循环 “x”
mxd = arcpy.mapping.MapDocument(mxd_path) # 调用gis工程
df = arcpy.mapping.ListDataFrames(mxd)[0] # 获取布局
for lyr in arcpy.mapping.ListLayers(mxd, "", df): # 获取要素图层
if lyr.name == fc2_name:
lyr.definitionQuery = u"{1} LIKE \'%{0}%\'".format(pageName, ddp_FieldName) # 修改定义查询
mxd.save()
pageID = mxd.dataDrivenPages.getPageIDFromName(pageName) # 以驱动字段 获取 pageID (驱动索引)
mxd.dataDrivenPages.currentPageID = pageID # 数据驱动(跳转到 上述索引位置)
arcpy.mapping.ExportToPNG(mxd, os.path.join(output, '{}.png'.format(x[pageName])), resolution=rtion) # 导出 png
pp += 1
del mxd
2.将改好的代码复制入pyhton窗口运行即可,(粘贴后按回车,如果出现三个点“...”就再回车一次),python窗口位置如下:
其他,如果你使用的是arcgis pro,可能无法使用此代码,pro并没有数据驱动,改为了地图序列。