SuperMapPy 批量拼接 GeoTiff影像
影像拼接工具使用说明
一、影像像素位深检查

1.采用开源库GDAL的gdalinfo.exe读取GeoTiff文件的信息,如类型、投影,范围等。
2.采用DOS脚本遍历所有GeoTiff文件,输出各个GeoTiff文件的信息到日志。
3.统计GeoTiff文件个数,Type=Byte的文件的个数。数目一致表明全部GeoTiff像素类型一致。
运行示例:
for /f %i in ('dir /b /s
d:\tifdata\*.tif ') do @(
e:\gdal1.4.2\bin\gdalinfo.exe %i >> e:\tifstats.log
)
二、影像拼接处理
采用SuperMapPy脚本处理影像拼接。先安装Python2.7.3和Deskpro环境。脚本如下:
# coding: GB2312
#===================================================
#影像成批导入SuperMap UDB格式工具.
#基本流程:
#1、扫描目录,或者根据经纬度按照块的高宽生成文件列表。
#2、扫描存在的文件,获取最大的坐标范围。
#3、扫描存在的文件,获取像素格式。
#4、遍历文件列表,对于存在的文件追加到打开的数据库UDB中。
#5、创建金字塔索引,以加快显示速度。(可选的过程)
#===================================================
import sys
import string
import re
import os
import time
def getType(ext):
if ext.lower() == 'tif':
return 'fileTIF'
elif ext.lower() == 'img':
return 'fileIMG'
#匹配正则表达式,符合条件的append到datafiles,用于追加
def walkPath(type, path):
datafiles = []
reMatch = '[\d\D]*.tif$'
if type=='img':
reMath = '[\d\D]*.img$'
for root, dirs, files in os.walk(path):
for file in files:
if (re.match(reMatch,file)):
datafiles.append(os.path.join(root, file))
print len(datafiles)
return datafiles
def calcDatasetInfo(type, datafiles):
L=[]
left=[]
top=[]
right=[]
bottom=[]
ratiox=[]
ratioy=[]
#获取每个影像文件的左右地理范围,保存到数组
for file in datafiles:
L= smu.GetImageGeoRef(type,file)
print L
l=float(L[0][0])
t=float(L[0][1])
r=float(L[0][2])
b=float(L[0][3])
w=int(L[1][0])
h=int(L[1][1])
x=(r-l)/w
y=(t-b)/h
left.append(l)
right.append(r)
top.append(t)
bottom.append(b)
ratiox.append(x)
ratioy.append(y)
#获取左右上下边界
dLeft=min(left)
dRight=max(right)
dTop=max(top)
dBottom=min(bottom)
#获取分辨率,影像最小分辨率作为数据集分辨率
dRatioX = min(ratiox)
dRatioY = min(ratioy)
#计算影像数据集宽度和高度
nWidth = int((dRight-dLeft)/dRatioX)
nHeight = int((dTop-dBottom)/dRatioY)
#重新计算,保证分辨率正确
dRight=dLeft+dRatioX*nWidth
dBottom=dTop-dRatioY*nHeight
L = [nWidth, nHeight, dLeft, dTop, dRight, dBottom]
return L
def toDB(server, user, pwd, engType, fileType, path):
files=[]
files=walkPath(fileType, path)
print len(files)
if len(files)>0:
L=[]
L = calcDatasetInfo(fileType, files)
pixType = smu.GetImagePixelFormatName(fileType, files[0])
odsAlias='test'
if len(L)==6:
nWidth=L[0]
nHeight=L[1]
dLeft=L[2]
dTop=L[3]
dRight=L[4]
dBottom=L[5]
dtName='test'
isOpen=smu.OpenDataSource(server,user,pwd, engType, odsAlias)
smu.DeleteDataset(odsAlias, dtName)
bCreate = smu.CreateDatasetRaster(odsAlias,dtName,
'Image', 'encDCT', pixType,nWidth,nHeight,
dLeft, dTop,dRight,dBottom,256)
writeLog("log.log","calcDatasetInfo 成功")
for file in files:
writeLog("log.log",file+"开始处理")
smu.AppendRasterFile(odsAlias,dtName,fileType, file)
writeLog("log.log",file+"处理完毕\n\n")
bBuild=smu.BuildPyramid(odsAlias,dtName)#创建影像金字塔
if bBuild == 1:
print "创建金字塔成功"
else:
print "创建影像金字塔失败!"
smu.CloseDataSource(odsAlias)
#=====================================
def writeLog(logPath, tmpstr):
time_str = time.strftime("%Y-%m-%d %H:%M:%S ",time.localtime())
logstr = str(tmpstr) + time_str +'\n'
print(logstr)
f = open(logPath, "a")
f.write(logstr)
f.close()
help =u"----------------------------------------------------------\n\
说明:可导入udb或oracle引擎\n\
导入到UDB用法: AppendRasterFile.py ugoPath tif c:/data\n\
导入到Oracle用法: AppendRasterFile.py ugoPath server user pwd tif c:/data\n\
----------------------------------------------------------\n"
if __name__=='__main__':
if len(sys.argv)>2:
ugo=sys.argv[1]
if os.path.exists(ugo):
sys.path.append(ugo)
import smu
else:
print u'组件路径不存在.'
sys.exit()
else:
print help
sys.exit()
if len(sys.argv) == 4:
engType='sceUDB'
fileType=sys.argv[2]
fileType=getType(fileType)
path=sys.argv[3]
udb = path+'/test.udb'
udd = path+'/test.udd'
if os.path.exists(udb):
os.remove(udb)
if os.path.exists(udd):
os.remove(udd)
print 'toDB
ing'
toDB(udb, '', '', engType, fileType, path)
smu.Exit()#清空环境,释放内存
elif len(sys.argv) == 7:
engType='sceOraclePlus'
server=sys.argv[2]
user=sys.argv[3]
pwd=sys.argv[4]
fileType=sys.argv[5]
fileType=getType(fileType)
path=sys.argv[6]
toDB(server, user, pwd, engType, fileType, path)
smu.Exit()#清空环境,释放内存

