起因是這樣一段對話,領導:你會用腳本生成熱力圖圖片嗎?我:可以研究下。領導:那這個需求就給你了。我:……<br>
經過一番研究,研究出大概的思路,先將有經緯度的表中的數據篩選出表並生成xy事件,接著利用核密度工具生成柵格,最後呢裁剪柵格通過mapping包出圖。<br>
出圖過程比較慢,所以考慮使用多線程(一張圖五分鍾,十九張圖多線程九分鍾你說吼不吼)。多線程第一次用,一開始打算用數據庫存放數據表和柵格,不過鎖表比較難解決,于是選擇了簡單粗暴地在文件地理數據庫(gdb)裏處理,每個文件使用一個gdb,這樣速度快也不用考慮會被鎖表,處理完以後就直接刪庫(跑路)。多線程中盡量不要有刪除操作,容易沖突,把刪除都放在單線程中這樣不容易出錯。
“`
MyGPpool = multiprocessing.Pool(19)
results = MyGPpool.map(batch, parameters)
MyGPpool.close()
MyGPpool.join()
“`
arcpy.mapping導出格式推薦使用png格式,可以設置透明背景,最重要一點就是可以在浏覽器中查看(這個是tif格式難達到的,也可能是我沒找到好的方法)。replaceDataSource替換數據源的時候要設置好路徑(不是完整路徑不是完整路徑不是完整路徑),數據源類型,數據名稱。
“`
mxd = arcpy.mapping.MapDocument(mxd_file)
df = arcpy.mapping.ListDataFrames(mxd, '圖層')[0]
lyr = arcpy.mapping.ListLayers(mxd)[0]
datasetName = os.path.basename(data_raster)
dataRasterWorkspace = os.path.dirname(data_raster)
if lyr.supports("DATASOURCE"):
lyr.replaceDataSource(dataRasterWorkspace,"FILEGDB_WORKSPACE", datasetName)
df.extent = extent
df.panToExtent(extent)
arcpy.mapping.ExportToPNG(mxd, out_file, df, color_mode='24-BIT_TRUE_COLOR', world_file=True,background_color="No Color", transparent_color="No Color")
else:
arcpy.AddMessage("error")
arcpy.RefreshActiveView()
del mxd, df, lyr
“`