OSGB简介及如何利用ArcGIS提取指定层级中的OSGB文件

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

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值