智慧城市可视化:基于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 ApplicationsJ. 2019.DOI:10.48550/arXiv.1909.03613.

相关推荐
清酒难寻10 小时前
深度学习进阶(二十四)Swin 的二维 RPE
人工智能·深度学习
步步为营DotNet10 小时前
借助 Microsoft.Extensions.AI 与 ASP.NET Core 10 实现智能 Web 应用故障预测
人工智能·microsoft·asp.net
AI创界者10 小时前
零基础上手!ComfyUI + LTX-2.3 图生视频完整工作流搭建与调优指南(附避坑细节)
大数据·人工智能
怕浪猫10 小时前
AI图片工具到底有哪些?一份按能力维度整理的清单
人工智能
hongmai66688810 小时前
FH8856V310芯片详解:6M高清+0.5TOPS算力,赋能智能安防新方案
人工智能·单片机·嵌入式硬件·物联网·智能家居
一颗小树x11 小时前
NVIDIA Jetson Thor 运行 LLM / VLM:模型全整理与 vLLM 实践
人工智能·llm·jetson·vllm
每日综合11 小时前
蓝白风暴席卷BW2026!雷克沙展台首日燃情纪实
人工智能
To_OC11 小时前
手搓 LangChain 工具调用:原来 Agent 的核心逻辑,就是个 while 循环
人工智能·langchain·llm
Drgfd11 小时前
机器人从工厂走进生活:通用机器人开启大众商用时代
人工智能
硕迪科技SOLIDWORKS11 小时前
SOLIDWORKS与ERP对接不再是研发孤岛:硕迪科技数据同步方案让BOM流转提速百分之三百
人工智能·科技·solidworks与erp