智慧城市可视化:基于osgPotree 的都柏林大规模点云高程着色实践

前言

本文将基于osgPotree实现都柏林地区大规模点云渲染,包含DublinCity数据集介绍与点云下载与基于osgPotree的点云展示两个部分,其中osgPotree的点云展示包含颜色、高程、高程均匀着色三种渲染模式。osgPotree参照osgPotree:基于OSG的插件,支持Potree点云读取-CSDN博客。 开源地址:osgPotree: 针对Potree 2.0转换的结果,在osg中直接显示,通过插件osgPotree实现。


目录

  • 1 DublinCity数据集介绍与点云下载
  • 2 基于osgPotree的点云展示

1 DublinCity数据集介绍与点云下载

DublinCity数据集于2019年发布(论文arxiv.org/pdf/1909.03613),其包含LiDAR点云、正射影像、倾斜影像、人工标注数据四种类型数据,可用于三维点云对象分类、基于图像的三维重建等任务。点云总点数超过15亿点,点云密度达250到348点/平米,其中大约2.6亿点云已分类标注。正射影像如下所示:

|----------------------------------------------------------------------------|
| |
| 点云概览图(其中红框范围为已分类标注点云区域)[1] |

完整数据集获取可访问DublinCity -- V-SENSE,原始点云数据可访问2015 Aerial Laser and Photogrammetry Survey of Dublin City Collection Record - NYU Spatial Data Repository

数据集批量下载可访问JSON。本文根据JSON提供的点云下载地址,采用编写python脚本的形式进行批量下载,脚本如下:

python 复制代码
import os
import requests
from concurrent.futures import ThreadPoolExecutor
from tqdm import tqdm

