??本文介紹基于Python語(yǔ)言中ArcPy模塊,實(shí)現(xiàn)ArcMap自動(dòng)批量出圖,并對(duì)地圖要素進(jìn)行自定義批量設(shè)置的方法。
1 任務(wù)需求
??首先,我們來(lái)明確一下本文所需實(shí)現(xiàn)的需求。
??現(xiàn)有通過(guò)Python基于Excel數(shù)據(jù)加以反距離加權(quán)空間插值并掩膜圖層所繪制的北京市在2019年05月18日00時(shí)至23時(shí)(其中不含19時(shí))等23個(gè)逐小時(shí)PM2.5濃度插值數(shù)據(jù)柵格圖層,每小時(shí)一個(gè)圖層,因此共23個(gè)圖層;以當(dāng)日10時(shí)為例,該時(shí)刻的柵格圖層如下所示。
??我們希望做到的有兩點(diǎn)。首先,我們可以看到前述23個(gè)柵格圖層的符號(hào)系統(tǒng)都為灰度拉伸的狀態(tài),因此希望按照一個(gè)給定的模板圖層文件m.lyr
,調(diào)整這23個(gè)柵格圖層的樣式(即拉伸的顏色),并分別以.lyr
格式導(dǎo)出這23個(gè)柵格圖層文件;且希望導(dǎo)出圖層文件的文件名包含具體的時(shí)刻。如下圖所示。
??第二點(diǎn)希望做到的是,將每一個(gè)柵格圖層都設(shè)置為彩色后,添加圖名、指北針、比例尺等地圖要素,并導(dǎo)出為圖片格式。以當(dāng)日10時(shí)、20時(shí)為例,我們所希望導(dǎo)出的圖片如下所示。
??且希望導(dǎo)出圖片的文件名同樣包含具體的時(shí)刻。
2 代碼實(shí)現(xiàn)
??了解了需求后,我們就基于Python中的ArcPy
模塊,進(jìn)行詳細(xì)代碼的撰寫與介紹。
??這里需要說(shuō)明的是:在編寫代碼的時(shí)候,為了方便執(zhí)行,所以希望代碼后期可以在ArcMap中直接通過(guò)工具箱運(yùn)行,即用到Python程序腳本新建工具箱與自定義工具的方法;因此,代碼中對(duì)于一些需要初始定義的變量,都用到了arcpy.GetParameterAsText()
函數(shù)。大家如果只是希望在IDLE中運(yùn)行代碼,那么直接對(duì)這些變量進(jìn)行具體賦值即可。關(guān)于Python程序腳本新建工具箱與自定義工具,大家可以查看ArcMap將Python寫的代碼轉(zhuǎn)為工具箱與自定義工具詳細(xì)了解。
??上面提到需要初始定義的變量一共有七個(gè),其中arcpy.env.workspace
參數(shù)表示當(dāng)前工作空間;mxd_file
參數(shù)表示后期批量出圖時(shí),提供地圖要素參考信息的地圖文檔.mxd
文件;lyr_file
參數(shù)表示后期批量出圖時(shí),提供地圖著色參考信息的模板圖層.lyr
文件;mask_path
參數(shù)表示前述插值柵格圖層所保存的路徑;new_lyr_path
參數(shù)表示插值柵格圖層經(jīng)過(guò)樣式修改,并轉(zhuǎn)為圖層文件后的保存路徑;png_path
參數(shù)表示最終出圖結(jié)果的保存路徑;dpi
參數(shù)表示最終出圖結(jié)果的圖像分辨率,單位為DPI(Dots per Inch)。
??其中,上述第二個(gè)參數(shù),即提供地圖要素參考信息的地圖文檔.mxd
文件需要由用戶自行創(chuàng)建,并在其中配置好圖名、圖例、指北針、比例尺等地圖要素的名稱、文本、位置、樣式等信息?;蛟S這么說(shuō)有點(diǎn)不清楚,大家看下面這幅圖就能比較容易明白了。
??沒(méi)錯(cuò),這個(gè)提供地圖要素參考信息的地圖文檔.mxd
文件其實(shí)就是一個(gè)在Layout View中設(shè)置好各種地圖要素位置、大小、字體、顏色等的地圖文檔文件;它就相當(dāng)于是一個(gè)模板,這個(gè)模板里各種地圖要素長(zhǎng)什么樣子,后期我們批量出圖結(jié)果圖的地圖要素就長(zhǎng)什么樣子。
??此外,不知道為什么,在我的ArcMap中似乎偶爾會(huì)出現(xiàn)無(wú)法有效執(zhí)行lyr.visible=False
或arcpy.mapping.RemoveLayer(data_frame,new_lyr[0])
等代碼情況;因此若直接在上述地圖文檔文件中配置圖例,最終出圖結(jié)果有時(shí)會(huì)出現(xiàn)多個(gè)圖例堆疊,不能保證出圖結(jié)果百分之百完美?;诖?,選擇將圖例格式元素(elm.name==”title”
)轉(zhuǎn)換為由一個(gè)圖片格式元素(elm.name==”pic”
)與兩個(gè)文本格式元素(elm.name==”text”
)組成的新元素,從而實(shí)現(xiàn)最終結(jié)果圖中圖例的繪制。
??如果大家還是不明白,可以直接下載我的這一.mxd
文件;下載鏈接:https://pan.baidu.com/s/18l0l-kjPfdjV1UYcpkKg-w?pwd=fkxx 。
??具體代碼如下。
# -*- coding: utf-8 -*-
# @author: ChuTianjia
import arcpy
arcpy.env.workspace=arcpy.GetParameterAsText(0)
mxd_file=arcpy.GetParameterAsText(1)
lyr_file=arcpy.GetParameterAsText(2)
mask_path=arcpy.GetParameterAsText(3)
new_lyr_path=arcpy.GetParameterAsText(4)
png_path=arcpy.GetParameterAsText(5)
dpi=arcpy.GetParameterAsText(6)
my_mxd=arcpy.mapping.MapDocument(mxd_file)
data_frame=arcpy.mapping.ListDataFrames(my_mxd)[0]
my_lyr=arcpy.mapping.Layer(lyr_file)
layer_list=arcpy.mapping.ListLayers(my_mxd)
my_mxd.activeView="PAGE_LAYOUT"
tif_file_list=arcpy.ListRasters("BJ_hour_*","TIF")
for raster in tif_file_list:
# Import the mask layer into ArcMap
raster_file=mask_path+"\\"+raster
arcpy.MakeRasterLayer_management(raster_file,raster.strip(".tif"))
# Modify the style of the mask layer according to the reference layer
arcpy.ApplySymbologyFromLayer_management(raster.strip(".tif"),lyr_file)
new_lyr_file=new_lyr_path+"\\"+raster.strip(".tif")+".lyr"
# Save and import the mask layer after modifying the style
arcpy.SaveToLayerFile_management(raster.strip(".tif"),new_lyr_file)
arcpy.AddMessage("{0} has been saved.".format(raster.strip(".tif")+".lyr"))
new_lyr=arcpy.mapping.Layer(new_lyr_file)
arcpy.mapping.AddLayer(data_frame,new_lyr,"TOP")
# Modify the image name
for element in arcpy.mapping.ListLayoutElements(my_mxd,"TEXT_ELEMENT"):
if element.name=="title":
element.text="Interpolation Map of PM2.5 Concentration\n at {0}:00 on May 18, 2019, Beijing".format(raster[8:10])
new_lyr.visible=True
# Modify the legend (see the program usage document for details)
max_pixel=arcpy.GetRasterProperties_management(new_lyr,"MAXIMUM").getOutput(0)[0:5]
min_pixel=arcpy.GetRasterProperties_management(new_lyr,"MINIMUM").getOutput(0)[0:5]
for element in arcpy.mapping.ListLayoutElements(my_mxd,"TEXT_ELEMENT"):
if element.name=="MAX":
element.text="{:0>5.2f}".format(float(max_pixel))
if element.name=="MIN":
element.text="{:0>5.2f}".format(float(min_pixel))
# Export to picture format
png_file=png_path+"\\"+raster.strip(".tif")+".png"
arcpy.mapping.ExportToPNG(my_mxd,png_file,resolution=dpi)
arcpy.AddMessage("{0} has been saved.".format(raster.strip(".tif")+".png"))
new_lyr.visible=False
arcpy.mapping.RemoveLayer(data_frame,new_lyr[0])
3 運(yùn)行結(jié)果
??執(zhí)行上述代碼,具體得到的結(jié)果其實(shí)在本文開(kāi)頭也就和大家講了,這里就不再贅述。
??不過(guò)還有一點(diǎn),就是如果大家是在ArcMap中直接通過(guò)工具箱運(yùn)行上述代碼,則可以看到代碼運(yùn)行過(guò)程中出現(xiàn)的提示——程序運(yùn)行過(guò)程中,對(duì)每一個(gè)時(shí)刻的PM2.5濃度數(shù)據(jù)分別完成圖層格式保存與圖片格式保存等2個(gè)操作后,均會(huì)輸出執(zhí)行結(jié)果,方便用戶獲知程序的執(zhí)行情況。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-855348.html
??至此,大功告成。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-855348.html
到了這里,關(guān)于ArcPy自動(dòng)繪制大量地圖并設(shè)置地圖要素:Python的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!