使用Potree进行点云可视化

实验步骤

一、配置Potree

1、首先,确定电脑已经安装了nodejs和gulp,可以使用npm命令和gulp命令。
2、在一个文件夹下,打开git命令面板,输入git clone https://github.com/potree/potree
3、在终端输入以下命令:
cd Potree安装目录
npm install
npm install -g gulp
4、输入命令:gulp watch
此时Potree的安装目录下应当有了一个build的文件夹。

二、准备数据

Potree可视化数据需要使用具备Potree它定义的格式的数据,因此需要对txt、las等数据使用PotreeConverter转换格式。
1、在git面板输入命令:git clone https://github.com/LAStools/LAStools
2、在终端输入以下命令:
cd ~/dev/workspaces/lastools
git clone https://github.com/m-schuetz/LAStools.git master
cd master/LASzip
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
这就配置好PotreeConverter所需要的LAStool依赖了。
3、继续在终端输入以下命令:
cd ~/dev/workspaces/PotreeConverter
git clone https://github.com/potree/PotreeConverter.git master
cd master
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DLASZIP_INCLUDE_DIRS=~/dev/workspaces/lastools/master/LASzip/dll -DLASZIP_LIBRARY=~/dev/workspaces/lastools/master/LASzip/build/src/liblaszip.so ..
make
等待它构建好。
4、新建一个文件夹PotreeConverted,作为要存放转换之后的数据的文件夹,将PotreeConverter/resources/page_template下的东西拷贝到点云数据.txt的该文件夹下(别拷贝文件夹,而是全选文件复制粘贴到PotreeConverted这个文件夹下)
5、进入之间构建好的PotreeConverter的build文件夹下的PotreeConverter文件夹,找到打开终端输入命令:
./PotreeConverter.执行文件后缀(exe/sh) 点云数据txt的路径 -o 转换后数据存放路径 -p 转换后数据的名字
6、等待转换好后,即可看到Potree格式的数据。格式如下:

2018-04-23 17-03-26屏幕截图.png

进入pointclouds/maxdata,应当看到:
2018-04-23 17-03-32屏幕截图.png

三、项目建立

1、打开Idea,点击File->New Project->选中static web标签->static web->next->输入项目名->Finish
2、将Potree安装目录下的Libs目录下的文件夹都拷贝到Idea项目下。
并将之前Potree的build目录拷贝过来,重命名为Potree
3、将之前转换好的数据的pointclouds文件夹拷贝到项目目录下。
4、完成后应具有的项目目录结构为:


2018-04-23 17-16-58屏幕截图.png

四、源码编写与运行

1、在项目下新建一个文件夹叫src。
2、在src下新建一个HTML文件,随意命名,文件中代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="description" content="">
    <meta name="author" content="">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
    <title>Potree Viewer</title>

    <link rel="stylesheet" type="text/css" href="../libs/potree/potree/potree.css">
    <link rel="stylesheet" type="text/css" href="../libs/jquery-ui/jquery-ui.min.css">
    <link rel="stylesheet" type="text/css" href="../libs/perfect-scrollbar/css/perfect-scrollbar.css">
    <link rel="stylesheet" type="text/css" href="../libs/openlayers3/ol.css">
    <link rel="stylesheet" type="text/css" href="../libs/spectrum/spectrum.css">
    <link rel="stylesheet" type="text/css" href="../libs/jstree/themes/mixed/style.css">
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>