# 下载地址列表
urls = [
    "https://archive.nyu.edu/retrieve/79789/nyu_2451_38587_pc_T_314000_233500.zip",
    "https://archive.nyu.edu/retrieve/79793/nyu_2451_38588_pc_T_314000_234000.zip",
    "https://archive.nyu.edu/retrieve/79797/nyu_2451_38589_pc_T_314500_233000.zip",
    "https://archive.nyu.edu/retrieve/79801/nyu_2451_38590_pc_T_314500_233500.zip",
    "https://archive.nyu.edu/retrieve/79805/nyu_2451_38591_pc_T_314500_234000.zip",
    "https://archive.nyu.edu/retrieve/79962/nyu_2451_38592_pc_T_314500_234500.zip",
    "https://archive.nyu.edu/retrieve/79813/nyu_2451_38593_pc_T_315000_233000.zip",
    "https://archive.nyu.edu/retrieve/79817/nyu_2451_38594_pc_T_315000_233500.zip",
    "https://archive.nyu.edu/retrieve/79822/nyu_2451_38595_pc_T_315000_234000.zip",
    "https://archive.nyu.edu/retrieve/79827/nyu_2451_38596_pc_T_315000_234500.zip",
    "https://archive.nyu.edu/retrieve/79831/nyu_2451_38597_pc_T_315000_235000.zip",
    "https://archive.nyu.edu/retrieve/79835/nyu_2451_38598_pc_T_315500_232500.zip",
    "https://archive.nyu.edu/retrieve/79839/nyu_2451_38599_pc_T_315500_233000.zip",
    "https://archive.nyu.edu/retrieve/79843/nyu_2451_38600_pc_T_315500_233500.zip",
    "https://archive.nyu.edu/retrieve/79848/nyu_2451_38601_pc_T_315500_234000.zip",
    "https://archive.nyu.edu/retrieve/79771/nyu_2451_38586_pc_T_315500-234500.zip",
    "https://archive.nyu.edu/retrieve/79853/nyu_2451_38602_pc_T_315500_235000.zip",
    "https://archive.nyu.edu/retrieve/79858/nyu_2451_38603_pc_T_316000_232500.zip",
    "https://archive.nyu.edu/retrieve/79862/nyu_2451_38604_pc_T_316000_233000.zip",
    "https://archive.nyu.edu/retrieve/79887/nyu_2451_38605_pc_T_316000_233500.zip",
    "https://archive.nyu.edu/retrieve/79891/nyu_2451_38606_pc_T_316000_234000.zip",
    "https://archive.nyu.edu/retrieve/79895/nyu_2451_38607_pc_T_316000_234500.zip",
    "https://archive.nyu.edu/retrieve/79899/nyu_2451_38608_pc_T_316000_235000.zip",
    "https://archive.nyu.edu/retrieve/79902/nyu_2451_38609_pc_T_316000_235500.zip",
    "https://archive.nyu.edu/retrieve/79905/nyu_2451_38610_pc_T_316500_232500.zip",
    "https://archive.nyu.edu/retrieve/79908/nyu_2451_38611_pc_T_316500_233000.zip",
    "https://archive.nyu.edu/retrieve/79911/nyu_2451_38612_pc_T_316500_233500.zip",
    "https://archive.nyu.edu/retrieve/79915/nyu_2451_38613_pc_T_316500_234000.zip",
    "https://archive.nyu.edu/retrieve/79919/nyu_2451_38614_pc_T_316500_234500.zip",
    "https://archive.nyu.edu/retrieve/79923/nyu_2451_38615_pc_T_316500_235000.zip",
    "https://archive.nyu.edu/retrieve/79927/nyu_2451_38617_pc_T_317000_232500.zip",
    "https://archive.nyu.edu/retrieve/79929/nyu_2451_38618_pc_T_317000_233000.zip",
    "https://archive.nyu.edu/retrieve/79932/nyu_2451_38619_pc_T_317000_233500.zip",
    "https://archive.nyu.edu/retrieve/79935/nyu_2451_38620_pc_T_317000_234000.zip",
    "https://archive.nyu.edu/retrieve/79938/nyu_2451_38621_pc_T_317000_234500.zip",
    "https://archive.nyu.edu/retrieve/79993/nyu_2451_38625_pc_F_150326_115601.zip",
    "https://archive.nyu.edu/retrieve/79998/nyu_2451_38644_pc_F_150326_120025.zip",
    "https://archive.nyu.edu/retrieve/80003/nyu_2451_38645_pc_F_150326_120403.zip",
    "https://archive.nyu.edu/retrieve/80008/nyu_2451_38646_pc_F_150326_120854.zip",
    "https://archive.nyu.edu/retrieve/80013/nyu_2451_38647_pc_F_150326_121253.zip",
    "https://archive.nyu.edu/retrieve/80018/nyu_2451_38648_pc_F_150326_121724.zip",
    "https://archive.nyu.edu/retrieve/80023/nyu_2451_38649_pc_F_150326_122222.zip",
    "https://archive.nyu.edu/retrieve/80028/nyu_2451_38650_pc_F_150326_122941.zip",
    "https://archive.nyu.edu/retrieve/80033/nyu_2451_38651_pc_F_150326_123430.zip",
    "https://archive.nyu.edu/retrieve/80038/nyu_2451_38652_pc_F_150326_123922.zip",
    "https://archive.nyu.edu/retrieve/80043/nyu_2451_38653_pc_F_150326_124415.zip",
    "https://archive.nyu.edu/retrieve/80048/nyu_2451_38654_pc_F_150326_124922.zip",
    "https://archive.nyu.edu/retrieve/80053/nyu_2451_38655_pc_F_150326_125429.zip",
    "https://archive.nyu.edu/retrieve/80058/nyu_2451_38656_pc_F_150326_125917.zip",
    "https://archive.nyu.edu/retrieve/80063/nyu_2451_38657_pc_F_150326_130401.zip",
    "https://archive.nyu.edu/retrieve/80068/nyu_2451_38658_pc_F_150326_130840.zip",
    "https://archive.nyu.edu/retrieve/80073/nyu_2451_38659_pc_F_150326_131220.zip",
    "https://archive.nyu.edu/retrieve/80078/nyu_2451_38660_pc_F_150326_131440.zip",
    "https://archive.nyu.edu/retrieve/80083/nyu_2451_38661_pc_F_150326_131905.zip",
    "https://archive.nyu.edu/retrieve/80088/nyu_2451_38662_pc_F_150326_132400.zip",
    "https://archive.nyu.edu/retrieve/80093/nyu_2451_38663_pc_F_150326_132905.zip",
    "https://archive.nyu.edu/retrieve/80098/nyu_2451_38664_pc_F_150326_133445.zip",
    "https://archive.nyu.edu/retrieve/80103/nyu_2451_38665_pc_F_150326_133955.zip",
    "https://archive.nyu.edu/retrieve/80108/nyu_2451_38666_pc_F_150326_134430.zip",
    "https://archive.nyu.edu/retrieve/80113/nyu_2451_38667_pc_F_150326_145143.zip",
    "https://archive.nyu.edu/retrieve/80118/nyu_2451_38668_pc_F_150326_145523.zip",
    "https://archive.nyu.edu/retrieve/80123/nyu_2451_38669_pc_F_150326_145809.zip",
    "https://archive.nyu.edu/retrieve/80128/nyu_2451_38670_pc_F_150326_150215.zip",
    "https://archive.nyu.edu/retrieve/80133/nyu_2451_38671_pc_F_150326_150519.zip",
    "https://archive.nyu.edu/retrieve/80138/nyu_2451_38672_pc_F_150326_150906.zip",
    "https://archive.nyu.edu/retrieve/80143/nyu_2451_38673_pc_F_150326_151147.zip",
    "https://archive.nyu.edu/retrieve/80190/nyu_2451_38674_pc_F_150326_151542.zip",
    "https://archive.nyu.edu/retrieve/80195/nyu_2451_38675_pc_F_150326_154909.zip",
    "https://archive.nyu.edu/retrieve/80200/nyu_2451_38676_pc_F_150326_155238.zip",
    "https://archive.nyu.edu/retrieve/80205/nyu_2451_38677_pc_F_150326_155529.zip",
    "https://archive.nyu.edu/retrieve/80210/nyu_2451_38678_pc_F_150326_155833.zip",
    "https://archive.nyu.edu/retrieve/80215/nyu_2451_38679_pc_F_150326_160149.zip",
    "https://archive.nyu.edu/retrieve/80220/nyu_2451_38680_pc_F_150326_160443.zip",
    "https://archive.nyu.edu/retrieve/80225/nyu_2451_38681_pc_F_150326_160709.zip",
    "https://archive.nyu.edu/retrieve/80230/nyu_2451_38682_pc_F_150326_161001.zip",
    "https://archive.nyu.edu/retrieve/80235/nyu_2451_38683_pc_F_150326_161223.zip"
]

