arcgis使用Python脚本进行批量截图

news2024/11/20 11:45:25

arcgis使用Python脚本进行批量截图

介绍

最近公司数据部那边有个需求,需要结合矢量数据和影像数据,进行批量截图,并且截图中只能有一个图斑,还要添加上相应的水印。

思路

一开始我是准备使用QGIS直接进行批量出图,但我发现使用布局管理器进行批量出图会有问题,截图时没办法将周边的其他图斑隐藏掉。然后考虑使用python调用QGIS的方法来进行操作,结果我是没找到什么示例或方法,如果其他人有方法可以分享一下。

最终还是准备使用arcpy进行批量截图,arcpy的例子就比较多了,这里我就展示一下我的方法和思路。个人认为比较low,勿喷!

  1. 使用mxd先设置好矢量图层和影像图层
  2. python加载矢量图层,并读取出所有的矢量数据唯一字段值
  3. 结合唯一字段值进行循环遍历,在mxd中的矢量图层中进行条件匹配,匹配到后定位到对应图斑上并设置层级缩放
  4. 设置了选中状态,选中的会蓝色(选中状态这个颜色和样式我不知道在哪改,如果有人知道请告知一下)
  5. 然后进行截图

准备

  1. 系统:win11
  2. ArcMap:10.2
  3. Python:2.7(arcmap自带的)

实现

mxd文件准备

提前准备好矢量图层和遥感影像数据,设置好需要样式

image-20230114153041056

python代码

# -*- coding:utf-8 -*-
"""
实现arcpy按照图斑自动截图,要使用python2.7,需要提前设置好mxd工程,并进行保存,如果进行前后时相截图,需要设置好label与所需季度影像
"""
import arcpy
#import os

#截图地图文件路径
input = "D:\\data\\tb_1.shp"
mxd_path = u"D:\\data\\tb_1.mxd"
mxd = arcpy.mapping.MapDocument(mxd_path)#通过MapDocument函数来引用地图文档
df = arcpy.mapping.ListDataFrames(mxd)[0]#返回名为Layers的数据框对象
for lyr in arcpy.mapping.ListLayers(mxd): #遍历地图文档的图层
    if lyr.name.startswith("tb_"):#指定图层文件,搜索为tb开头的文件夹,startwith函数用于检查字符串是否已指定字符串为开头,正确返回Trur,错误返回False。
        layermain = lyr#主要图层指定为layermain


#输出lyr.name10(输出指定图层的名称(需要截图图层))
print "Layer name: " + layermain.name

#循环
fields = ['TBBH']#根据field这个字段进行截图,field必须为唯一字段
values1 = [row[0] for row in arcpy.da.SearchCursor(input, fields)]#使用游标访问其中的字段,返回已fields字段的列表
#print values1
#清空选择
#arcpy.SelectLayerByAttribute_management(layermain, "CLEAR_SELECTION")#按属性选择图层工具,选择要素与行,并移除所有选择内容
#arcpy.RefreshActiveView()#刷新当前的地图文档的活动视图和内容列表

delimfield = arcpy.AddFieldDelimiters(input, 'TBBH')#生成相应的sql语句
#print delimfield

#循环
for val in values1:#遍历字段列表
    try:
       # 状态是0的图斑
        whereClause0 = delimfield+" = '"+str(val)+"'"#whereClause为"TBBH=val"字符串
        print(whereClause0)
        arcpy.SelectLayerByAttribute_management(layermain, "NEW_SELECTION", whereClause0)#按属性选择图层,创建一个新的选择内容,默认选择方式为后边字符串
        df.zoomToSelectedFeatures()#缩放至图层,按照当前图斑缩放
        df.scale = df.scale*2.5#图版按位置缩放距离图片边界3倍位置,根据图斑大小进行调节
        save_path = "D:\\data\\pic\\"+str(val)+".jpg"#保存图片为JPEG格式路径
        arcpy.mapping.ExportToJPEG(mxd,save_path)#按照val为文件名称进行保存,保存格式为JPEG格式