运行脚本示例:
c:\python27\python.exe d:\p.py "E:\Develop\deskpro6R\Bin" tif d:\tifdata
Øc:\python27\python.exe版本一定是2.7.3
Ød:\d.py就是拼接GeoTiff或Img格式的SuperMapPy脚本;
Ø"E:\Develop\deskpro6R\Bin"是deskpro安装目录bin,注意确保目录下存在smu.pyd文件;
Øtif指,读取所有GeoTiff;
Ød:\tiffdata是GeoTiff的目录。注意tif文件的后缀名要是小写, 例如d:\tiffdata\1.tif。
参考:
参考Python for SuperMap 1.0帮助。
附件列表
SuperMapPy 批量拼接 GeoTiff影像的更多相关文章
- ArcGis Python脚本——根据接图表批量裁切分幅影像
年前写了一个用渔网工具制作图幅接图表的文章,链接在这里: 使用ArcMap做一个1:5000标准分幅图并编号 本文提供一个使用ArcMap利用接图表图斑裁切一幅影像为多幅的方法. 第一步,将接图表拆分 ...
- 大数据批量插入数据库使用(SqlBulkCopy )效率更高
SqlBulkCopy类是System.Data.SqlClient下的类,我们开发中不常用,甚至不知道有这么一个类的存在,但确实比sql插入,事务批量插入,sql批量拼接插入快很多,比调用存储过程插 ...
- 用Python批量下载DACC的MODIS数据
本人初次尝试用Python批量下载DACC的MODIS数据,记下步骤,提醒自己,数据还在下载,成功是否未知,等待结果中...... 若有大佬发现步骤有不对之处,望指出,不胜感激. 1.下载Python ...
- arcgis对谷歌遥感影像拼接
对于遥感影像的研究多种多样,有小尺度的也有大尺度的还有多尺度的.可以研究一个城市里的一个区,也可以研究一个省甚至全国范围.当研究的区域比较大的时候,在一幅影像上无法包括研究区的所有范围,那么就需要下载 ...
- geoserver 通过代码实现发布地图服务
GeoServer:代码实现批量发布地图服务 利用GeoServer发布WCS服务,那么如果我有很多数据需要进行发布,这样利用GeoServer提供的UI界面进行操作显然很不显示.那能不能利用GeoS ...
- GeoServer自动发布地图服务
1 NetCDF气象文件自动发布案例 GeoServer是一个地理服务器,提供了管理页面进行服务发布,样式,切片,图层预览等一系列操作,但是手动进行页面配置有时并不满足业务需求,所以GeoServer ...
- 使用ArcMap做一个1:5000标准分幅图并编号
实现这个project,十进制度.渔网工具.Excel if/Text函数.挂接Excel表.空间连接.投影这些知识是必须的.看懂本篇博文也就意味着大概掌握了以上知识. 坐标数据设置与编号标准依据&l ...
- MyBatis+Spring SQL效率测试报告
1. 数据库结构 2. insert 测试 insert 的测试包括 1) 批量拼接values()插入 2) 有事务for循环插入 3) 无事务for循环插入 测试 SQL: <!-- 普通 ...
- ArcMap中提取影像数据边界
1.前言 客户手里有一些经过裁剪的不规则多边形影像数据(如图例所示),希望能批量获取该类影像的边界信息,即影像对应的面信息,边界线信息.这里我们提供一种利用镶嵌数据集Footprint图层的方法来获取 ...
随机推荐
- Docker 总结
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Docker总结 简单介绍 1 Docker 架构 安装和环境配置 1 mac 11 brew安装 11 dmg文件安装 1 ...
- Java获取IP
public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader(&q ...
- edgerouter bonding
configure set interfaces bonding bond0 mode 802.3ad set interfaces ethernet eth1 bond-group bond0 se ...
- webpack+React.js
Webpack是目前基于React和Redux开发的应用的主要打包工具.我想使用Angular 2或其他框架开发的应用也有很多在使用Webpack. 当我第一次看到Webpack的配置文件时,它看起来 ...
- C#打包时设置图标ico错误
1:无法生成"[DesktopFolder]"中名为"用户桌面 的快捷方式"的快捷方式在生成安装项目时报错 2:在进行安装项目时候,创建快捷方式并且设置了 ic ...
- Java中新建子文件夹和新建文件
File file = new File("地址"); file.mkdirs(); //新建文件夹,当没有父文件夹时,但是不会自动创建父文件夹 file.mkdirs(); // ...
- 【第五篇】Volley代码修改之图片二级缓存以及相关源码阅读(重写ImageLoader.ImageCache)
前面http://www.cnblogs.com/androidsuperman/p/8a157b18ede85caa61ca5bc04bba43d0.html 有讲到使用LRU来处理缓存的,但是只是 ...
- SSM
今天内容安排 1:复习mybatis 2:复习springMVC 3:springMVC+spring+mybatis组合起来,搭建一个web应用开发的框架 4:用户管理系统,针对用户的CRUD操作, ...
- python3.4项目打包
1.首先下载pyinstaller并且解压(就直接解压再桌面就可以,这样子比较方便) 2.然后就去下载pywin32(按照电脑和python的版本去下载) 我电脑是64位的,python是3.4版本的 ...
- 第六十七节,html表单元素
html表单元素 学习要点: 1.表单元素总汇 2.表单元素解析 本章主要探讨HTML5中表单元素,表单元素用于获取用户的输入数据. 一.表单元素总汇 HTML5的表单中,提供了各种可供用户输入的 ...