# 保存目录
SAVE_DIR = "dublin_pc_data"

def download_file(url):
    """单文件下载函数"""
    try:
        # 从URL中提取文件名
        file_name = url.split('/')[-1]
        file_path = os.path.join(SAVE_DIR, file_name)

        # 检查文件是否已存在(断点续传简单版:跳过已下载文件)
        if os.path.exists(file_path):
            return f"Skipped: {file_name}"

        # 发起流式请求
        response = requests.get(url, stream=True, timeout=30)
        response.raise_for_status() # 检查请求是否成功

        # 写入文件
        with open(file_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                if chunk:
                    f.write(chunk)
        return f"Success: {file_name}"
    except Exception as e:
        return f"Error downloading {url}: {str(e)}"

def main():
    # 创建保存目录
    if not os.path.exists(SAVE_DIR):
        os.makedirs(SAVE_DIR)
        print(f"创建目录: {SAVE_DIR}")

    print(f"准备开始下载 {len(urls)} 个文件...")
    for i, url in enumerate(urls):
        print(f"\n正在处理第 {i+1}/{len(urls)} 个文件:")
        download_file(url)
    print("\n所有任务已完成。")

if __name__ == "__main__":
    main()

下载好的点云文件共13.38GB,可从如下网盘地址中获取:++++DublinCity_laz_免费高速下载|百度网盘-分享无限制++++

2 基于osgPotree的点云展示

2.1 格式转换

参照之前博客中详述的步骤,将下载的 LAZ 数据转换为 Potree 点云格式(osgPotree:基于OSG的插件,支持Potree点云读取-CSDN博客,),具体执行命令如下。转换后的点云数据总体积为76.8GB。Potree 点云可通过以下百度网盘链接获取:DublinCity_potree_免费高速下载|百度网盘-分享无限制

bash 复制代码
PotreeConverter.exe -i pointcloud.las -o D:\out

2.2 结果展示

接着用osgPotree中的可视化工具osgPotreeViewer展示转换后的potree点云,结果如下:

|----------------------------------------------------------------------------|
| |
| 普通显示(osgPotreeViewer DublinCity.potree) |
| |
| 高程着色(osgPotreeViewer DublinCity.potree -h) |
| |
| 高程均匀着色(osgPotreeViewer DublinCity.potree -he) |

详细代码参见osgPotreeViewer的实现。

引用:

1\] Zolanvari S M I , Ruano S , Rana A ,et al.DublinCity: Annotated LiDAR Point Cloud and its Applications\[J\]. 2019.DOI:10.48550/arXiv.1909.03613.

相关推荐
JoyCong19981 小时前
ToDesk企业版助力伯锐锶:远程连接打破时空壁垒,国产高端电镜跑出“加速度”
大数据·人工智能·经验分享·物联网
Zldaisy3d1 小时前
联泰科技全链路鞋业智造解决方案出海印尼
大数据·人工智能
QianCenRealSim1 小时前
Agent时代下的自动驾驶研发工具链的演进
人工智能·机器学习·自动驾驶·agent时代
EasyGBS1 小时前
国标GB28181视频分析平台EasyGBS视频质量诊断为平安社区视频监控筑牢安全防线
人工智能·安全·音视频
xiaoyaohou112 小时前
035、特定场景优化(二):密集场景与遮挡目标的处理
人工智能
53AI2 小时前
数字政务新基建:政务服务智能审批全流程升级
人工智能·知识库·政务·智能审批
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【15】工具执行拦截器(ToolInterceptor)
java·人工智能·spring
一只废狗狗狗狗狗狗狗狗狗2 小时前
机器学习与深度学习理论入门概述
人工智能·深度学习·机器学习
算力百科小智2 小时前
NVIDIA A100 GPU:基于 Ampere 架构的选型方法论
人工智能·架构·智星云·gpu算力租用·a100显卡