[ARCGIS]使用ARCPY+PYTHON+FME批量出圖

應用場景:

最近在做某區退耕還林驗收項目,要求按每個村出比例尺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

先記錄大概的思路和過程,等項目完成再完善此文檔,歡迎友好討論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章