OSGB简介:
OSGB全称为Open Scene Gragh Binary,是开源三维渲染引擎OpenSceneGraph(OSG)数据文件格式的二进制版本,同时也是目前倾斜摄影模型(尤其是使用CC处理的模型)常用的存储格式。
OpenSceneGraph简介:
OpenSceneGraph是一个开源的,跨平台的高性能 3D 图形工具包,它完全用标准 C++ 和 OpenGL 编写,可以用来进行三维仿真,OSG包含的多线程技术,PagedLOD技术,可以方便的处理大数据的三维模型的可视化及其调度。OSGB格式数据是OpenSceneGraph框架的自有格式,是一种二进制数据。倾斜摄影数据是以OSGB格式来组织的树形结构的数据。
倾斜摄影数据组织结构
如图,数据的组织结构如下:Data目录为数据入口目录,目录下包含很多子目录,如下,每个子目录为一个根块,每个根块是一个树形结构,是一个LOD层级结构。
每个根块下面对应很多.osgb 文件,子目录下与目录名同名的osgb文件为根文件,如下:
背景说明:
在OSGB数据处理过程中 , 可能会遇到想要将特定层级或顶级OSGB瓦片文件夹提取出来进行单独处理的情况.写个pyt脚本就可以在ArcGIS Pro里面自动化处理了
01 工具界面
参数说明
-
输入目录(OSGB Tile文件夹的上级目录);
-
输出目录:提取后OSGB瓦片文件夹的输出位置;
-
提取级别:提取OSGB的指定级别,例如L15,这里填15就好,如果不填默认提取顶级;
-
保留顶级OSGB:如果要保留顶级的,勾选此项.
02 关键代码
'''提取指定级别OSGB文件'''
def extractTop1(path,in_datafile,messages):
messages.addMessage('Start')
if os.path.exists(in_datafile):
shutil.rmtree(in_datafile)
pass
else:
os.makedirs(in_datafile)
for dirpath, dirnames, filenames in os.walk(path):
for dirname in dirnames:
subfolder = os.path.join(dirpath, dirname) # input Tile folder
tilename = os.path.basename(subfolder)
newpath = in_datafile +"\\"+ tilename
os.makedirs(newpath)
for file in os.listdir(subfolder):
crtfilepath = subfolder + "\\" + file
basename = file.split('.')[0]
fileExtension = file.split('.')[1]
messages.addMessage(fileExtension)
if fileExtension == 'osgb':
if basename == dirname:
newfilepath = newpath + "\\" + file
messages.addMessage(newfilepath)
shutil.copyfile(crtfilepath,newfilepath)
# 提取其他层级OSGB
def extractSpecLev(path,output,extrLev,saveroot,messages):
#提取级别
sLev = 'L'+extrLev
messages.addMessage('开始提取级别为【%s】的OSGB文件'%sLev)
if os.path.exists(output):
shutil.rmtree(output)
else:
os.makedirs(output)
for dirpath, dirnames, filenames in os.walk(path):
for dirname in dirnames:
subfolder = os.path.join(dirpath, dirname)
tilename = os.path.basename(subfolder)
newpath = output +"\\"+ tilename
os.makedirs(newpath)
for file in os.listdir(subfolder):
crtfilepath = subfolder + "\\" + file
try:
fileExtension = file.split('.')[1]
except:
messages.addMessage('No Extention File :'+file)
fileExtension = 'osgb'
basename = file.split('.')[0]
if fileExtension == 'osgb':
newfilepath = newpath + "\\" + file
if saveroot == True:
if basename == dirname:
messages.addMessage(newfilepath)
shutil.copyfile(crtfilepath,newfilepath)
pass
if sLev in basename:
try:
shutil.copyfile(crtfilepath,newfilepath)
except:
messages.addMessage('找不到文件')
欢迎关注公众号!共同学习!懒GISer