运行环境:由于安装arcgis的时候自动配置的是python2.7,所以直接使用2.7运行环境,有些语法上和python3有些不一样。
使用情况:把镶嵌的数据放在A、B两个文件夹把,然后按照顺序对应进行镶嵌,即A中的第i个和B中的第i个进行镶嵌。
基本语法说明
语法说明:https://desktop.arcgis.com/zh-cn/arcmap/latest/tools/data-management-toolbox/mosaic.htm
这里采用镶嵌数据集工具
Mosaic(inputs, target, {mosaic_type}, {colormap}, {background_value}, {nodata_value}, {onebit_to_eightbit}, {mosaicking_tolerance}, {MatchingMethod})
参数 | 说明 | 数据类型 |
inputs [input,...] |
待合并的栅格数据集。 |
Mosaic Dataset ; Composite Layer ; Raster Dataset ; Raster Layer |
target |
待添加输入栅格的栅格。此栅格数据集必须已经存在。默认情况下,目标栅格被视为输入栅格数据集列表中的第一个栅格。使用创建栅格数据集工具可创建空栅格。 |
Raster Dataset |
mosaic_type (可选) |
用于镶嵌重叠的方法。
|
String |
colormap (可选) |
对输入栅格中应用于镶嵌输出的色彩映射表进行选择的方法。
|
String |
background_value (可选) |
使用此选项移除在栅格数据周围创建的不需要的值。指定的值与栅格数据集中的其他有用数据不同。例如,栅格边界上为零的值不同于栅格数据集内的零值。 指定的像素值在输出栅格数据集中将被设置为 NoData。 对于基于文件的栅格和地理数据库栅格,要忽略背景值,必须将其设置为与 NoData 相同的值。企业级地理数据库栅格无需经过此额外步骤即可忽略背景值。 |
Double |
nodata_value (可选) |
具有指定值的所有像素将在输出栅格数据集中被设置为 NoData。 |
Double |
onebit_to_eightbit (可选) |
选择是否将输入 1 位栅格数据集转换为 8 位栅格数据集。使用这种转换方法时,输入栅格数据集中的值 1 将在输出栅格数据集中更改为 255。这在将 1 位栅格数据集导入地理数据库时十分有用。1 位栅格数据集存储在文件系统中时包含 8 位金字塔图层,但在地理数据库中,1 位栅格数据集只能包含 1 位金字塔图层,这使得显示画面看起来没有吸引力。通过在地理数据库中将数据转换为 8 位,可将金字塔图层构建为 8 位而非 1 位,从而在显示画面中生成适合的栅格数据集。
|
Boolean |
mosaicking_tolerance (可选) |
发生镶嵌时,目标及源像素并不总是准确地排成直线。当存在像素偏差时,需要决定是否执行重采样,或是否应当平移数据。镶嵌容差可控制是否对像素执行重采样,或者是否应当平移像素。 如果(传入的数据集与目标数据集之间的)像素偏差大于该容差,则执行重采样。如果(传入的数据集与目标数据集之间的)像素偏差小于该容差,则不执行重采样(而是执行平移)。 容差的单位为像素,有效值范围为 0 到 0.5。容差为 0.5 会保证发生平移。存在像素偏差时,容差为零会保证执行重采样。 例如,源像素和目标像素的偏差值为 0.25。如果将镶嵌容差设置为 0.2,由于像素偏差大于该容差,因此将执行重采样。如果将镶嵌容差设置为 0.3,则会平移像素。 |
Double |
MatchingMethod (可选) |
选择应用于栅格的色彩匹配方法。
|
String |
名称 | 说明 | 数据类型 |
output | 已更新的栅格数据集。 |
栅格数据集 |
Mosaic 示例 1(Python 窗口)
这是 Mosaic 工具的 Python 示例。
import arcpy
from arcpy import env
env.workspace = "c:/data"
arcpy.Mosaic_management("land2.tif;land3.tif","land1.tif","LAST","FIRST",
"0", "9", "", "", "")
Mosaic 示例 2(独立脚本)
这是 Mosaic 工具的 Python 脚本示例。
##==================================
##Mosaic
##Usage: Mosaic_management inputs;inputs... target {LAST | FIRST | BLEND | MEAN | MINIMUM | MAXIMUM} {FIRST | REJECT | LAST | MATCH}
## {background_value} {nodata_value} {NONE | OneBitTo8Bit} {mosaicking_tolerance}
## {NONE | STATISTIC_MATCHING | HISTOGRAM_MATCHING
## | LINEARCORRELATION_MATCHING}
import arcpy
arcpy.env.workspace = r"\\workspace\PrjWorkspace\RasGP"
##Mosaic two TIFF images to a single TIFF image
##Background value: 0
##Nodata value: 9
arcpy.Mosaic_management("landsatb4a.tif;landsatb4b.tif","Mosaic\\landsat.tif","LAST","FIRST","0", "9", "", "", "")
##Mosaic several 3-band TIFF images to FGDB Raster Dataset with Color Correction
##Set Mosaic Tolerance to 0.3. Mismatch larget than 0.3 will be resampled
arcpy.Mosaic_management("rgb1.tif;rgb2.tif;rgb3.tif", "Mosaic.gdb\\rgb","LAST","FIRST","", "", "", "0.3", "HISTOGRAM_MATCHING")
# -*- coding: utf-8 -*-
import os,arcpy,datetime
#读取和存放文件夹的位置
inputPath1 = r'H:\input1'#镶嵌数据文件夹1
inputPath2 =r'H:\input2'#镶嵌数据文件夹2
path=r'H:\outputMocaic'#输出结果存放文件夹
# start calculate time
startTime = datetime.datetime.now()
print startTime
# set the intermediate data folder #这段根据需要使用
intermediateDataPath = path+"\\"+"IntermediateData" #如果有中间文件就存放在这里
# set result data folder
resultDataPath = path+"\\"+"Result"
# determine if the folder exists
if os.path.exists(intermediateDataPath):
print "IntermediateData floder exists"
else:
# create a intermediate data floder
arcpy.CreateFolder_management(path,"IntermediateData")
if os.path.exists(resultDataPath):
print("Result floder exists")
else:
# create a result floder
arcpy.CreateFolder_management(path, "Result")
print("-----------------------------------------------------------")
print("Under calculation......")
print("Please do not close the window.")
#这段为数据处理代码
# function:按顺序拼接字符串,作为波段组合函数的的参数
def getInputRasterParam(files):
ret = []
print "需要镶嵌的影像数据1系列:"
for file in files: # 拼接其他的
if file.endswith(".tif"):
print file
ret.append(file)
return ret
def getInputShapefileParam(files):
ret = []
print "需要镶嵌的影像数据2系列:"
for file in files: # 拼接其他的
if file.endswith(".shp"):
print file
ret.append(file)
return ret
arcpy.env.workspace = resultDataPath #被裁剪栅格影像所在文件夹
arcpy.env.overwriteOutput = True#允许覆盖已有数据
files1 = os.listdir(inputPath1)
files2 = os.listdir(inputPath2)
print "-----------------------------------------"
input_param1 = getInputRasterParam(files1)
input_param2 = getInputRasterParam(files2)
#或者采用下面这种表达
#input_param=arcpy.ListRasters("*","tif") #遍历文件夹下所有tif格式文件
print "-----------------------------------------"
i=0
for input1 in input_param1:
print "开始镶嵌运算………………"
print "-----------------------------------------"
input_tif1=inputPath1+"\\"+input1
result_tif=inputPath2+"\\"+input_param2[i]
#把栅格数据1镶嵌到栅格数据2上
arcpy.Mosaic_management(input_tif1,result_tif,"LAST","FIRST","-3000", "0", "", "", "")
print result_tif+"镶嵌完成!"
i+=1
print "Finish!"
endTime = datetime.datetime.now()
print "Time use: " + str((endTime - startTime).seconds)+ " (second)"
print "-----------------------------------------------------------"
这里结果有缝隙,背景值计算的时候没处理好,需要调整参数。