#        arcpy.mapping.ExportToJPEG(mxd,save_path,resolution = 200)#按照val为文件名称进行保存,保存格式为PNG格式
        arcpy.SelectLayerByAttribute_management(layermain, "CLEAR_SELECTION")#按照属性选择图层,并移除所有选择内容
        arcpy.RefreshActiveView()#刷新当前活动视图和内容列表
    except:
        print 'wrong'
del mxd
print "Beautiful!"

截图效果如下:

image-20230114152636001

图片添加需要的水印

图片上需要添加上一些水印,这里我使用Java代码进行操作也比较方便:

  	@Test
    void pic() {
        String srcDirStr = "D:\\data\\output";
        String destDirStr = "D:\\data\\res";
        File srcDir = new File(srcDirStr);
        String[] srcList = srcDir.list();
        String year = "2020年影像";
        for (String srcFileStr : srcList) {
            File srcFile = new File(srcFileStr);
            String fileName = getFileNameNoEx(srcFile.getName());
            List<String> markList = new ArrayList<String>();
            markList.add(fileName);
            markList.add(year);
            String srcFilePath = srcDirStr + File.separator + srcFile.getName();
            String destFilePath = destDirStr + File.separator + srcFile.getName();
            pressText(markList,
                    srcFilePath, destFilePath,
                    "黑体",
                    Font.TYPE1_FONT, new Color(0, 255, 255), 0.9f);
        }
    }


    /**
     * 获取不带扩展名的文件名
     *
     * @param filename 文件名
     * @return 不带扩展名的文件名
     */
    public String getFileNameNoEx(String filename) {
        if ((filename != null) && (filename.length() > 0)) {
            int dot = filename.lastIndexOf('.');
            if ((dot > -1) && (dot < (filename.length()))) {
                return filename.substring(0, dot);
            }
        }
        return filename;
    }

    /**
     * 给图片添加文字水印
     *
     * @param pressTextList 水印文字(一个集合一个值对应一条水印)
     * @param srcImageFile  源图像地址
     * @param destImageFile 目标图像地址
     * @param fontName      水印的字体名称
     * @param fontStyle     水印的字体样式
     * @param color         水印的字体颜色
     * @param alpha         透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
     */
    public void pressText(List<String> pressTextList,
                          String srcImageFile, String destImageFile, String fontName,
                          int fontStyle, Color color, float alpha) {
        try {
            File img = new File(srcImageFile);
            Image src = ImageIO.read(img);
            int width = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics2D g = image.createGraphics();
            // 计算水印字体大小 首先找出最长的水印文字
            //如果需要加水印的文字没有超过18个就按18个计算
            int maxLength = 18;
            for (String pressText : pressTextList) {
                if (getLength(pressText) > maxLength) {
                    maxLength = getLength(pressText);
                }
            }
            //根据图片宽度计算水字体大小
            int fontSize = (int) (((width) / (maxLength)) * 0.8);
            g.drawImage(src, 0, 0, width, height, null);
            g.setColor(color);
            g.setFont(new Font(fontName, fontStyle, fontSize));
//            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
//                    alpha));
            // 循环在指定坐标绘制水印文字
            int count = pressTextList.size();
            for (int i = 0; i < pressTextList.size(); i++) {
                if (i == 0) {
                    g.drawString(pressTextList.get(0), (int) ((width * 0.43) - (2 * fontSize)), (int) ((height * 0.05) + fontSize * count));
//                    g.drawString(pressTextList.get(0), (int) ((width * 0.35) - (2 * fontSize)), (int) ((height * 0.05) + fontSize * count));
                }
                if (i == 1) {
                    g.drawString(pressTextList.get(1), (int) ((width * 0.48) - (2 * fontSize)), (int) ((height * 0.90) - fontSize * count));
                }
                count--;
            }
            g.dispose();
            ImageIO.write(image, "JPEG", new File(destImageFile));// 输出到文件流
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 计算text的长度(一个中文算两个字符)
     *
     * @param text 文本
     * @return int
     */
    public int getLength(String text) {
        int length = 0;
        for (int i = 0; i < text.length(); i++) {
            if (new String(text.charAt(i) + "").getBytes().length > 1) {
                length += 2;
            } else {
                length += 1;
            }
        }
        return length / 2;
    }

水印效果如下:

image-20230114153539839

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ant Design在处理业务表单中的一些实践

文章目录前言表单处理实践Modal 清空旧数据使用Form.create和getFieldDecorator对Form进行包装表单控件是switch自定义表单控件Table列表SelectshowSearch 用于在选择框中显示搜索框其他需要注意的组件Tabs其它前言 目前&#xff0c;很多中小企业前端实现采用了react&#xff…

二、总线控制

文章目录一、引子二、总线判优控制1.基本概念2.方式&#xff08;1&#xff09;集中式①链式查询方式②计数器定时查询方式③独立请求方式&#xff08;2&#xff09;分布式三、总线通信控制1.基本概念2.方式&#xff08;1&#xff09;同步通信①介绍②同步式数据输入③同步数据输…

数据结构与算法学习推荐

推荐&#xff1a;官网地址&#xff1a;http://localhost:8000/algorithm/github&#xff1a;https://github.com/paiDaXing-web/You-Dont-Know-Algorithm 点star 大话搜索搜索一般指在有限的状态空间中进行枚举&#xff0c;通过穷尽所有的可能来找到符合条件的解或者解的个数。…

佳能C5235彩色激光复印机复印有底灰

故障描述&#xff1a; 佳能C5235彩色激光复印机&#xff0c;复印的时候有不同颜色的底灰问题&#xff1b; 检测分析&#xff1a; 打印不同纯色的纸张进行测试发现每张纸的上面都有不同颜色的底灰&#xff1b; 拆机进行检测吧&#xff0c;先打开前盖&#xff0c;拧下左右两边的螺…

CMake基础教程

CMake最大优势是跨平台&#xff0c;可以根据不同的平台生成Makefile文件&#xff0c;看下CMake的基础使用。 cmake&#xff08;单目录单文件&#xff09; 第一个最简单的cmake构建。 demo1.cpp代码&#xff1a; #include <iostream>using namespace std;int main(int…

【基于机械臂触觉伺服的物体操控研究】UR5e动力学建模及代码实现

我的毕设题目定为《基于机械臂触觉伺服的物体操控研究》&#xff0c;这个系列主要用于记录做毕设的过程。 前言&#xff1a;UR系列是优傲公司的代表产品&#xff0c;也是目前比较通用的产品级机械臂。所以我打算用该机械臂进行毕设的仿真实现。关于其动力学建模&#xff0c;网…

台阶问题-

台阶问题 题目描述 有NNN级的台阶&#xff0c;你一开始在底部&#xff0c;每次可以向上迈最多KKK级台阶&#xff08;最少111级&#xff09;&#xff0c;问到达第NNN级台阶有多少种不同方式。 输入格式 两个正整数N&#xff0c;K。 输出格式 一个正整数&#xff0c;为不同…

JVM(一)——架构基础

JVM java虚拟机 java gc 主要回收的是 方法区 和 堆中的内容&#xff0c;以下架构图是重点&#xff1a; 方法区和堆是线程共享&#xff0c;java栈、本机方法栈、程序计数器是线程私有。 运行时数据区可以用Runtime.getRuntime()获取 字节码执行引擎&#xff0c;修改程序计数器…

不要怀疑了,个人也是可以做好跨境电商的!

近几年随着跨境电商卖家们赚得盆满钵满&#xff0c;许多人都想从中分一杯羹&#xff0c;进而入住了跨境电商市场&#xff0c;有人与一些公司企业合作&#xff0c;也有人选择了自己做跨境电商平台&#xff0c;个人做的优劣势又有哪些呢&#xff1f; 个人做跨境电商平台最明显突…

A V L树

概念 在之前介绍了搜索二叉树&#xff0c;但是当我们插入的数据若是有序或者接近于有序&#xff0c;那么此时查找的效率底下&#xff0c;于是俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法&#xff1a;当向二叉搜索树中插入新结点后&am…

javaEE学生教学实习计划申报系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 javaEE学生教学实习计划申报系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&…

正点原子【第四期】手把手教你学 Linux之驱动开发篇-01

学习目的 了解驱动开发和应用开发的过程&#xff0c;具有一定的基础就行 第一讲&#xff1a;linux驱动开发与裸机开发区别 刚开始听不懂很正常&#xff0c;等之后学了一点你就会知道它说啥了 第二讲&#xff1a;字符设备驱动开发基础 字符设备驱动是最简单的&#xff0c;块设…

C++ 移动语义

从拷贝说起我们知道&#xff0c;C中有拷贝构造函数和拷贝赋值运算符。那既然是拷贝&#xff0c;听上去就是开销很大的操作。没错&#xff0c;所谓拷贝&#xff0c;就是申请一块新的内存空间&#xff0c;然后将数据复制到新的内存空间中。如果一个对象中都是一些基本类型的数据的…

【Unity3D】绘制物体外框线条盒子

1 需求描述 点选物体、框选物体、绘制外边框 中介绍了物体投影到屏幕上的二维外框绘制方法&#xff0c;本文将介绍物体外框线条盒子绘制方法。 内框&#xff1a;选中物体后&#xff0c;绘制物体的内框&#xff08;紧贴物体、并与物体姿态一致的内框盒子&#xff09;外框&#…

Python与C++语法比较--字符串篇

tags: C Python 写在前面 刷lc从Python转向C, 不只是语法层面, 还要改变很多的API, 这次记录一下C和Python在字符串方面的一些区别, 供参考. 基本区别 Python字符串是不可变类型, 而C的String为容器(本质上是一个类的别名, 说容器有点不合适, 因为容器内的元素类型已经被指…

Kotlin中的Lambda编程

文章目录1.集合的创建与遍历2.集合的函数式API3.Java函数式API的使用1.集合的创建与遍历 传统意义上的集合主要是List和Set&#xff0c;再广泛一点的话&#xff0c;像Map这样的键值对数据结构也可以包含进来。List&#xff0c;Set和Map再Java中都是接口&#xff0c;List主要的…

Java设计模式-命令模式Command

介绍 命令模式&#xff08;Command Pattern&#xff09;&#xff1a;在软件设计中&#xff0c;我们经常需要向某些对象发送请求&#xff0c;但是并不知道请求的接收 者是谁&#xff0c;也不知道被请求的操作是哪个&#xff0c; 我们只需在程序运行时指定具体的请求接收者即可&…

数影周报:TikTok因在线跟踪被罚500万欧,Windows 7退出历史舞台

本周看点&#xff1a;TikTok因在线跟踪被法国罚款500万欧元 &#xff1b;思科已裁员近700 人&#xff1b;Windows 7退出历史舞台&#xff1b;亚马逊向所有卖家开放Buy with Prime服务&#xff1b;“全路程”完成2亿元C轮融资......数据安全那些事TikTok因在线跟踪被法国罚款500…

Android13 wifi无线调试adb连接设置

在进行adb调试的时候&#xff0c;有时候需要使用wifi连接&#xff0c;或者wifi连接较为方便&#xff0c;早些的Android上&#xff0c;需要设置端口等操作&#xff0c;adb tcpip 6666参考android wifi adb 调试 - 简书 (jianshu.com)好几步操作&#xff0c;在Android13上&#x…

Deque 的理解 STL中stack与queue为什么选择使用deque为底层模板容器

目录 一、Deque的引入 二、Deque是什么&#xff1f; 三、deque的遍历方式&#xff1f;deque的缺陷&#xff1f; 四、它为什么能更贴合与stack与queue&#xff1f; 五、STL中vector与list的底层实现 一、Deque的引入 Stack、Queue在之前的博客中我也是分别使用了更容易处理…