任务需求
实际作业中,往往需要导出一些经典的案例图斑用作参考。而能称之为经典的图斑大部分都会来源于多个不同的数据源中。接下来就实现跨数据源根据指定BSM导出指定图斑图片:
环境与数据准备
1、arcgis10.2.2 2、准备一份数据源,此处使用GDB作为数据源。 3、准备提供地图要素参考信息的地图文档.mxd文件,可以在里面设置图斑信息。
代码实现
import os.path
import arcpy
import sys
import time
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
def u(s):
if isinstance(s, unicode):
return s
elif isinstance(s, str):
try:
return s.decode('utf-8')
except Exception as e:
pass
try:
return s.decode('cp936')
except Exception:
print 'Unknow coding of {0}'.format(s)
else:
return u(str(s))
if __name__ == '__main__':
try:
output_path = r'D:\批量照片导出测试'
source_path = r'D:\批量照片导出测试\数据源.gdb'
mxd_file = u(r'D:\批量照片导出测试\模板.mxd')
tbbsms = ['A1', 'A2', 'B1', 'B2']
arcpy.env.overwriteOutput = True
start_time = time.time()
my_mxd = arcpy.mapping.MapDocument(mxd_file)
data_frame = arcpy.mapping.ListDataFrames(my_mxd)[0]
tar_lyr = None
for lyr in arcpy.mapping.ListLayers(my_mxd, "", data_frame):
print lyr.name
if lyr.name == 'DL':
tar_lyr = lyr
last_dataSource = tar_lyr.dataSource
for bsm in tbbsms:
tar_ly = bsm[0:1]
next_dataSource = tar_ly
if next_dataSource != last_dataSource:
tar_lyr.replaceDataSource(source_path, 'FILEGDB_WORKSPACE', next_dataSource)
last_dataSource = next_dataSource
arcpy.SelectLayerByAttribute_management(tar_lyr, "NEW_SELECTION", "BSM='{0}'".format(bsm))
data_frame.zoomToSelectedFeatures()
arcpy.RefreshActiveView()
png_file = os.path.join(output_path, '{0}.png'.format(bsm))
arcpy.mapping.ExportToPNG(my_mxd, png_file, data_frame, df_export_width=500, df_export_height=300,
resolution=96)
arcpy.AddMessage("{0} has been saved,Time {1}s".format("{0}.png".format(bsm), time.time() - start_time))
del my_mxd
except arcpy.ExecuteError:
print arcpy.GetMessages()
except Exception as e:
print e.message
其中方法解释: replaceDataSource :方法用于更改图层的工作空间或源数据集。 ExportToPNG :以PNG形式要导出数据框。
运行结果
执行上述代码后,在指定输出位置生成图片:
其中思路有来自于参考文档: 1、Python中ArcPy实现ArcGIS自动批量制图与地图要素批量设置 2、ArcGIS批量导出图片 3、Arcpy操作
沾衣欲湿杏花雨,吹面不寒杨柳风。 --释志南《绝句》
|