<body>
    <script src="../libs/jquery/jquery-3.1.1.min.js"></script>
    <script src="../libs/spectrum/spectrum.js"></script>
    <script src="../libs/perfect-scrollbar/js/perfect-scrollbar.jquery.js"></script>
    <script src="../libs/jquery-ui/jquery-ui.min.js"></script>
    <script src="../libs/three.js/build/three.min.js"></script>
    <script src="../libs/other/BinaryHeap.js"></script>
    <script src="../libs/tween/tween.min.js"></script>
    <script src="../libs/d3/d3.js"></script>
    <script src="../libs/proj4/proj4.js"></script>
    <script src="../libs/openlayers3/ol.js"></script>
    <script src="../libs/i18next/i18next.js"></script>
    <script src="../libs/jstree/jstree.js"></script>
    <script src="../libs/potree/potree/potree.js"></script>
    <script src="../libs/plasio/js/laslaz.js"></script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=GfIjvGE8EkCeW7PwkdjOC38hV7hn8nwg"></script>
    <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.6&key=a2989b2bc788178770132e4b93e51fd9"></script>
    
    <!-- INCLUDE ADDITIONAL DEPENDENCIES HERE -->
    <!-- INCLUDE SETTINGS HERE -->
    <div style="position: relative; width: 100%; height: 100%">

        <div id="map_container" style="width: 100%; height : 100%; position: absolute;z-index: 0"></div>
        <div class="potree_container" style="position: absolute; width: 100%; height: 100%; left: 0px; top: 0px; z-index: 1;background-color: rgba(0,0,0,0.5)">
            <div id="potree_render_area" ></div>

        </div>
        <div id="mymenu" style="position: absolute; top: 5%;left: 2%; z-index: 2;
        width : 20%; height: 100%; background:#fff;">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">图层</h3>
                </div>
                <div class="panel-body">
                    <div class="list-group">
                        <a href="#" class="list-group-item disactive">地图</a>
                        <a href="#" class="list-group-item active">点云模型</a>
                    </div>
                </div>
            </div>
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">投影</h3>
                </div>
                <div class="panel-body">
                    <div class="btn-group-vertical" role="group">
                        <button type="button" class="btn btn-default" id="ortho_btn">正交投影</button>
                        <button type="button" class="btn btn-default" id="pespect_btn">透视投影</button>
                    </div>
                </div>
            </div>
            <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">设置Potree数据路径</h3>
            </div>
            <div class="panel-body">
                <div class="input-group">
                    <input type="text" class="form-control" id="inputfile">
                </div>
                <button type="submit" class="btn btn-default" id="submitBtn">提交</button>
            </div>
            </div>
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">选点</h3>
                </div>
                <div class="panel-body" style="background-color: #4F4F4F;">
                    <li id="tools" style="list-style: none;"></li>
                </div>
            </div>

        </div>


    <script>


        $(".list-group-item").click(function () {
            if(this.classList[1] == "disactive"){
                this.classList.remove("disactive");
                this.classList.add("active");
            }
            else{
                this.classList.remove("active");
                this.classList.add("disactive");
            }

        });
        var inputpath = "../pointclouds/maxdata/cloud.js";
        $("#submitBtn").click(function () {
            inputpath = $("#inputfile").val();
            console.log(inputpath);
            loadData();
        });
        $("#pespect_btn").click(function () {
            viewer.setCameraMode(Potree.CameraMode["PERSPECTIVE"]);
            $("#ortho_btn").classList.remove("active");
            console.log(viewer.camer)
        });
        $("#ortho_btn").click(function () {
            viewer.setCameraMode(Potree.CameraMode["ORTHOGRAPHIC"]);
            $("#pespect_btn").classList.remove("active");
        });
        //Gaode map
        var map = new AMap.Map('map_container', {
            pitch:75,
            viewMode:'3D',
            zoom: 17,
            expandZoomRange:true,
            zooms:[3,20],
            center:[116.333926,39.997245]
        });

        //relate Potree to the map
        var canvas = document.createElement('canvas');
        canvas.setAttribute("id","potree_canvas");

        console.log(Potree.Features);

        console.log(canvas);
        canvas.width = map.getSize().width;
        canvas.height = map.getSize().height;
        var cus = new AMap.CustomLayer(canvas, {
            opacit:50,
            zIndex: 12
        });
        cus.setMap(map);
        //Potree渲染区域初始化
        var viewer = new Potree.Viewer(document.getElementById("potree_render_area"));
        
        viewer.setEDLEnabled(true);
        viewer.setFOV(60);
        viewer.setPointBudget(1*1000*1000);
        viewer.loadSettingsFromURL();
        
        viewer.setDescription("");
        viewer.background = null;
        //绘制菜单栏中的选点,与Potree自带的选点功能(callback)相连
        let createToolIcon = function (icon, title, callback) {
            let element = $(`
            <img src="${icon}"
                style="width: 32px; height: 32px"
                class="button-icon"
                data-i18n="${title}" />
        `);

            element.click(callback);

            return element;
        };
        initMeasure();
        var measuringTool = new Potree.MeasuringTool(viewer);

        function initMeasure () {

            // POINT
            var elToolbar = $('#tools');
            elToolbar.append(createToolIcon(
                Potree.resourcePath + '/icons/point.svg',
                '[title]tt.point_measurement',
                function () {
                    $('#menu_measurements').next().slideDown();
                    var measurement = measuringTool.startInsertion({
                        showDistances: false,
                        showAngles: false,
                        showCoordinates: true,
                        showArea: false,
                        closed: true,
                        maxMarkers: 1,
                        name: 'Point'});

                }
            ));

        }
        //加载点云数据
        loadData();
        function loadData() {
            Potree.loadPointCloud(inputpath, "dotcloud", function(e){
                viewer.scene.addPointCloud(e.pointcloud);
                var material = e.pointcloud.material;
                material.size = 0.01;
                material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
                viewer.fitToScreen();
            });
            //Potree.setProjection()
        }

        /*var canvasLayer = new AMap.CanvasLayer({
            canvas: document.getElementById('potree_canvas'),
            zIndex: 1,
            opacity: 1
        })*/
        //canvasLayer.setMap(map);

    </script>
    
    
  </body>
</html>

4、点击Idea上方菜单栏Run中的Edit configurations,打开后配置如下(hdychi.html为我在上一步中创建的html):


2018-04-23 17-31-02屏幕截图.png

这里主要配置Name和路径即可。
5、点击Run中的run xxx.html,等待浏览器打开后,即可看到项目:


2018-04-23 17-33-44屏幕截图.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,646评论 18 139
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,228评论 9 467
  • git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git b...
    猿万阅读 5,053评论 1 45
  • 武志红老师的书,不管翻到哪一页开始读,都可以很快的进入他的思绪,可能这就是心理作家的优势?今天读到的是中国男人是中...
    拂晓大鹫阅读 190评论 0 0
  • 我们曾来过这个世界,深藏于心的记忆将会是我们在岁月中汲取的可以度过余生的力量。 我们对岁月大都是无痕、薄情之类的冷...
    青文鱼阅读 334评论 0 1