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

本文介绍了OSGB格式在三维渲染中的应用,特别是倾斜摄影模型的存储方式。提供了一个Python脚本,用于在ArcGISPro中自动按级别提取OSGB数据,支持指定层级和保留顶级文件的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

<think>好的,用户想要用Python读取OSGB文件,我需要先弄清楚OSGB是什么格式。OSGB通常与OpenSceneGraph相关,是3D模型文件的一种二进制格式,常用于地理信息系统和三维可视化。用户可能需要处理这类文件进行数据解析或可视化。 首先,我得考虑Python中有哪些库可以处理OSGB文件。常见的3D处理库比如PyOpenGL可能不够,因为它们更侧重渲染而非文件解析。可能需要查找专门的库或工具。 然后想到GDAL(Geospatial Data Abstraction Library),它支持多种地理空间数据格式。虽然GDAL主要用于栅格和矢量数据,但OSGB是否在支持列表中呢?需要查阅GDAL文档,但用户提到OSGB可能不在GDAL默认支持的格式里,可能需要插件或者转换工具。 接下来,是否有其他Python库?比如osgpy或者PyOSG,这些可能是OpenSceneGraph的Python绑定。不过这些库的维护情况如何?用户安装起来是否方便?可能需要编译或依赖特定环境,这对普通用户可能有难度。 另外,用户可能需要将OSGB转换为其他格式,如OBJ或glTF,再用Python处理。转换工具如OSG的osgconv命令行工具,用户可以在Python中调用子进程执行转换,然后用现有库处理转换后的文件。这可能是一个可行方案,但需要用户先安装OpenSceneGraph工具链。 然后考虑是否有现成的Python示例代码。例如,使用subprocess调用osgconv转换文件,再用trimesh或pyassimp加载转换后的模型。需要确保示例代码的准确性和步骤清晰,比如安装依赖、转换命令、读取文件等步骤。 还需要注意潜在问题,比如环境变量设置,工具路径是否正确,以及转换过程中可能出现的错误处理。用户可能需要根据系统调整路径,比如在Windows下osgconv的位置可能不同。 最后,总结几种方法:直接使用特定库(如果有)、转换格式后处理、或者使用第三方工具导出数据。根据用户的技术背景,推荐最简便的方法,比如转换格式可能更可行,因为直接处理OSGB的Python库有限。</think>要使用Python读取OSGB(OpenSceneGraph Binary)文件,可以通过以下三种方法实现: ### 方法一:使用osgconv工具转换格式(推荐) 1. **安装OpenSceneGraph工具链** ```bash # Ubuntu sudo apt-get install openscenegraph # Windows # 从官网下载安装包:https://www.openscenegraph.com/ ``` 2. **使用Python调用格式转换** ```python import subprocess input_osgb = "model.osgb" output_obj = "converted_model.obj" # 调用osgconv进行格式转换 subprocess.run(["osgconv", input_osgb, output_obj]) # 使用trimesh读取转换后的文件 import trimesh mesh = trimesh.load(output_obj) print(f"顶点数:{len(mesh.vertices)}") ``` ### 方法二:使用PyAssimp库 ```python # 先安装依赖库 # pip install pyassimp from pyassimp import load # 注意:需要先将OSGB转换为支持的格式(如OBJ/FBX) scene = load("converted_model.obj") print(f"场景包含 {len(scene.meshes)} 个网格") ``` ### 方法三:解析二进制文件(高级) ```python import struct def parse_osgb_header(filepath): with open(filepath, 'rb') as f: # 读取文件头标识(前4字节应为"OSGB") header = f.read(4).decode('ascii') # 读取版本号(4字节小端整数) version = struct.unpack('<I', f.read(4))[0] return header, version header, ver = parse_osgb_header("model.osgb") print(f"文件类型:{header},版本:{ver}") ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值