ArcGis-批量出图-实现隐藏不想要的要素(不显示其他要素)与“公共要素”的处理

文章介绍了如何使用ArcGIS通过数据驱动和缓冲区结合空间连接的方法,批量生成每个分区的特定图片,只显示相应分区的范围线和像控点。首先创建分区的缓冲区,然后通过空间连接将分区号赋予像控点。接着使用ArcPy脚本进行数据驱动出图,确保每个分区的像控点正确显示且不包含其他分区的点。
摘要由CSDN通过智能技术生成

简单的说明:

        这篇文章与作者的另一篇文章使用的方法、工具部分相同,但目的不同,核心工具不同,达到的效果不同。如果需求不适用本文章的方法,可以看看另一篇:

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并没有数据驱动,改为了地图序列。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值