應用場景:
最近在做某區退耕還林驗收項目,要求按每個村出比例尺1:10000的JPG格式的圖片,由於村比較多(接近400個,很多村在1:10000比例尺下無法顯示完整,需要出多張圖片),所以考慮批量完成該工作。
思路:
1.設定好MXD模板佈局視圖,調整好所有圖例,將標題設置爲變量,可以根據某個村的名字自動變化;
2.一個村無法只導出一張圖片的情況,需要生成輔助圖層分幅,分幅使用FME,生成圖形的外接矩形,計算矩形長寬以及長寬/出圖的幅寬,向上取整爲倍數,使用切片工具按照兩個倍數值進行切片,然後使用裁剪工具對原圖形進行裁剪,只取出inside部分;
分幅之後大約有1000個圖幅,後續再用造林小班和分幅圖疊加,篩選出有疊加部分並排序,生成唯一字段。
3.在進行2步驟的時候,因爲矩形之間有交叉部分必須要單獨對每個圖形進行處理,因此可以使用FME WORKSPACERUNER轉換器循環執行,寫入GDB文件中;
4.將GDB所有屬性值導出爲EXCEL文件待用;
5.根據4生成的EXCEL文件使用PYTHON生成若干個(數量和GDB文件中的矢量圖形數量相等,名稱和GDB文件中唯一值對應)MXD文檔,待用;
6.使用ARCPY選中要素,縮放至選中要素,清除所選要素(注意這裏有坑),更改標題變量值;
7.使用ARCPY導出JPEG圖片。
具體步驟:
1 MXD模板製作
MXD模板製作有兩個要點。
第一個是要對需要發生變化的文本、圖例賦上唯一名稱。右鍵選中文本或圖例,點擊“屬性”→“大小和位置”→“元素名稱”,自己按照需求添加。
第二個是要固定比例尺,因爲不固定比例尺,在後續使用ARCPY縮放至選中要素功能時會自動縮放到不同的比例尺(每個村大小不同導致,也是因爲如此需要分幅)。右鍵點擊“圖層”→“數據庫”,設定“範圍”爲“固定比例”,比例調整爲所需大小,此處我設置爲1:10000.
2 行政村分幅
下圖爲FME模板
3 使用PYTHON生成MXD文檔
考慮到需要對過程文件的記錄,選擇先生成MXD文檔的方式(也可以在調整圖形時直接生成),因爲習慣用PYTHON3,所以這一步驟還是用的PYTHON3寫的,比較簡單,以下是代碼。
# -*- coding: utf-8 -*-
import shutil,sys
from openpyxl import load_workbook
old_file_path=r"F:\arcgis\2018.mxd"
if __name__=='__main__':
workbook=load_workbook(r'F:\arcgis\TEST.xlsx')
sheet=workbook.get_sheet_by_name("CJ")
rows=sheet.rows
cols=sheet.columns
max_rows=sheet.max_row
max_columns=sheet.max_column
Lfile=[]
for i in sheet["H"]:
if i.value!='IID':
Lfile.append(i.value)
print(Lfile)
for i in Lfile:
new_file_path=r"F:\arcgis\{0}.mxd".format(i)
shutil.copyfile(old_file_path,new_file_path)
4 使用ARCPY生成重新生成MXD文檔
必須使用arcgis自帶的python,我使用的是arcgis10.3,自帶python2.7,以下是代碼。
# -*- coding: utf-8 -*-
import arcpy,os,sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
def resetmxd(iid):
filename="{0}.mxd".format(iid)
mxd = arcpy.mapping.MapDocument(filename)
lyr = arcpy.mapping.ListLayers(mxd)[0] # 需要改動的圖層,這裏是選擇要素的圖層
lyr1 = arcpy.mapping.ListLayers(mxd)[4] # 需要縮放高亮顯示的圖層,可選
df = arcpy.mapping.ListDataFrames(mxd)[0]
rows = arcpy.SearchCursor(lyr) #行數
for row in rows:
if row.getValue("IID")==iid:
title=u'2018年度{0}退耕還林'.format(row.getValue("title"))
query = "IID='{0}'".format(iid) #檢索條件
print query
arcpy.SelectLayerByAttribute_management(lyr, "NEW_SELECTION", query) # 選中一個新的要素
df.zoomToSelectedFeatures() # 縮放至選中要素
el = arcpy.mapping.ListLayoutElements(mxd, "TEXT_ELEMENT")[-1]
el.text = title # 更新的是文本,不是教程上的元素名稱
arcpy.SelectLayerByAttribute_management(lyr, "CLEAR_SELECTION") # 清除所選要素
#
# arcpy.SelectLayerByAttribute_management(lyr1, "NEW_SELECTION", "FID=8")
# # 選擇是否高亮顯示
arcpy.mapping.MapDocument.save(mxd) # 重新保存mxd
arcpy.RefreshActiveView() #刷新視圖
arcpy.RefreshTOC()
del mxd
if __name__=='__main__':
L=['5002301002011', '5002301002001', '5002301002041', '5002301002042', '5002301002031', '5002301002032', '5002301002051', '5002301002052', '5002301002053']
for i in L:
resetmxd(i)
因爲還在測試階段,所以上述都是測試數據,比較亂,到時候拿到正式的小班數據後會對文檔進行整理。
這裏有個兩個選擇,第一高亮顯示行政區(不能高亮顯示分幅的行政區,看起來會很奇怪),第二不高亮顯示行政區,這個按照自己的需求決定,所以這裏有個坑:清除所選要素(不高亮顯示)的方法還是SelectLayerByAttribute_management()不過第二個參數值需要改爲“CLEAR_SELECTION”。
5 使用ARCPY出圖
# -*- coding: utf-8 -*-
import arcpy,os,sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
if __name__=='__main__':
L=['5002301002011', '5002301002001', '5002301002041', '5002301002042', '5002301002031', '5002301002032', '5002301002051', '5002301002052', '5002301002053']
for iid in L:
filename = "{0}.mxd".format(iid)
mxd = arcpy.mapping.MapDocument(filename)
new_path='{0}.jpg'.format(iid)
arcpy.mapping.ExportToJPEG(mxd,new_path,resolution=300)
ExportToJPEG方法參數參考文檔:http://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/arcpy-mapping/exporttojpeg.htm
先記錄大概的思路和過程,等項目完成再完善此文檔,歡迎友好討論!