arcgis使用Python腳本進(jìn)行批量截圖功能實(shí)現(xiàn)
arcgis使用Python腳本進(jìn)行批量截圖
介紹
最近公司數(shù)據(jù)部那邊有個(gè)需求,需要結(jié)合矢量數(shù)據(jù)和影像數(shù)據(jù),進(jìn)行批量截圖,并且截圖中只能有一個(gè)圖斑,還要添加上相應(yīng)的水印。
思路
一開始我是準(zhǔn)備使用QGIS直接進(jìn)行批量出圖,但我發(fā)現(xiàn)使用布局管理器進(jìn)行批量出圖會(huì)有問題,截圖時(shí)沒辦法將周邊的其他圖斑隱藏掉。然后考慮使用python調(diào)用QGIS的方法來進(jìn)行操作,結(jié)果我是沒找到什么示例或方法,如果其他人有方法可以分享一下。
最終還是準(zhǔn)備使用arcpy進(jìn)行批量截圖,arcpy的例子就比較多了,這里我就展示一下我的方法和思路。個(gè)人認(rèn)為比較low,勿噴!
- 使用mxd先設(shè)置好矢量圖層和影像圖層
- python加載矢量圖層,并讀取出所有的矢量數(shù)據(jù)唯一字段值
- 結(jié)合唯一字段值進(jìn)行循環(huán)遍歷,在mxd中的矢量圖層中進(jìn)行條件匹配,匹配到后定位到對應(yīng)圖斑上并設(shè)置層級(jí)縮放
- 設(shè)置了選中狀態(tài),選中的會(huì)藍(lán)色(選中狀態(tài)這個(gè)顏色和樣式我不知道在哪改,如果有人知道請告知一下)
- 然后進(jìn)行截圖
準(zhǔn)備
- 系統(tǒng):win11
- ArcMap:10.2
- Python:2.7(arcmap自帶的)
實(shí)現(xiàn)
mxd文件準(zhǔn)備
提前準(zhǔn)備好矢量圖層和遙感影像數(shù)據(jù),設(shè)置好需要樣式

