annotation_hierarchy.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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. <link rel="stylesheet" type="text/css" href="../libs/Cesium/Widgets/CesiumWidget/CesiumWidget.css">
  15. </head>
  16. <body>
  17. <script src="../libs/jquery/jquery-3.1.1.min.js"></script>
  18. <script src="../libs/spectrum/spectrum.js"></script>
  19. <script src="../libs/jquery-ui/jquery-ui.min.js"></script>
  20. <script src="../libs/other/BinaryHeap.js"></script>
  21. <script src="../libs/tween/tween.min.js"></script>
  22. <script src="../libs/d3/d3.js"></script>
  23. <script src="../libs/proj4/proj4.js"></script>
  24. <script src="../libs/openlayers3/ol.js"></script>
  25. <script src="../libs/i18next/i18next.js"></script>
  26. <script src="../libs/jstree/jstree.js"></script>
  27. <script src="../build/potree/potree.js"></script>
  28. <script src="../libs/plasio/js/laslaz.js"></script>
  29. <script src="../libs/Cesium/Cesium.js"></script>
  30. <!-- INCLUDE ADDITIONAL DEPENDENCIES HERE -->
  31. <!-- INCLUDE SETTINGS HERE -->
  32. <div class="potree_container" style="position: absolute; width: 100%; height: 100%; left: 0px; top: 0px; ">
  33. <div id="potree_render_area" style="background-image: url('../build/potree/resources/images/background.jpg');">
  34. <div id="cesiumContainer" style="position: absolute; width: 100%; height: 100%; background-color:green"></div>
  35. </div>
  36. <div id="potree_sidebar_container"> </div>
  37. </div>
  38. <script type="module">
  39. import * as THREE from "../libs/three.js/build/three.module.js";
  40. window.cesiumViewer = new Cesium.Viewer('cesiumContainer', {
  41. useDefaultRenderLoop: false,
  42. animation: false,
  43. baseLayerPicker : false,
  44. fullscreenButton: false,
  45. geocoder: false,
  46. homeButton: false,
  47. infoBox: false,
  48. sceneModePicker: false,
  49. selectionIndicator: false,
  50. timeline: false,
  51. navigationHelpButton: false,
  52. imageryProvider : Cesium.createOpenStreetMapImageryProvider({url : 'https://a.tile.openstreetmap.org/'}),
  53. terrainShadows: Cesium.ShadowMode.DISABLED,
  54. });
  55. let cp = new Cesium.Cartesian3(4303414.154026048, 552161.235598733, 4660771.704035539);
  56. cesiumViewer.camera.setView({
  57. destination : cp,
  58. orientation: {
  59. heading : 10,
  60. pitch : -Cesium.Math.PI_OVER_TWO * 0.5,
  61. roll : 0.0
  62. }
  63. });
  64. window.potreeViewer = new Potree.Viewer(document.getElementById("potree_render_area"), {
  65. useDefaultRenderLoop: false
  66. });
  67. potreeViewer.setEDLEnabled(true);
  68. potreeViewer.setFOV(60);
  69. potreeViewer.setPointBudget(3_000_000);
  70. potreeViewer.setBackground(null);
  71. potreeViewer.setDescription("");
  72. potreeViewer.loadGUI(() => {
  73. potreeViewer.setLanguage('en');
  74. $("#menu_appearance").next().show();
  75. $("#menu_tools").next().show();
  76. $("#menu_scene").next().show();
  77. potreeViewer.toggleSidebar();
  78. });
  79. // CA13
  80. Potree.loadPointCloud("http://5.9.65.151/mschuetz/potree/resources/pointclouds/opentopography/CA13_1.4/cloud.js", "CA13", function(e){
  81. let pointcloud = e.pointcloud;
  82. let scene = potreeViewer.scene;
  83. let material = pointcloud.material;
  84. scene.addPointCloud(pointcloud);
  85. material.size = 1;
  86. material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
  87. potreeViewer.scene.view.setView(
  88. [675036.45, 3850315.78, 65076.70],
  89. [692869.03, 3925774.14, 1581.51],
  90. );
  91. let pointcloudProjection = e.pointcloud.projection;
  92. let mapProjection = proj4.defs("WGS84");
  93. window.toMap = proj4(pointcloudProjection, mapProjection);
  94. window.toScene = proj4(mapProjection, pointcloudProjection);
  95. { // ANNOTATIONS
  96. let aRoot = potreeViewer.scene.annotations;
  97. let aCA13 = new Potree.Annotation({
  98. title: "CA13",
  99. position: [675036.45, 3850315.78, 65076.70],
  100. cameraPosition: [675036.45, 3850315.78, 65076.70],
  101. cameraTarget: [692869.03, 3925774.14, 1581.51],
  102. });
  103. aRoot.add(aCA13);
  104. let aSanSimeon = new Potree.Annotation({
  105. title: "San Simeon",
  106. position: [664147.50, 3946008.73, 16.30],
  107. cameraPosition: [664941.80, 3943568.06, 1925.30],
  108. cameraTarget: [664147.50, 3946008.73, 16.30],
  109. });
  110. aCA13.add(aSanSimeon);
  111. let aHearstCastle = new Potree.Annotation({
  112. title: "Hearst Castle",
  113. position: [665744.56, 3950567.52, 500.48],
  114. cameraPosition: [665692.66, 3950521.65, 542.02],
  115. cameraTarget: [665744.56, 3950567.52, 500.48],
  116. });
  117. aCA13.add(aHearstCastle);
  118. let aMorroBay = new Potree.Annotation({
  119. title: "Morro Bay",
  120. position: [695483.33, 3916430.09, 25.75],
  121. cameraPosition: [694114.65, 3911176.26, 3402.33],
  122. cameraTarget: [695483.33, 3916430.09, 25.75],
  123. });
  124. aCA13.add(aMorroBay);
  125. let aMorroRock = new Potree.Annotation({
  126. title: "Morro Rock",
  127. position: [693729.66, 3916085.19, 90.35],
  128. cameraPosition: [693512.77, 3915375.61, 342.33],
  129. cameraTarget: [693729.66, 3916085.19, 90.35],
  130. });
  131. aMorroBay.add(aMorroRock);
  132. let aMorroBayMutualWaterCo = new Potree.Annotation({
  133. title: "Morro Bay Mutual Water Co",
  134. position: [694699.45, 3916425.75, 39.78],
  135. cameraPosition: [694377.64, 3916289.32, 218.40],
  136. cameraTarget: [694699.45, 3916425.75, 39.78],
  137. });
  138. aMorroBay.add(aMorroBayMutualWaterCo);
  139. let aLilaKeiserPark = new Potree.Annotation({
  140. title: "Lila Keiser Park",
  141. position: [694674.99, 3917070.49, 10.86],
  142. cameraPosition: [694452.59, 3916845.14, 298.64],
  143. cameraTarget: [694674.99, 3917070.49, 10.86],
  144. });
  145. aMorroBay.add(aLilaKeiserPark);
  146. let aSanLuisObispo = new Potree.Annotation({
  147. title: "San Luis Obispo",
  148. position: [712573.39, 3907588.33, 146.44],
  149. cameraPosition: [711158.29, 3907019.82, 1335.89],
  150. cameraTarget: [712573.39, 3907588.33, 146.44],
  151. });
  152. aCA13.add(aSanLuisObispo);
  153. let aLopezHill = new Potree.Annotation({
  154. title: "Lopez Hill",
  155. position: [728635.63, 3895761.56, 456.33],
  156. cameraPosition: [728277.24, 3895282.29, 821.51],
  157. cameraTarget: [728635.63, 3895761.56, 456.33],
  158. });
  159. aCA13.add(aLopezHill);
  160. let aWhaleRockReservoir = new Potree.Annotation({
  161. title: "Whale Rock Reservoir",
  162. position: [692845.46, 3925528.53, 140.91],
  163. cameraPosition: [693073.32, 3922354.02, 2154.17],
  164. cameraTarget: [692845.46, 3925528.53, 140.91],
  165. });
  166. aCA13.add(aWhaleRockReservoir);
  167. }
  168. { // TREE RETURNS POI - ANNOTATION & VOLUME
  169. let aRoot = scene.annotations;
  170. let elTitle = $(`
  171. <span>
  172. Tree Returns:
  173. <img name="action_return_number" src="${Potree.resourcePath}/icons/return_number.svg" class="annotation-action-icon"/>
  174. <img name="action_rgb" src="${Potree.resourcePath}/icons/rgb.png" class="annotation-action-icon"/>
  175. </span>`);
  176. elTitle.find("img[name=action_return_number]").click( () => {
  177. event.stopPropagation();
  178. material.activeAttributeName = "return_number";
  179. material.pointSizeType = Potree.PointSizeType.FIXED;
  180. material.size = 5;
  181. potreeViewer.setClipTask(Potree.ClipTask.SHOW_INSIDE);
  182. });
  183. elTitle.find("img[name=action_rgb]").click( () => {
  184. event.stopPropagation();
  185. material.activeAttributeName = "rgba";
  186. material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
  187. material.size = 1;
  188. potreeViewer.setClipTask(Potree.ClipTask.HIGHLIGHT);
  189. });
  190. elTitle.toString = () => "Tree Returns";
  191. let aTreeReturns = new Potree.Annotation({
  192. title: elTitle,
  193. position: [675756.75, 3937590.94, 80.21],
  194. cameraPosition: [675715.78, 3937700.36, 115.95],
  195. cameraTarget: [675756.75, 3937590.94, 80.21],
  196. });
  197. aRoot.add(aTreeReturns);
  198. aTreeReturns.domElement.find(".annotation-action-icon:first").css("filter", "invert(1)");
  199. let volume = new Potree.BoxVolume();
  200. volume.position.set(675755.4039368022, 3937586.911614576, 85);
  201. volume.scale.set(119.87189835418388, 68.3925257233834, 51.757483718373265);
  202. volume.rotation.set(0, 0, 0.8819755090987993, "XYZ");
  203. volume.clip = true;
  204. volume.visible = false;
  205. volume.name = "Trees";
  206. scene.addVolume(volume);
  207. }
  208. });
  209. function loop(timestamp){
  210. requestAnimationFrame(loop);
  211. potreeViewer.update(potreeViewer.clock.getDelta(), timestamp);
  212. potreeViewer.render();
  213. if(window.toMap !== undefined){
  214. {
  215. let camera = potreeViewer.scene.getActiveCamera();
  216. let pPos = new THREE.Vector3(0, 0, 0).applyMatrix4(camera.matrixWorld);
  217. let pRight = new THREE.Vector3(600, 0, 0).applyMatrix4(camera.matrixWorld);
  218. let pUp = new THREE.Vector3(0, 600, 0).applyMatrix4(camera.matrixWorld);
  219. let pTarget = potreeViewer.scene.view.getPivot();
  220. let toCes = (pos) => {
  221. let xy = [pos.x, pos.y];
  222. let height = pos.z;
  223. let deg = toMap.forward(xy);
  224. let cPos = Cesium.Cartesian3.fromDegrees(...deg, height);
  225. return cPos;
  226. };
  227. let cPos = toCes(pPos);
  228. let cUpTarget = toCes(pUp);
  229. let cTarget = toCes(pTarget);
  230. let cDir = Cesium.Cartesian3.subtract(cTarget, cPos, new Cesium.Cartesian3());
  231. let cUp = Cesium.Cartesian3.subtract(cUpTarget, cPos, new Cesium.Cartesian3());
  232. cDir = Cesium.Cartesian3.normalize(cDir, new Cesium.Cartesian3());
  233. cUp = Cesium.Cartesian3.normalize(cUp, new Cesium.Cartesian3());
  234. cesiumViewer.camera.setView({
  235. destination : cPos,
  236. orientation : {
  237. direction : cDir,
  238. up : cUp
  239. }
  240. });
  241. }
  242. let aspect = potreeViewer.scene.getActiveCamera().aspect;
  243. if(aspect < 1){
  244. let fovy = Math.PI * (potreeViewer.scene.getActiveCamera().fov / 180);
  245. cesiumViewer.camera.frustum.fov = fovy;
  246. }else{
  247. let fovy = Math.PI * (potreeViewer.scene.getActiveCamera().fov / 180);
  248. let fovx = Math.atan(Math.tan(0.5 * fovy) * aspect) * 2
  249. cesiumViewer.camera.frustum.fov = fovx;
  250. }
  251. }
  252. cesiumViewer.render();
  253. }
  254. requestAnimationFrame(loop);
  255. </script>
  256. </body>
  257. </html>