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)行批量出圖會有問題,截圖時(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è)置層級縮放
- 設(shè)置了選中狀態(tài),選中的會藍(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按照圖斑自動截圖,要使用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)前的地圖文檔的活動視圖和內(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)前活動視圖和內(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-11Python 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-10python抓取豆瓣圖片并自動保存示例學(xué)習(xí)
python抓取豆瓣圖片并自動保存示例學(xué)習(xí),示例使用了beautifulsoup庫分析HTML代碼,beautifulsoup是一個(gè)HTML/XML解析器,可以用來做網(wǎng)頁爬蟲2014-01-01Python利用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-07YOLOv5中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