我的编程空间,编程开发者的网络收藏夹
学习永远不晚

arcgis使用Python脚本进行批量截图功能实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

arcgis使用Python脚本进行批量截图功能实现

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

介绍

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

思路

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

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

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

准备

  • 系统:win11
  • ArcMap:10.2
  • Python:2.7(arcmap自带的)

实现

mxd文件准备

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

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!"

截图效果如下:

图片添加需要的水印

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

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


    
    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;
    }

    
    public void pressText(List<String> pressTextList,
                          String class="lazy" data-srcImageFile, String destImageFile, String fontName,
                          int fontStyle, Color color, float alpha) {
        try {
            File img = new File(class="lazy" data-srcImageFile);
            Image class="lazy" data-src = ImageIO.read(img);
            int width = class="lazy" data-src.getWidth(null);
            int height = class="lazy" data-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(class="lazy" data-src, 0, 0, width, height, null);
            g.setColor(color);
            g.setFont(new Font(fontName, fontStyle, fontSize));
//            g.setComposite(AlphaComposite.getInstance(AlphaComposite.class="lazy" data-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();
        }
    }

    
    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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

arcgis使用Python脚本进行批量截图功能实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

arcgis使用Python脚本进行批量截图功能实现

最近公司数据部那边有个需求,需要结合矢量数据和影像数据,进行批量截图,并且截图中只能有一个图斑,还要添加上相应的水印,这篇文章主要介绍了arcgis使用Python脚本进行批量截图,需要的朋友可以参考下
2023-01-15

使用Linux shell脚本实现FTP定时执行批量下载指定文件

使用FTP定时批量下载指定文件的shell脚本,具体实例介绍如下所示: 1、目标FTP服务器地址#FTP服务器地址 ip=10.19.15.232、FTP账号和密码 u=账号 p=密码 3、使用mget结合正则表达式下载文件#获取昨天日期,
2022-06-04

如何使用Linux中shell脚本实现FTP定时执行批量下载指定文件

小编给大家分享一下如何使用Linux中shell脚本实现FTP定时执行批量下载指定文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用FTP定时批量下载指定文件
2023-06-09

使用Python脚本实现批量网站存活检测遇到问题及解决方法

做渗透测试的时候,有个比较大的项目,里面有几百个网站,这样你必须首先确定哪些网站是正常,哪些网站是不正常的。所以自己就编了一个小脚本,为以后方便使用。 具体实现的代码如下:#!/usr/bin/python # -*- coding: UT
2022-06-04

vue使用echarts实现中国地图和点击省份进行查看功能

这篇文章主要介绍了vue使用echarts实现中国地图和点击省份进行查看功能,本文通过实例代码给大家详细讲解,对vueecharts中国地图相关知识感兴趣的朋友一起看看吧
2022-12-08

钉钉宜搭低代码教程如何定位省份 简介本文将详细解释如何使用钉钉宜搭进行低代码开发,通过定位省份来实现特定功能。

在低代码开发中,我们经常需要处理地理位置信息,比如获取用户所在的城市或省份。钉钉宜搭提供了强大的地理信息处理能力,通过定位省份,我们可以轻松实现各种功能。下面,我们将详细解释如何在钉钉宜搭中定位省份。一、创建项目首先,我们需要在钉钉宜搭中创建一个新的项目。打开宜搭后,点击左上角的“+”号,选择“新建项目”,然后填写项目
钉钉宜搭低代码教程如何定位省份 简介本文将详细解释如何使用钉钉宜搭进行低代码开发,通过定位省份来实现特定功能。
2023-11-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录