python代碼
# -*- coding:utf-8 -*-
"""
實(shí)現(xiàn)arcpy按照圖斑自動(dòng)截圖,要使用python2.7,需要提前設(shè)置好mxd工程,并進(jìn)行保存,如果進(jìn)行前后時(shí)相截圖,需要設(shè)置好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函數(shù)來引用地圖文檔
df = arcpy.mapping.ListDataFrames(mxd)[0]#返回名為Layers的數(shù)據(jù)框?qū)ο?
for lyr in arcpy.mapping.ListLayers(mxd): #遍歷地圖文檔的圖層
if lyr.name.startswith("tb_"):#指定圖層文件,搜索為tb開頭的文件夾,startwith函數(shù)用于檢查字符串是否已指定字符串為開頭,正確返回Trur,錯(cuò)誤返回False。
layermain = lyr#主要圖層指定為layermain
#輸出lyr.name10(輸出指定圖層的名稱(需要截圖圖層))
print "Layer name: " + layermain.name
#循環(huán)
fields = ['TBBH']#根據(jù)field這個(gè)字段進(jìn)行截圖,field必須為唯一字段
values1 = [row[0] for row in arcpy.da.SearchCursor(input, fields)]#使用游標(biāo)訪問其中的字段,返回已fields字段的列表
#print values1
#清空選擇
#arcpy.SelectLayerByAttribute_management(layermain, "CLEAR_SELECTION")#按屬性選擇圖層工具,選擇要素與行,并移除所有選擇內(nèi)容
#arcpy.RefreshActiveView()#刷新當(dāng)前的地圖文檔的活動(dòng)視圖和內(nèi)容列表
delimfield = arcpy.AddFieldDelimiters(input, 'TBBH')#生成相應(yīng)的sql語句
#print delimfield
#循環(huán)
for val in values1:#遍歷字段列表
try:
# 狀態(tài)是0的圖斑
whereClause0 = delimfield+" = '"+str(val)+"'"#whereClause為"TBBH=val"字符串
print(whereClause0)
arcpy.SelectLayerByAttribute_management(layermain, "NEW_SELECTION", whereClause0)#按屬性選擇圖層,創(chuàng)建一個(gè)新的選擇內(nèi)容,默認(rèn)選擇方式為后邊字符串
df.zoomToSelectedFeatures()#縮放至圖層,按照當(dāng)前圖斑縮放
df.scale = df.scale*2.5#圖版按位置縮放距離圖片邊界3倍位置,根據(jù)圖斑大小進(jìn)行調(diào)節(jié)
save_path = "D:\\data\\pic\\"+str(val)+".jpg"#保存圖片為JPEG格式路徑
arcpy.mapping.ExportToJPEG(mxd,save_path)#按照val為文件名稱進(jìn)行保存,保存格式為JPEG格式
# arcpy.mapping.ExportToJPEG(mxd,save_path,resolution = 200)#按照val為文件名稱進(jìn)行保存,保存格式為PNG格式
arcpy.SelectLayerByAttribute_management(layermain, "CLEAR_SELECTION")#按照屬性選擇圖層,并移除所有選擇內(nèi)容
arcpy.RefreshActiveView()#刷新當(dāng)前活動(dòng)視圖和內(nèi)容列表
except:
print 'wrong'
del mxd
print "Beautiful!"
截圖效果如下:

圖片添加需要的水印
圖片上需要添加上一些水印,這里我使用Java代碼進(jìn)行操作也比較方便:
@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);
}
}
/**
* 獲取不帶擴(kuò)展名的文件名
*
* @param filename 文件名
* @return 不帶擴(kuò)展名的文件名
*/
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 水印文字(一個(gè)集合一個(gè)值對應(yīng)一條水印)
* @param srcImageFile 源圖像地址
* @param destImageFile 目標(biāo)圖像地址
* @param fontName 水印的字體名稱
* @param fontStyle 水印的字體樣式
* @param color 水印的字體顏色
* @param alpha 透明度:alpha 必須是范圍 [0.0, 1.0] 之內(nèi)(包含邊界值)的一個(gè)浮點(diǎn)數(shù)字
*/
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();
// 計(jì)算水印字體大小 首先找出最長的水印文字
//如果需要加水印的文字沒有超過18個(gè)就按18個(gè)計(jì)算
int maxLength = 18;
for (String pressText : pressTextList) {
if (getLength(pressText) > maxLength) {
maxLength = getLength(pressText);
}
}
//根據(jù)圖片寬度計(jì)算水字體大小
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));
// 循環(huán)在指定坐標(biāo)繪制水印文字
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();
}
}
/**
* 計(jì)算text的長度(一個(gè)中文算兩個(gè)字符)
*
* @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;
}
水印效果如下:

到此這篇關(guān)于arcgis使用Python腳本進(jìn)行批量截圖功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python批量截圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pyinstaller打包可執(zhí)行文件出現(xiàn)KeyError的問題
這篇文章主要介紹了pyinstaller打包可執(zhí)行文件出現(xiàn)KeyError的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié)
這篇文章主要介紹了Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié),需要的朋友可以參考下2014-05-05
解決Scrapy安裝錯(cuò)誤:Microsoft Visual C++ 14.0 is required...
下面小編就為大家?guī)硪黄鉀QScrapy安裝錯(cuò)誤:Microsoft Visual C++ 14.0 is required...的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
python抓取豆瓣圖片并自動(dòng)保存示例學(xué)習(xí)
python抓取豆瓣圖片并自動(dòng)保存示例學(xué)習(xí),示例使用了beautifulsoup庫分析HTML代碼,beautifulsoup是一個(gè)HTML/XML解析器,可以用來做網(wǎng)頁爬蟲2014-01-01
Python利用ROI進(jìn)行圖像合成的問題小結(jié)
圖像的 ROI (region of interest) 是指圖像中感興趣區(qū)域、在 OpenCV 中圖像設(shè)置圖像 ROI 區(qū)域,實(shí)現(xiàn)只對 ROI 區(qū)域操作,本文給大家介紹Python利用ROI進(jìn)行圖像合成的問題小結(jié),感興趣的朋友一起看看吧2021-07-07
YOLOv5中SPP/SPPF結(jié)構(gòu)源碼詳析(內(nèi)含注釋分析)
其實(shí)關(guān)于YOLOv5的網(wǎng)絡(luò)結(jié)構(gòu)其實(shí)網(wǎng)上相關(guān)的講解已經(jīng)有很多了,但是覺著還是有必要再給大家介紹下,下面這篇文章主要給大家介紹了關(guān)于YOLOv5中SPP/SPPF結(jié)構(gòu)源碼的相關(guān)資料,需要的朋友可以參考下2022-05-05

