start.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. import * as THREE from "../libs/three.js/build/three.module.js";
  2. import {settings, config} from './settings'
  3. import math from './utils/math'
  4. import browser from './utils/browser'
  5. import './extensions/three.shim.js'
  6. import {Utils} from "../src/utils.js"
  7. var start = function(dom, mapDom, number, fileServer){ //t-Zvd3w0m
  8. console.log('start')
  9. Potree.settings.number = number || 't-o5YMR13'// 't-iksBApb'// 写在viewer前
  10. Potree.fileServer = fileServer
  11. let viewer = new Potree.Viewer(dom , mapDom);
  12. let Alignment = viewer.modules.Alignment
  13. //let pointDensity = config.pointDensity.middle
  14. viewer.setEDLEnabled(false);
  15. viewer.setFOV(config.view.fov);
  16. //viewer.setPointBudget(pointDensity.pointBudget);
  17. viewer.loadSettingsFromURL();
  18. if(!Potree.settings.isOfficial){
  19. viewer.loadGUI(() => {
  20. viewer.setLanguage('en');
  21. //$("#menu_appearance").next().show();
  22. $("#menu_tools").next().show();
  23. $("#menu_scene").next().show();
  24. //$("#siteModel").show();
  25. $("#alignment").show();
  26. viewer.toggleSidebar();
  27. });
  28. Potree.settings.sizeFitToLevel = true//当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
  29. }
  30. Potree.loadDatasetsCallback = function(data, ifReload){
  31. Potree.datasetData = data
  32. viewer.transform = null
  33. var datasetLength = data.length
  34. var loaded = 0
  35. var loadDone = function(){//点云cloud.js加载完毕后
  36. viewer.updateModelBound()
  37. let {boundSize, center} = viewer.bound
  38. Potree.Log(`中心点: ${math.toPrecision(center.toArray(),2)}, boundSize: ${math.toPrecision(boundSize.toArray(),2)} ` , null, 12)
  39. if(!ifReload){
  40. Potree.Images360Loader.load(viewer, {
  41. boundSize: boundSize.clone(),
  42. center: center.clone()
  43. }, images360 => {
  44. viewer.scene.add360Images(images360);
  45. viewer.mapViewer.addListener(images360)
  46. {//初始位置
  47. var urlFirstView = false
  48. var panoId = browser.urlHasValue('pano',true);
  49. if(panoId != void 0){
  50. var pos
  51. var pano = viewer.images360.panos.find(e=>e.id==panoId);
  52. if(pano){
  53. viewer.images360.focusPano({
  54. pano,
  55. duration:0,
  56. callback:()=>{/* Potree.settings.displayMode = 'showPanos' */}
  57. })
  58. }
  59. }
  60. }
  61. viewer.emit('allLoaded')
  62. });
  63. }
  64. Potree.loadMapEntity() //加载floorplan,不一定成功
  65. if(!ifReload){
  66. viewer.scene.view.setView(//position, target
  67. center.clone().add(new THREE.Vector3(10,5,10)),
  68. center
  69. )
  70. if(!Potree.settings.isOfficial){
  71. setTimeout(//暂时延迟,等focus第一个点之后
  72. ()=>{
  73. // viewer.loadProject(Potree.scriptPath + "/data/t-iksBApb/potree.json5")
  74. },
  75. 500)
  76. }
  77. viewer.dispatchEvent({type:'loadPointCloudDone'})
  78. if(!Potree.settings.UserPointDensity){
  79. Potree.settings.UserPointDensity = 'middle'
  80. }
  81. Potree.Log('loadPointCloudDone 点云加载完毕', null, 10)
  82. }
  83. }
  84. var transformPointcloud = (pointcloud, dataset)=>{
  85. var locationLonLat = dataset.location.slice(0,2)
  86. //当只有一个dataset时,无论如何transform 点云和漫游点都能对应上。
  87. var location = viewer.transform.lonlatToLocal.forward(locationLonLat) //transform.inverse()
  88. //初始化位置
  89. pointcloud.matrixAutoUpdate = false //最好禁止updateMatrix 直接使用matrixWorld
  90. pointcloud.orientationUser = 0
  91. pointcloud.translateUser = new THREE.Vector3;
  92. viewer.sidebar && viewer.sidebar.addAlignmentButton(pointcloud)
  93. Alignment.rotate(pointcloud, null, dataset.orientation)
  94. Alignment.translate(pointcloud, new THREE.Vector3(location[0], location[1], dataset.location[2]))
  95. pointcloud.updateMatrixWorld()
  96. Potree.Log(`点云${pointcloud.dataset_id}旋转值:${pointcloud.orientationUser}, 位置${math.toPrecision(pointcloud.translateUser.toArray(),3)}, 经纬度 ${locationLonLat}, spacing ${pointcloud.material.spacing}`, null, 17 )
  97. //-------------------
  98. //viewer.mapView.showSources(false);
  99. }
  100. data.forEach((dataset,index)=>{
  101. //dataset.location = [ 113.60182446595765,22.364155116865753,0]
  102. //dataset.orientation = -0.9
  103. if(!viewer.transform){//拿任意一个数据集作为基准。它的位置就会是000
  104. var locationLonLat = dataset.location.slice(0,2)
  105. proj4.defs("NAVVIS:TMERC", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15));
  106. proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
  107. //proj4.defs("pointcloud", viewer.getProjection()); //不用从cloud里拿了
  108. let transform1 = proj4("WGS84", "NAVVIS:TMERC"); //这个ok TMERC是展开的平面投影
  109. 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;");
  110. viewer.transform = {
  111. lonlatToLocal : transform1,
  112. lonlatTo4550 : transform2 // 转大地坐标EPSG:4550
  113. }
  114. // proj4(fromProjection, toProjection, coordinates)
  115. //let transform = proj4("WGS84", "pointcloud");
  116. viewer.mapViewer && viewer.mapViewer.mapLayer.maps[0].updateProjection()
  117. }
  118. if(!ifReload){
  119. var cloudPath = `https://${Potree.config.urls.prefix}/data/${number}/data/${dataset.name}/webcloud/cloud.js`
  120. Potree.loadPointCloud(cloudPath, dataset.name , e => {
  121. let scene = viewer.scene;
  122. let pointcloud = e.pointcloud;
  123. let config = Potree.config.material
  124. let material = pointcloud.material;
  125. material.minSize = config.minSize
  126. material.maxSize = config.maxSize
  127. material.pointSizeType = Potree.PointSizeType[config.pointSizeType]//Potree.PointSizeType.ADAPTIVE;//FIXED
  128. pointcloud.changePointSize(config.pointSize) //material.size = config.pointSize;
  129. pointcloud.changePointOpacity(1)
  130. material.shape = Potree.PointShape.SQUARE;
  131. pointcloud.color = dataset.color
  132. pointcloud.dataset_id = dataset.id;//供漫游点找到属于的dataset点云
  133. pointcloud.panos = []
  134. transformPointcloud(pointcloud,dataset)
  135. scene.addPointCloud(pointcloud);
  136. loaded ++;
  137. if(loaded == datasetLength)loadDone()
  138. })
  139. }else{
  140. let pointcloud = viewer.scene.pointclouds.find(p => p.dataset_id == dataset.id)
  141. if(!pointcloud){
  142. Potree.Log('数据集id变了,自动使用第一个','#500')
  143. pointcloud = viewer.scene.pointclouds[0]
  144. }
  145. //先归零
  146. Alignment.translate(pointcloud, pointcloud.translateUser.clone().negate())
  147. Alignment.rotate(pointcloud, null, - pointcloud.orientationUser)
  148. transformPointcloud(pointcloud, dataset)
  149. }
  150. })
  151. if(ifReload){
  152. loadDone()
  153. }
  154. }
  155. Potree.loadDatasets(Potree.loadDatasetsCallback)
  156. window.testTransform = function(locationLonLat, location1, location2){
  157. proj4.defs("NAVVIS:test", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15));
  158. let transform = proj4("WGS84", "NAVVIS:test"); //这个ok navvis里也是这两种转换 见proj4Factory
  159. if(location1){//经纬度
  160. return transform.forward(location1)
  161. }else{
  162. return transform.inverse(location2)
  163. }
  164. }
  165. window.THREE = THREE
  166. window.buttonFunction = function(){
  167. /*
  168. viewer.startScreenshot({type:'measure', measurement:viewer.scene.measurements[0]})
  169. */
  170. viewer.modules.RouteGuider.routeStart = new THREE.Vector3(0,0,-1.3)
  171. viewer.modules.RouteGuider.routeEnd = new THREE.Vector3(-10,0,-1.3)
  172. }
  173. }
  174. //https://testlaser.4dkankan.com/indoor/t-ia44BhY/api/site_model
  175. //https://testlaser.4dkankan.com/indoor/t-ia44BhY/api/tiled_maps
  176. export {start}
  177. /*
  178. 坐标转换问题:
  179. 由于控制点可以随便输入,所以本地和地理位置的转换也是可拉伸的。而navvis的转换是等比由中心展开,
  180. 所以对比两种转化方式时误差较大。
  181. 另外地理注册控制点是有参考数据集的,若参考数据集和我放置在0,0,0的数据集一致,就可直接使用,否则要转换。
  182. */