enter.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  1. import parameter from "./parameter";
  2. import mitt from "mitt";
  3. import {
  4. CoordType
  5. }
  6. from "../../types";
  7. import {
  8. Loading
  9. }
  10. from "@kankan/components/index";
  11. import revision from "./REVISION";
  12. import {
  13. ui18n
  14. }
  15. from "@/lang";
  16. import libTransform from "coordtransform";
  17. //交通版laser
  18. var CloneJson = function (data) {
  19. var str = JSON.stringify(data);
  20. return JSON.parse(str);
  21. };
  22. var enter = ({
  23. dom,
  24. mapDom,
  25. number,
  26. //datasetId, //初始数据集
  27. webSite, //废弃,改为用dataset.webBin
  28. isLocal = false,
  29. basePath,
  30. isDebug = false,
  31. mapCompany, // 地图版本 'default' | 'google' default就跟现在一样
  32. axios,
  33. version, //'V3''V4' 废弃,改为从getDataset获取
  34. staticPrefix,
  35. cropArgs,
  36. }) => {
  37. let isScreenshoting = false;
  38. let lastSiteModelData;
  39. let page; //所在页面
  40. const sceneBus = mitt();
  41. Potree.settings.isOfficial = true; //标记为正式、非测试版本
  42. Potree.settings.isDebug = isDebug;
  43. //Potree.settings.originDatasetId = datasetId;
  44. if (isLocal) {
  45. //本地配置
  46. Potree.settings.isLocal = isLocal;
  47. for (let i in Potree.settings.urls) {
  48. Potree.settings.urls[i] = basePath; //全部替换
  49. }
  50. }
  51. webSite && (Potree.settings.webSite = webSite);
  52. axios && (Potree.fileServer = axios);
  53. if (staticPrefix) {
  54. // "/dev/SS-t-4pMXagRDjk"
  55. Potree.settings.isLocal = true;
  56. Potree.settings.urls.prefix1 = Potree.settings.urls.prefix3 = staticPrefix;
  57. Potree.settings.webSite = "wwwroot";
  58. }
  59. Potree.start(dom, mapDom, number);
  60. parameter.dom = dom;
  61. parameter.number = number;
  62. parameter.viewer = viewer;
  63. parameter.sceneBus = sceneBus;
  64. //Potree.settings.rotAroundPoint = false; //试验
  65. sceneBus.on("visible", (v) => {
  66. viewer.visible = v;
  67. //console.log('sceneBus visible', v)
  68. });
  69. viewer.addEventListener("allLoaded", (e) => {
  70. //全部加载完,除了地图
  71. sceneBus.emit("allLoaded");
  72. });
  73. viewer.addEventListener("webglError", (e) => {
  74. console.error("viewer webglError: " + e);
  75. sceneBus.emit("webglError", {
  76. msg: e.msg
  77. });
  78. });
  79. let cameraChange = (e) => {
  80. var camera = e.viewport.camera;
  81. var pos = camera.position;
  82. if (e.viewport.name == "MainView") {
  83. sceneBus.emit("posChange", {
  84. x: pos.x,
  85. y: pos.y,
  86. z: pos.z,
  87. rotate: camera.rotation,
  88. //dataset: viewer.atDatasets.map((e) => e.dataset_id),
  89. });
  90. }
  91. };
  92. viewer.addEventListener("camera_changed", cameraChange);
  93. viewer.addEventListener("shelterComputed", () => {
  94. cameraChange({
  95. viewport: viewer.mainViewport
  96. });
  97. });
  98. {
  99. Potree.loadingByTex = false;
  100. let delayShow = 400;
  101. let timer;
  102. viewer.addEventListener("loading", (e) => {
  103. //加载的等待页面
  104. if (e.show) {
  105. if (!isScreenshoting) {
  106. //截图时不显示
  107. Potree.loadingByTex = true;
  108. timer && clearTimeout(timer);
  109. timer = setTimeout(() => {
  110. if (Potree.loadingByTex) {
  111. Loading.show();
  112. }
  113. }, delayShow);
  114. }
  115. } else {
  116. Potree.loadingByTex = false;
  117. timer && clearTimeout(timer);
  118. Loading.hide();
  119. }
  120. });
  121. }
  122. let info;
  123. const units = {
  124. 1: "metric",
  125. 2: "imperial"
  126. };
  127. let getMeasureType = function (type, unit) {
  128. switch (type) {
  129. case "LINE":
  130. info = {
  131. measureType: "Distance"
  132. };
  133. break;
  134. case "SERIES":
  135. info = {
  136. measureType: "MulDistance"
  137. };
  138. break;
  139. case "AREA":
  140. info = {
  141. measureType: "Area"
  142. };
  143. break;
  144. case "L_LINE":
  145. info = {
  146. measureType: "Hor Distance"
  147. };
  148. break;
  149. case "L_SERIES":
  150. info = {
  151. measureType: "Hor MulDistance"
  152. };
  153. break;
  154. case "L_AREA":
  155. info = {
  156. measureType: "Hor Area"
  157. };
  158. break;
  159. case "L_RECTANGLE":
  160. info = {
  161. measureType: "Hor Rect Area"
  162. };
  163. break;
  164. case "V_LINE":
  165. info = {
  166. measureType: "Ver Distance"
  167. };
  168. break;
  169. case "V_SERIES":
  170. info = {
  171. measureType: "Ver MulDistance"
  172. };
  173. break;
  174. case "V_AREA":
  175. info = {
  176. measureType: "Ver Area"
  177. };
  178. break;
  179. case "V_RECTANGLE":
  180. info = {
  181. measureType: "Ver Rect Area"
  182. };
  183. break;
  184. default:
  185. console.error("无此 measure type", type);
  186. }
  187. info.unit = units[unit];
  188. return info;
  189. };
  190. let getMeasureFunction = function (measure, bus) {
  191. measure.addEventListener("marker_dropped", (e) => {
  192. //拖拽结束后发送changeCallBack
  193. if (measure.parent) {
  194. //未被删除
  195. bus.emit("update");
  196. }
  197. });
  198. /* measure.addEventListener("highlight", (e) => {
  199. bus.emit("highlight", e.state);
  200. }); */
  201. measure.addEventListener("selected", (e) => {
  202. bus.emit("selected", e.state);
  203. });
  204. return {
  205. quit: () => {
  206. Potree.Log("quit结束且删除: " + measure.id, {
  207. font: {
  208. color: "#00c7b2"
  209. },
  210. });
  211. viewer.dispatchEvent({
  212. type: "cancel_insertions",
  213. remove: true,
  214. measure,
  215. });
  216. }, //触发结束。退出测量模式,清除之前操作
  217. clear: () => {
  218. //删除
  219. Potree.Log("clear删除: " + measure.id, {
  220. font: {
  221. color: "#00c7b2"
  222. }
  223. });
  224. viewer.dispatchEvent({
  225. type: "cancel_insertions",
  226. remove: true,
  227. measure,
  228. });
  229. viewer.scene.removeMeasurement(measure);
  230. },
  231. end: () => {
  232. //完成 相当于右键
  233. measure.dispatchEvent({
  234. type: "finish",
  235. measure
  236. });
  237. },
  238. getPoints: () => {
  239. return measure.points;
  240. },
  241. getDatasetLocations: () => {
  242. return measure.dataset_points;
  243. },
  244. getDatasets: () => {
  245. return [1]//measure.points_datasets;
  246. },
  247. getDatasetId: () => {
  248. return 1//measure.datasetId;
  249. },
  250. getArea: () => {
  251. return measure.area; //{value:area, string:..}
  252. },
  253. getDistance: () => {
  254. if (measure.points.length < 2)
  255. return null;
  256. var value = measure.getTotalDistance(); //measure.points[0].distanceTo(measure.points[1])
  257. return {
  258. value, //米
  259. string: viewer.unitConvert.convert(
  260. value,
  261. "distance",
  262. void 0,
  263. measure.unitSystem,
  264. 0.1,
  265. true),
  266. };
  267. },
  268. changeUnit: (unit) => {
  269. //公制|英制 , 1 | 2 单位
  270. measure.setUnitSystem(units[unit]);
  271. },
  272. toDataURL: (width, height) => {
  273. //截图
  274. isScreenshoting = true;
  275. var {
  276. getImagePromise,
  277. finishPromise
  278. } = viewer.startScreenshot({
  279. type: "measure",
  280. measurement: measure,
  281. hideMarkers: true,
  282. hideMeasures:true,
  283. ifGetPose: true,
  284. },
  285. width,
  286. height);
  287. finishPromise.done(() => {
  288. isScreenshoting = false;
  289. });
  290. return finishPromise; //getImagePromise.done时是可以getPose的, finishPromise.done时才开始截下一张图
  291. },
  292. //手动开启或关闭:
  293. show: () => {
  294. Potree.Utils.updateVisible(measure, "inListByUser", true);
  295. },
  296. hide: () => {
  297. Potree.Utils.updateVisible(measure, "inListByUser", false);
  298. },
  299. highlight: (isHight) => {
  300. measure.setSelected(isHight, "byList");
  301. },
  302. };
  303. };
  304. var sdk = {
  305. temp: {}, //记录
  306. debug: isDebug,
  307. scene: {
  308. getScreenByPoint(pos, canShelter) {
  309. //通过真实坐标获取DOM坐标
  310. let pos3d = new THREE.Vector3().copy(pos);
  311. if (canShelter) {
  312. if (viewer.ifPointBlockedByIntersect(pos3d)) {
  313. //console.log('shelter')
  314. return {
  315. trueSide: false
  316. };
  317. }
  318. }
  319. var viewport = viewer.mainViewport;
  320. var camera = viewport.camera;
  321. var dom = viewer.renderArea;
  322. //Potree.Log('getScreenByPoint scene' , pos3d.toArray(), {font:{toFixed:2,fontSize:10}})
  323. return Potree.Utils.getPos2d(pos3d, camera, dom, viewport);
  324. },
  325. getPointByScreen(pos2d) {
  326. //获取当前画面鼠标所在位置的三维点(必须是点云点)
  327. let position,
  328. /* datasetId,
  329. dataset_location, */
  330. intersect;
  331. let Handler = viewer.inputHandler;
  332. let needReGet =
  333. !Potree.settings.depTexLocBindDataset &&
  334. Potree.settings.useDepthTex &&
  335. Handler.intersect &&
  336. !Handler.intersect.pointcloud; //如果开启了depTexLocBindDataset,热点就可能使用深度图了,属于该漫游点。全景得到的位置更均匀
  337. if ((pos2d && pos2d.inDrag) || needReGet) {
  338. //不使用当前鼠标所在位置的intersect,单独算
  339. if (!pos2d) {
  340. // needReGet
  341. intersect = Handler.getIntersect(
  342. Handler.hoverViewport,
  343. true,
  344. null,
  345. null,
  346. true); //数据集多的时候卡顿
  347. } else {
  348. pos2d.clientX = pos2d.x;
  349. pos2d.clientY = pos2d.y;
  350. pos2d.onlyGetIntersect = true;
  351. pos2d.whichPointcloud = !Potree.settings.depTexLocBindDataset;
  352. intersect = Handler.onMouseMove(pos2d);
  353. }
  354. } else {
  355. intersect = Handler.intersect;
  356. }
  357. if (intersect && intersect.location) {
  358. position = intersect.location.clone();
  359. /* datasetId = intersect.pointcloud.dataset_id;
  360. dataset_location = Potree.Utils.datasetPosTransform({
  361. toDataset: true,
  362. pointcloud: intersect.pointcloud,
  363. position,
  364. }); */
  365. } else
  366. return null;
  367. //console.log(position, datasetId, dataset_location)
  368. return {
  369. position,
  370. /* datasetId,
  371. dataset_location */
  372. };
  373. }, //全景模式一直获取会很卡
  374. getPose2() {
  375. const camera = viewer.scene.getActiveCamera();
  376. const target = viewer.scene.view.getPivot();
  377. const position = viewer.scene.view.position;
  378. return {
  379. position,
  380. target
  381. };
  382. },
  383. currentCamera() {
  384. return viewer.scene.getActiveCamera().position.clone();
  385. },
  386. // 切换模式 1 点云 0 全景图
  387. changeMode(v) {
  388. //Potree.settings.displayMode = Potree.settings.displayMode == 'showPointCloud' ? 'showPanos' : 'showPointCloud'
  389. Potree.settings.displayMode = v == 0 ? "showPanos" : "showPointCloud";
  390. },
  391. getCurrentMode() {
  392. return Potree.settings.displayMode == "showPanos" ? 0 : 1;
  393. },
  394. comeToTag(tag) {
  395. let dontLookUp = page == "geoRegistration"; //防止相机在地面以下
  396. return viewer.focusOnObject({
  397. position: new THREE.Vector3().copy(tag)
  398. },
  399. "tag",
  400. null, {
  401. dontLookUp,
  402. maxDis: Potree.config.panoFieldRadius,
  403. checkIntersect: true /*, sameFloor:true */,
  404. }).promise;
  405. },
  406. comeToMeasure(measure) {
  407. let result = viewer.focusOnObject(measure.object, "measure", 1200);
  408. return result.msg ? result.msg : result.promise;
  409. //返回值 1 deferred 表示即将位移 2 'posNoChange' 表示已在最佳位置 3 'tooFar' 表示距离最佳位置太远
  410. //后两种都代表停在原位
  411. },
  412. comeTo(o = {}) {
  413. //飞到某个点 暂时没写全景模式
  414. let deferred = $.Deferred();
  415. viewer.scene.view.setView(
  416. $.extend({}, o, {
  417. duration: o.dur,
  418. callback: () => {
  419. o.callback && o.callback();
  420. deferred.resolve(true);
  421. },
  422. }));
  423. return deferred.promise();
  424. },
  425. /**
  426. * 开始测量
  427. */
  428. startMeasure(type, unit) {
  429. const bus = mitt();
  430. let info = getMeasureType(type, unit);
  431. //info.bus = bus
  432. let measure = viewer.measuringTool.startInsertion(
  433. info,
  434. () => {
  435. //done:
  436. bus.emit("end", ret); //完成
  437. },
  438. () => {
  439. //cancel
  440. bus.emit("quit", ret); //删除
  441. });
  442. Potree.Log("startMeasure: " + measure.id, {
  443. font: {
  444. color: "#00c7b2"
  445. },
  446. });
  447. viewer.setPointStandardMat(true);
  448. const ret = {
  449. bus,
  450. type,
  451. object: measure,
  452. ...getMeasureFunction(measure, bus),
  453. };
  454. measure.addEventListener("intersectNoPointcloud", () => {
  455. bus.emit("invalidPoint");
  456. });
  457. measure.addEventListener("firstClick", () => {
  458. bus.emit("firstClickMarker");
  459. });
  460. return ret;
  461. },
  462. quitMeasure() {
  463. viewer.setPointStandardMat(false);
  464. },
  465. /**
  466. * 绘画测量点
  467. */
  468. drawMeasure(
  469. type,
  470. unit,
  471. points,
  472. datasetId,
  473. dataset_points,
  474. points_datasets,
  475. sid) {
  476. const bus = mitt();
  477. let info = getMeasureType(type, unit);
  478. info.points = points;
  479. //info.datasetId = datasetId;
  480. info.dataset_points = dataset_points;
  481. info.points_datasets = points_datasets;
  482. info.sid = sid;
  483. info.bus = bus;
  484. let measure = viewer.measuringTool.createMeasureFromData(info);
  485. Potree.Log("drawMeasure由数据新建: " + measure.id, {
  486. font: {
  487. color: "#00c7b2"
  488. },
  489. });
  490. //console.log(info)
  491. const ret = {
  492. // 退出测量模式,清除之前操作
  493. object: measure,
  494. bus,
  495. ...getMeasureFunction(measure, bus),
  496. };
  497. return ret;
  498. },
  499. // 开启放大镜
  500. openMagnifier() {
  501. viewer.magnifier.dispatchEvent({
  502. type: "setEnable",
  503. value: true
  504. });
  505. },
  506. // 关闭放大镜
  507. closeMagnifier() {
  508. viewer.magnifier.dispatchEvent({
  509. type: "setEnable",
  510. value: false
  511. });
  512. },
  513. changePointDensity(levelType) {
  514. //点云密度:低中高
  515. Potree.settings.UserPointDensity = levelType;
  516. return {
  517. percent: Potree.config.pointDensity[levelType].maxLevelPercent,
  518. }; //回调需要更改密度百分比滑动条
  519. },
  520. changeDensityPercent(percent) {
  521. //点云密度百分比(细节) percent : 0-1
  522. //console.log('changeDensityPercent ', percent) //有出现过首次加载大于1的情况???
  523. Potree.settings.UserDensityPercent = percent;
  524. viewer.setPointLevels();
  525. },
  526. // 设置far
  527. changeViewRange(num) {
  528. Potree.settings.cameraFar = num;
  529. },
  530. // 设置色彩模式 0 彩色 1 海拔 2 半透明(透明色)
  531. changeColorMode: function (mode) {
  532. const modes = ["rgba", "elevation", "color"];
  533. mode = modes[mode];
  534. //console.log('设置色彩模式 ', mode)
  535. let otherChange = {};
  536. switch (mode) {
  537. case "rgba": //每个点的颜色
  538. otherChange.opacity = 1;
  539. otherChange.size = 0.4 / 4;
  540. break;
  541. case "elevation":
  542. otherChange.opacity = 0.3;
  543. otherChange.size = 0.4 / 4;
  544. break;
  545. case "color": //透明色
  546. //otherChange.color = ''
  547. otherChange.opacity = 0.3;
  548. otherChange.size = 0.4 / 4;
  549. break;
  550. }
  551. viewer.scene.pointclouds.forEach((e) => {
  552. e.material.activeAttributeName = mode;
  553. });
  554. sdk.scene.changePointSize(otherChange.size);
  555. sdk.scene.changePointOpacity(otherChange.opacity);
  556. delete otherChange.color;
  557. return otherChange;
  558. },
  559. // 设置点大小
  560. changePointSize(num) {
  561. viewer.scene.pointclouds.forEach((e) => {
  562. e.changePointSize(num);
  563. });
  564. },
  565. // 设置点透明度
  566. changePointOpacity: function (num) {
  567. //num:0-1 navvis用的是亮度
  568. viewer.scene.pointclouds.forEach((e) => {
  569. e.changePointOpacity(num);
  570. });
  571. },
  572. // 设置点形状 传入参数 1 矩形 2 圆形
  573. changePointShape(shape) {
  574. viewer.scene.pointclouds.forEach((e) => {
  575. e.material.shape =
  576. Potree.PointShape[shape == 1 ? "SQUARE" : "CIRCLE"]; // and PARABOLOID
  577. });
  578. },
  579. // 设置是否强化边缘
  580. changePointEdge(isStrong) {
  581. //console.log('强化边缘', isStrong)
  582. viewer.setEDLEnabled(isStrong);
  583. },
  584. // 设置漫游点位显示
  585. changePanoPoint(show) {
  586. Potree.settings.ifShowMarker = !!show;
  587. },
  588. getDownloadInfo() {
  589. //获取直接下载点云的参数给后台
  590. return viewer.modules.Clip.downloadNoCrop();
  591. },
  592. /* getDataSets() {
  593. //获取所有数据集对象
  594. let datasets = CloneJson(Potree.datasetData);
  595. datasets.forEach((e) => {
  596. var pointcloud = viewer.scene.pointclouds.find( (p) => p.dataset_id == e.id);
  597. e.changeDisplay = function (show) {
  598. Potree.Utils.updateVisible(pointcloud, "datasetSelection", !!show);
  599. pointcloud.panos.forEach((pano) => {
  600. //数据集隐藏时漫游点也隐藏 //还是不隐藏了,仅隐藏点云
  601. Potree.Utils.updateVisible(pano, "pointcloudVisi", show, 0);
  602. });
  603. if (
  604. viewer.modules.SiteModel.editing ||
  605. viewer.modules.Alignment.editing) {
  606. viewer.updateFpVisiDatasets();
  607. }
  608. };
  609. e.changeColor = function (color) {
  610. pointcloud.material.color = color;
  611. };
  612. e.getColor = function () {
  613. return pointcloud.material.color;
  614. };
  615. e.focus = function () {
  616. viewer.modules.Alignment.SplitScreen.focusOnPointCloud(pointcloud);
  617. };
  618. e.flyTo = function () {
  619. return viewer.flyToDataset({
  620. pointcloud
  621. }) || false;
  622. };
  623. e.getAttachPloygon = function () {
  624. //计算完后才会有
  625. return (
  626. pointcloud.belongToEntity && pointcloud.belongToEntity.polygon);
  627. };
  628. });
  629. return datasets;
  630. }, */
  631. screenshot: (width, height) => {
  632. //截图
  633. let meterPerPixel,
  634. isScreenshoting = true;
  635. var {
  636. getImagePromise,
  637. finishPromise
  638. } = viewer.startScreenshot({
  639. type: "default"
  640. },
  641. width,
  642. height);
  643. finishPromise.done(() => {
  644. isScreenshoting = false;
  645. });
  646. if(viewer.mainViewport.camera.type == 'OrthographicCamera'){
  647. meterPerPixel = 1 / viewer.mainViewport.camera.zoom
  648. }
  649. return {finishPromise, meterPerPixel};
  650. },
  651. canTurnToPanoMode(pos) {
  652. /* if(viewer.hasNoPanoDataset){
  653. return
  654. } */
  655. pos = pos ? new THREE.Vector3().copy(pos) : viewer.images360.position;
  656. let pano = viewer.images360.findNearestPano(pos);
  657. if (
  658. pano &&
  659. pano.position.distanceTo(pos) < Potree.config.panoFieldRadius) {
  660. return true;
  661. }
  662. //poschange后会调用这个,如果返回false会变为点云模式,且不会自动变回原先的模式
  663. },
  664. /*
  665. 添加一个方法 单击场景某个位置 返回当前三维坐标, 调用时场景不能漫游与选择直到获取完成
  666. sdk.scene.trackScenePos()
  667. 返回
  668. {
  669. promise: Promise<Pos3D>, //获取的promise, 获取到了返回三维坐标,没获取到返回null
  670. quit: function() //取消获取
  671. }志彬5月15日 14:46 */
  672. trackScenePos(){
  673. let deferred = $.Deferred();
  674. let quit = ()=>{ //取消获取
  675. viewer.removeEventListener('global_click',gotIntersect)
  676. Potree.settings.unableNavigate = false
  677. viewer.controls.setEnable(true)
  678. }
  679. let gotIntersect = (e)=>{
  680. if(e.intersect && e.intersect.location){
  681. console.log('quit', e.intersect.location)
  682. quit()
  683. deferred.resolve(e.intersect.location)
  684. }
  685. }
  686. viewer.addEventListener('global_click',gotIntersect)
  687. Potree.settings.unableNavigate = true
  688. viewer.controls.setEnable(false)
  689. return {
  690. promise: deferred.promise() , //获取的promise, 获取到了返回三维坐标,没获取到返回null
  691. quit
  692. }
  693. },
  694. ...parameter.sceneBus,
  695. },
  696. transformPoint(point, datasetId, dataset_location) {
  697. /* //获取由dataset_location转出的position
  698. var r = datasetId != void 0
  699. ? Potree.Utils.datasetPosTransform({
  700. fromDataset: true,
  701. datasetId,
  702. position: dataset_location,
  703. })
  704. : point;
  705. return r; */
  706. return point
  707. },
  708. // 坐标转换
  709. coordTransform: (originType, pos, targetType, datasetId) => {
  710. // pos 坐标的类型, 当类型为SCREEN时为 { x, y } 其余为 {x, y, z}
  711. if (pos.z == void 0)
  712. pos.z = 0; //否则datasetPosTransform NAN 地理注册
  713. let needMeshLocal;
  714. if (originType == targetType)
  715. return pos;
  716. if (
  717. originType == CoordType.SCENE_SCREEN ||
  718. originType == CoordType.MAP_SCREEN) {
  719. let tool = originType == CoordType.SCENE_SCREEN ? sdk.scene : sdk.map;
  720. let result = tool.getPointByScreen(pos) || {}; //{ position, datasetId, dataset_location }
  721. pos = result.position;
  722. if (!pos)
  723. return;
  724. datasetId = result.datasetId;
  725. originType = CoordType.LOCAL;
  726. }
  727. let pointcloud;
  728. if (datasetId != void 0) {
  729. pointcloud = viewer.scene.pointclouds.find(
  730. (p) => p.dataset_id == datasetId);
  731. }
  732. if (originType == CoordType.MESH_LOCAL) {
  733. pos = Potree.Utils.datasetPosTransform({
  734. fromDataset: true,
  735. pointcloud,
  736. position: pos,
  737. });
  738. originType = CoordType.LOCAL;
  739. }
  740. if (targetType == CoordType.MESH_LOCAL) {
  741. needMeshLocal = true;
  742. targetType = CoordType.LOCAL; //先转化为求CoordType.LOCAL
  743. }
  744. if (originType == targetType) {
  745. //for控制点,获取点云未移动前的坐标值。暂且这么写。
  746. if (needMeshLocal) {
  747. //var invMatrix = new THREE.Matrix4().getInverse(viewer.scene.pointclouds[0].transformMatrix)
  748. pos = Potree.Utils.datasetPosTransform({
  749. toDataset: true,
  750. pointcloud,
  751. position: pos,
  752. });
  753. }
  754. return pos;
  755. }
  756. //先转成lonlat(高德)
  757. switch (originType) {
  758. //EPSG: 4550大地坐标
  759. case CoordType.EPSE:
  760. pos = viewer.transform.lonlatTo4550.inverse(pos);
  761. break;
  762. //Wgs84 经纬度
  763. case CoordType.WGS84: //84转高德
  764. //pos = wgs84ToAMap(pos)
  765. break;
  766. // 本地坐标
  767. case CoordType.LOCAL:
  768. pos = viewer.transform.lonlatToLocal.inverse(pos);
  769. }
  770. // 需要转换成什么类型的坐标
  771. switch (targetType) {
  772. case CoordType.SCENE_SCREEN: // 场景屏幕坐标
  773. pos = sdk.scene.getScreenByPoint(pos);
  774. break;
  775. case CoordType.MAP_SCREEN: // 地图屏幕坐标
  776. pos = sdk.map.getScreenByPoint(pos);
  777. break;
  778. //EPSG: 4550大地坐标
  779. case CoordType.EPSE:
  780. pos = viewer.transform.lonlatTo4550.forward(pos);
  781. break;
  782. //Wgs84 经纬度
  783. case CoordType.WGS84:
  784. //pos = aMapToWgs84(pos)
  785. break;
  786. //本地坐标
  787. case CoordType.LOCAL:
  788. pos = viewer.transform.lonlatToLocal.forward(pos);
  789. }
  790. if (needMeshLocal) {
  791. pos = Potree.Utils.datasetPosTransform({
  792. toDataset: true,
  793. pointcloud,
  794. position: pos,
  795. });
  796. }
  797. return pos;
  798. },
  799. enterMeasurement() {
  800. //进入测量模块
  801. viewer.setLimitFar(false);
  802. },
  803. leaveMeasurement() {
  804. //退出测量模块
  805. viewer.setLimitFar(true);
  806. },
  807. loadModel(info) {
  808. info.moveWithPointcloud = true;
  809. viewer.loadModel(info);
  810. },
  811. };
  812. Potree.sdk = sdk;
  813. return sdk;
  814. };
  815. export default enter;
  816. /*
  817. 热点poi加载到的数据中,pos是错误的,只使用dataset_location
  818. 关于webgl context lost报错:
  819. 已知有一iphoneX在创建shadowMap后才报错。
  820. 所以报错的话很可能是代码中的某一句,去除后就会正常。
  821. */