4dkk.html 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="description" content="">
  6. <meta name="author" content="">
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  8. <title>Potree Viewer</title>
  9. <link rel="stylesheet" type="text/css" href="../../build/potree/potree.css">
  10. <link rel="stylesheet" type="text/css" href="../../libs/jquery-ui/jquery-ui.min.css">
  11. <link rel="stylesheet" type="text/css" href="../../libs/openlayers3/ol.css">
  12. <link rel="stylesheet" type="text/css" href="../../libs/spectrum/spectrum.css">
  13. <link rel="stylesheet" type="text/css" href="../../libs/jstree/themes/mixed/style.css">
  14. </head>
  15. <body>
  16. <script src="../../libs/jquery/jquery-3.1.1.min.js"></script>
  17. <script src="../../libs/spectrum/spectrum.js"></script>
  18. <script src="../../libs/jquery-ui/jquery-ui.min.js"></script>
  19. <script src="../../libs/other/BinaryHeap.js"></script>
  20. <script src="../../libs/tween/tween.min.js"></script>
  21. <script src="../../libs/d3/d3.js"></script>
  22. <script src="../../libs/proj4/proj4.js"></script>
  23. <script src="../../libs/openlayers3/ol.js"></script>
  24. <script src="../../libs/i18next/i18next.js"></script>
  25. <script src="../../libs/jstree/jstree.js"></script>
  26. <script src="../../build/potree/potree.js"></script>
  27. <script src="../../libs/plasio/js/laslaz.js"></script>
  28. <div class="potree_container" style="position: absolute; width: 100%; height: 100%; left: 0px; top: 0px; ">
  29. <div id="potree_render_area" style="background-image: url('../../build/potree/resources/images/background.jpg');">
  30. </div>
  31. <div id="potree_sidebar_container"> </div>
  32. </div>
  33. <script type="module">
  34. import * as THREE from "../libs/three.js/build/three.module.js";
  35. import {Alignment} from "../src/modules/datasetAlignment/Alignment.js";
  36. import {Utils} from "../src/utils.js"
  37. var number = window.location.href.substring(window.location.href.indexOf("=") + 1);
  38. if (number.indexOf("&") != -1) {
  39. number = number.substring(0, number.indexOf("&"));
  40. }
  41. if (number.indexOf("#") != -1) {
  42. number = number.substring(0, number.indexOf("#"));
  43. }
  44. Potree.settings.number = number || 't-o5YMR13'// 't-iksBApb'
  45. window.viewer = new Potree.Viewer(document.getElementById("potree_render_area"));
  46. viewer.setEDLEnabled(true);
  47. viewer.setFOV(60);
  48. viewer.setPointBudget(2_000_000);
  49. viewer.loadSettingsFromURL();
  50. viewer.loadGUI(() => {
  51. viewer.setLanguage('en');
  52. $("#menu_appearance").next().show();
  53. viewer.toggleSidebar();
  54. });
  55. var datasetPath = `https://testlaser.4dkankan.com/indoor/${number}/api/datasets`
  56. Potree.loadDatasets(datasetPath, (data)=>{
  57. var datasetLength = data.length
  58. var loaded = 0
  59. var loadDone = function(){
  60. //var url = "../data/"+number+"/filter.json"
  61. var url = `https://testlaser.4dkankan.com/indoor/${number}/api/images/filter?hidden=false&lat=22.3666054305652&lon=113.59566752095002&radius=200000&site_model_entity=`
  62. var {boundSize, center} = Utils.computePointcloudsBound(viewer.scene.pointclouds)
  63. viewer.bound = {boundSize, center}
  64. Potree.Images360Loader.load2(url, viewer, {boundSize, center}).then( images => {
  65. viewer.scene.add360Images(images);
  66. });
  67. viewer.scene.view.setView(//position, target
  68. center.clone().add(new THREE.Vector3(10,10,10)),
  69. center
  70. )
  71. }
  72. data.forEach((dataset,index)=>{
  73. var name = dataset.name
  74. var locationLonLat = dataset.location.slice(0,2)
  75. if(!viewer.transform){
  76. proj4.defs("NAVVIS:TMERC", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15));
  77. proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
  78. //proj4.defs("pointcloud", viewer.getProjection()); //不用从cloud里拿了
  79. let transform1 = proj4("WGS84", "NAVVIS:TMERC"); //这个ok TMERC是展开的平面投影
  80. let transform2 = proj4("+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs;");
  81. viewer.transform = {
  82. lonlatToLocal : transform1,
  83. lonlatTo4550 : transform2 // 转大地坐标EPSG:4550
  84. }
  85. // proj4(fromProjection, toProjection, coordinates)
  86. //let transform = proj4("WGS84", "pointcloud");
  87. }
  88. var cloudPath = 'https://laser.4dkankan.com/data/'+number+'/data/'+ name +'/webcloud/cloud.js'
  89. Potree.loadPointCloud(cloudPath, name, e => {
  90. let scene = viewer.scene;
  91. let pointcloud = e.pointcloud;
  92. let material = pointcloud.material;
  93. material.size = 0.7;
  94. material.minSize = 0.1//2.0;
  95. material.pointSizeType = Potree.PointSizeType.ATTENUATED//Potree.PointSizeType.ADAPTIVE;//FIXED
  96. material.shape = Potree.PointShape.SQUARE;
  97. //material.activeAttributeName = "rgba";
  98. /*
  99. material.activeAttributeName = "color";
  100. material.color.set(dataset.color)
  101. material.opacity = 0.05
  102. material.size = 0.2;
  103. material.useEDL = false
  104. */
  105. scene.addPointCloud(pointcloud);
  106. pointcloud.dataset_id = dataset.id;//供漫游点找到属于的dataset点云
  107. pointcloud.panos = []
  108. //旋转中心
  109. //var center = new THREE.Vector3().addVectors(pointcloud.position, pointcloud.boundingBox.getCenter())
  110. //偏移
  111. //当只有一个dataset时,无论如何transform 点云和漫游点都能对应上。
  112. var location = viewer.transform.lonlatToLocal.forward(locationLonLat) //transform.inverse()
  113. //初始化位置
  114. pointcloud.matrixAutoUpdate = false //最好禁止updateMatrix 直接使用matrixWorld
  115. pointcloud.orientationUser = 0
  116. pointcloud.translateUser = new THREE.Vector3;
  117. viewer.sidebar.addAlignmentButton(pointcloud)
  118. Alignment.rotate(pointcloud, null, dataset.orientation)
  119. Alignment.translate(pointcloud, new THREE.Vector3(location[0], location[1], dataset.location[2]))
  120. pointcloud.updateMatrixWorld()
  121. console.log(`%c点云${name}旋转值:${pointcloud.orientationUser}, 位置${pointcloud.translateUser.toArray()}`,"color:#13f;font-size:17px" )
  122. //-------------------
  123. viewer.mapView.showSources(false);
  124. loaded ++;
  125. if(loaded == datasetLength)loadDone()
  126. });
  127. })
  128. })
  129. window.testTransform = function(locationLonLat, location1, location2){
  130. proj4.defs("NAVVIS:test", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15));
  131. let transform = proj4("WGS84", "NAVVIS:test"); //这个ok navvis里也是这两种转换 见proj4Factory
  132. if(location1){//经纬度
  133. return transform.forward(location1)
  134. }else{
  135. return transform.inverse(location2)
  136. }
  137. }
  138. /*
  139. 数据集校准 平移后
  140. 单个数据集:
  141. 点云的本地位置是一样的 。说明:单个数据集时点云最终平移量为0,同理漫游点也是
  142. 多个数据集时,参照为第一个dataset,见GeoTransformationService.setOffsetFromGlobal。所以第一个数据集的位置为000,其他的不是。因此本地坐标是不固定的,只有指定了参考数据集才能确定,如果去掉第一个数据集下一次显示的坐标就不同了,但是不影响相对位置所以看起来一样。
  143. (注意:navvis平移后要刷新location才生效。)
  144. var view = window.IV.getMainView()
  145. view.ImageService.images.forEach(e=>console.log(e.id + ": "+e.location.toArray()))
  146. images360.panos.forEach(e=>console.log(e.id + ": "+e.position.toArray()))
  147. */
  148. </script>
  149. </body>
  150. </html>