bruce-cesium 5.7.9 → 5.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bruce-cesium.es5.js +32262 -0
- package/dist/bruce-cesium.es5.js.map +1 -0
- package/dist/bruce-cesium.umd.js +32186 -0
- package/dist/bruce-cesium.umd.js.map +1 -0
- package/dist/lib/bruce-cesium.js +76 -0
- package/dist/lib/bruce-cesium.js.map +1 -0
- package/dist/lib/internal/cesium-utils.js +109 -0
- package/dist/lib/internal/cesium-utils.js.map +1 -0
- package/dist/lib/internal/js-utils.js +22 -0
- package/dist/lib/internal/js-utils.js.map +1 -0
- package/dist/lib/internal/limited-log.js +17 -0
- package/dist/lib/internal/limited-log.js.map +1 -0
- package/dist/lib/rendering/cesium-animated-in-out.js +166 -0
- package/dist/lib/rendering/cesium-animated-in-out.js.map +1 -0
- package/dist/lib/rendering/cesium-animated-property.js +1111 -0
- package/dist/lib/rendering/cesium-animated-property.js.map +1 -0
- package/dist/lib/rendering/entity-gatherer.js +327 -0
- package/dist/lib/rendering/entity-gatherer.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine-model3d.js +689 -0
- package/dist/lib/rendering/entity-render-engine-model3d.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine-point.js +984 -0
- package/dist/lib/rendering/entity-render-engine-point.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine-polygon.js +669 -0
- package/dist/lib/rendering/entity-render-engine-polygon.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine-polyline.js +415 -0
- package/dist/lib/rendering/entity-render-engine-polyline.js.map +1 -0
- package/dist/lib/rendering/entity-render-engine.js +442 -0
- package/dist/lib/rendering/entity-render-engine.js.map +1 -0
- package/dist/lib/rendering/getters/batched-data-getter.js +91 -0
- package/dist/lib/rendering/getters/batched-data-getter.js.map +1 -0
- package/dist/lib/rendering/getters/entity-filter-getter.js +634 -0
- package/dist/lib/rendering/getters/entity-filter-getter.js.map +1 -0
- package/dist/lib/rendering/getters/entity-globe.js +172 -0
- package/dist/lib/rendering/getters/entity-globe.js.map +1 -0
- package/dist/lib/rendering/menu-item-creator.js +354 -0
- package/dist/lib/rendering/menu-item-creator.js.map +1 -0
- package/dist/lib/rendering/menu-item-manager.js +464 -0
- package/dist/lib/rendering/menu-item-manager.js.map +1 -0
- package/dist/lib/rendering/relation-render-engine.js +235 -0
- package/dist/lib/rendering/relation-render-engine.js.map +1 -0
- package/dist/lib/rendering/render-managers/common/cesium-parabola.js +368 -0
- package/dist/lib/rendering/render-managers/common/cesium-parabola.js.map +1 -0
- package/dist/lib/rendering/render-managers/common/entity-label.js +703 -0
- package/dist/lib/rendering/render-managers/common/entity-label.js.map +1 -0
- package/dist/lib/rendering/render-managers/common/point-clustering.js +826 -0
- package/dist/lib/rendering/render-managers/common/point-clustering.js.map +1 -0
- package/dist/lib/rendering/render-managers/common/shared-getters.js +187 -0
- package/dist/lib/rendering/render-managers/common/shared-getters.js.map +1 -0
- package/dist/lib/rendering/render-managers/data-source/data-source-static-csv-manager.js +668 -0
- package/dist/lib/rendering/render-managers/data-source/data-source-static-csv-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/data-source/data-source-static-kml-manager.js +92 -0
- package/dist/lib/rendering/render-managers/data-source/data-source-static-kml-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js +143 -0
- package/dist/lib/rendering/render-managers/entities/entities-datalab-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js +510 -0
- package/dist/lib/rendering/render-managers/entities/entities-ids-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js +717 -0
- package/dist/lib/rendering/render-managers/entities/entities-loaded-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entities-render-manager.js +999 -0
- package/dist/lib/rendering/render-managers/entities/entities-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/entities/entity-render-manager.js +186 -0
- package/dist/lib/rendering/render-managers/entities/entity-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/other/assembly-render-manager.js +226 -0
- package/dist/lib/rendering/render-managers/other/assembly-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/other/google-search-render-manager.js +430 -0
- package/dist/lib/rendering/render-managers/other/google-search-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/other/legacy-relations-render-manager.js +290 -0
- package/dist/lib/rendering/render-managers/other/legacy-relations-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/other/relations-render-manager.js +401 -0
- package/dist/lib/rendering/render-managers/other/relations-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/render-manager.js +276 -0
- package/dist/lib/rendering/render-managers/render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-arb-render-manager.js +356 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-arb-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js +861 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-cad-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js +279 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-entities-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js +104 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-google-photos-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-i3s-render-manager.js +81 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-i3s-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js +378 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-osm-render-manager.js.map +1 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js +140 -0
- package/dist/lib/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.js.map +1 -0
- package/dist/lib/rendering/tile-render-engine.js +1328 -0
- package/dist/lib/rendering/tile-render-engine.js.map +1 -0
- package/dist/lib/rendering/tileset-render-engine.js +588 -0
- package/dist/lib/rendering/tileset-render-engine.js.map +1 -0
- package/dist/lib/rendering/tileset-styler.js +590 -0
- package/dist/lib/rendering/tileset-styler.js.map +1 -0
- package/dist/lib/rendering/view-render-engine.js +1004 -0
- package/dist/lib/rendering/view-render-engine.js.map +1 -0
- package/dist/lib/rendering/visual-register-culler.js +676 -0
- package/dist/lib/rendering/visual-register-culler.js.map +1 -0
- package/dist/lib/rendering/visuals-register.js +1695 -0
- package/dist/lib/rendering/visuals-register.js.map +1 -0
- package/dist/lib/utils/cesium-entity-styler.js +914 -0
- package/dist/lib/utils/cesium-entity-styler.js.map +1 -0
- package/dist/lib/utils/drawing-utils.js +308 -0
- package/dist/lib/utils/drawing-utils.js.map +1 -0
- package/dist/lib/utils/entity-utils.js +1382 -0
- package/dist/lib/utils/entity-utils.js.map +1 -0
- package/dist/lib/utils/measure-utils.js +73 -0
- package/dist/lib/utils/measure-utils.js.map +1 -0
- package/dist/lib/utils/simplify-geometry.js +323 -0
- package/dist/lib/utils/simplify-geometry.js.map +1 -0
- package/dist/lib/utils/view-utils.js +392 -0
- package/dist/lib/utils/view-utils.js.map +1 -0
- package/dist/lib/viewer/cesium-view-monitor.js +393 -0
- package/dist/lib/viewer/cesium-view-monitor.js.map +1 -0
- package/dist/lib/viewer/viewer-event-tracker.js +70 -0
- package/dist/lib/viewer/viewer-event-tracker.js.map +1 -0
- package/dist/lib/viewer/viewer-utils.js +310 -0
- package/dist/lib/viewer/viewer-utils.js.map +1 -0
- package/dist/lib/widgets/common/draw-3d-polygon.js +458 -0
- package/dist/lib/widgets/common/draw-3d-polygon.js.map +1 -0
- package/dist/lib/widgets/common/draw-3d-polyline.js +415 -0
- package/dist/lib/widgets/common/draw-3d-polyline.js.map +1 -0
- package/dist/lib/widgets/common/measure-creator.js +468 -0
- package/dist/lib/widgets/common/measure-creator.js.map +1 -0
- package/dist/lib/widgets/common/walkthrough.js +336 -0
- package/dist/lib/widgets/common/walkthrough.js.map +1 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-fullscreen.js +36 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-fullscreen.js.map +1 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-search.js +437 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar-search.js.map +1 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar.js +38 -0
- package/dist/lib/widgets/controls-view-bar/widget-control-view-bar.js.map +1 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.js +219 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.js.map +1 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-user.js +304 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab-user.js.map +1 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab.js +29 -0
- package/dist/lib/widgets/tabs-left-panel/widget-left-panel-tab.js.map +1 -0
- package/dist/lib/widgets/widget-bookmarks.js +497 -0
- package/dist/lib/widgets/widget-bookmarks.js.map +1 -0
- package/dist/lib/widgets/widget-branding.js +165 -0
- package/dist/lib/widgets/widget-branding.js.map +1 -0
- package/dist/lib/widgets/widget-cursorbar.js +1179 -0
- package/dist/lib/widgets/widget-cursorbar.js.map +1 -0
- package/dist/lib/widgets/widget-embedded-info-view.js +201 -0
- package/dist/lib/widgets/widget-embedded-info-view.js.map +1 -0
- package/dist/lib/widgets/widget-info-view.js +681 -0
- package/dist/lib/widgets/widget-info-view.js.map +1 -0
- package/dist/lib/widgets/widget-left-panel.js +548 -0
- package/dist/lib/widgets/widget-left-panel.js.map +1 -0
- package/dist/lib/widgets/widget-nav-compass.js +469 -0
- package/dist/lib/widgets/widget-nav-compass.js.map +1 -0
- package/dist/lib/widgets/widget-view-bar.js +284 -0
- package/dist/lib/widgets/widget-view-bar.js.map +1 -0
- package/dist/lib/widgets/widget.js +66 -0
- package/dist/lib/widgets/widget.js.map +1 -0
- package/dist/types/bruce-cesium.d.ts +58 -0
- package/dist/types/internal/cesium-utils.d.ts +23 -0
- package/dist/types/internal/js-utils.d.ts +8 -0
- package/dist/types/internal/limited-log.d.ts +6 -0
- package/dist/types/rendering/cesium-animated-in-out.d.ts +12 -0
- package/dist/types/rendering/cesium-animated-property.d.ts +245 -0
- package/dist/types/rendering/entity-gatherer.d.ts +36 -0
- package/dist/types/rendering/entity-render-engine-model3d.d.ts +56 -0
- package/dist/types/rendering/entity-render-engine-point.d.ts +73 -0
- package/dist/types/rendering/entity-render-engine-polygon.d.ts +26 -0
- package/dist/types/rendering/entity-render-engine-polyline.d.ts +47 -0
- package/dist/types/rendering/entity-render-engine.d.ts +108 -0
- package/dist/types/rendering/getters/batched-data-getter.d.ts +28 -0
- package/dist/types/rendering/getters/entity-filter-getter.d.ts +104 -0
- package/dist/types/rendering/getters/entity-globe.d.ts +21 -0
- package/dist/types/rendering/menu-item-creator.d.ts +53 -0
- package/dist/types/rendering/menu-item-manager.d.ts +85 -0
- package/dist/types/rendering/relation-render-engine.d.ts +32 -0
- package/dist/types/rendering/render-managers/common/cesium-parabola.d.ts +39 -0
- package/dist/types/rendering/render-managers/common/entity-label.d.ts +82 -0
- package/dist/types/rendering/render-managers/common/point-clustering.d.ts +91 -0
- package/dist/types/rendering/render-managers/common/shared-getters.d.ts +41 -0
- package/dist/types/rendering/render-managers/data-source/data-source-static-csv-manager.d.ts +41 -0
- package/dist/types/rendering/render-managers/data-source/data-source-static-kml-manager.d.ts +25 -0
- package/dist/types/rendering/render-managers/entities/entities-datalab-render-manager.d.ts +31 -0
- package/dist/types/rendering/render-managers/entities/entities-ids-render-manager.d.ts +76 -0
- package/dist/types/rendering/render-managers/entities/entities-loaded-render-manager.d.ts +90 -0
- package/dist/types/rendering/render-managers/entities/entities-render-manager.d.ts +90 -0
- package/dist/types/rendering/render-managers/entities/entity-render-manager.d.ts +42 -0
- package/dist/types/rendering/render-managers/other/assembly-render-manager.d.ts +38 -0
- package/dist/types/rendering/render-managers/other/google-search-render-manager.d.ts +45 -0
- package/dist/types/rendering/render-managers/other/legacy-relations-render-manager.d.ts +60 -0
- package/dist/types/rendering/render-managers/other/relations-render-manager.d.ts +53 -0
- package/dist/types/rendering/render-managers/render-manager.d.ts +30 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-arb-render-manager.d.ts +37 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-cad-render-manager.d.ts +86 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-entities-render-manager.d.ts +41 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-google-photos-render-manager.d.ts +26 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-i3s-render-manager.d.ts +25 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-osm-render-manager.d.ts +48 -0
- package/dist/types/rendering/render-managers/tilesets/tileset-pointcloud-render-manager.d.ts +27 -0
- package/dist/types/rendering/tile-render-engine.d.ts +80 -0
- package/dist/types/rendering/tileset-render-engine.d.ts +99 -0
- package/dist/types/rendering/tileset-styler.d.ts +86 -0
- package/dist/types/rendering/view-render-engine.d.ts +32 -0
- package/dist/types/rendering/visual-register-culler.d.ts +18 -0
- package/dist/types/rendering/visuals-register.d.ts +351 -0
- package/dist/types/utils/cesium-entity-styler.d.ts +103 -0
- package/dist/types/utils/drawing-utils.d.ts +59 -0
- package/dist/types/utils/entity-utils.d.ts +133 -0
- package/dist/types/utils/measure-utils.d.ts +20 -0
- package/dist/types/utils/simplify-geometry.d.ts +19 -0
- package/dist/types/utils/view-utils.d.ts +101 -0
- package/dist/types/viewer/cesium-view-monitor.d.ts +35 -0
- package/dist/types/viewer/viewer-event-tracker.d.ts +47 -0
- package/dist/types/viewer/viewer-utils.d.ts +88 -0
- package/dist/types/widgets/common/draw-3d-polygon.d.ts +62 -0
- package/dist/types/widgets/common/draw-3d-polyline.d.ts +50 -0
- package/dist/types/widgets/common/measure-creator.d.ts +60 -0
- package/dist/types/widgets/common/walkthrough.d.ts +37 -0
- package/dist/types/widgets/controls-view-bar/widget-control-view-bar-fullscreen.d.ts +10 -0
- package/dist/types/widgets/controls-view-bar/widget-control-view-bar-search.d.ts +18 -0
- package/dist/types/widgets/controls-view-bar/widget-control-view-bar.d.ts +23 -0
- package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab-bookmarks.d.ts +11 -0
- package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab-user.d.ts +24 -0
- package/dist/types/widgets/tabs-left-panel/widget-left-panel-tab.d.ts +17 -0
- package/dist/types/widgets/widget-bookmarks.d.ts +40 -0
- package/dist/types/widgets/widget-branding.d.ts +15 -0
- package/dist/types/widgets/widget-cursorbar.d.ts +48 -0
- package/dist/types/widgets/widget-embedded-info-view.d.ts +13 -0
- package/dist/types/widgets/widget-info-view.d.ts +21 -0
- package/dist/types/widgets/widget-left-panel.d.ts +73 -0
- package/dist/types/widgets/widget-nav-compass.d.ts +27 -0
- package/dist/types/widgets/widget-view-bar.d.ts +37 -0
- package/dist/types/widgets/widget.d.ts +29 -0
- package/package.json +1 -1
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataSourceStaticCsvManager = void 0;
|
|
4
|
+
const bruce_models_1 = require("bruce-models");
|
|
5
|
+
const Cesium = require("cesium");
|
|
6
|
+
const bruce_cesium_1 = require("src/bruce-cesium");
|
|
7
|
+
/**
|
|
8
|
+
* Made for a POC experiment.
|
|
9
|
+
* Do not use without reviewing the purpose and settings of the Menu Item.
|
|
10
|
+
*/
|
|
11
|
+
var DataSourceStaticCsvManager;
|
|
12
|
+
(function (DataSourceStaticCsvManager) {
|
|
13
|
+
class Manager {
|
|
14
|
+
get Disposed() {
|
|
15
|
+
return this.disposed;
|
|
16
|
+
}
|
|
17
|
+
get DataSources() {
|
|
18
|
+
return this.dataSource ? [this.dataSource] : [];
|
|
19
|
+
}
|
|
20
|
+
get CzmlDataInputs() {
|
|
21
|
+
return this.czmlDataInputs;
|
|
22
|
+
}
|
|
23
|
+
constructor(params) {
|
|
24
|
+
this.disposed = false;
|
|
25
|
+
this.czmlDataInputs = [];
|
|
26
|
+
// Array of callbacks to remove from the clock tick event.
|
|
27
|
+
this.tickRemovals = [];
|
|
28
|
+
const { viewer, apiGetter, item, register } = params;
|
|
29
|
+
this.viewer = viewer;
|
|
30
|
+
this.apiGetter = apiGetter;
|
|
31
|
+
this.item = item;
|
|
32
|
+
this.register = register;
|
|
33
|
+
}
|
|
34
|
+
Init() {
|
|
35
|
+
let files = this.item.CSV;
|
|
36
|
+
if (!files) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!Array.isArray(files)) {
|
|
40
|
+
files = [files];
|
|
41
|
+
}
|
|
42
|
+
(async () => {
|
|
43
|
+
var _a;
|
|
44
|
+
const api = this.apiGetter.getApi();
|
|
45
|
+
await api.Loading;
|
|
46
|
+
if (this.disposed) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
await this.renderMovingItem();
|
|
51
|
+
if (this.disposed) {
|
|
52
|
+
if (!((_a = this.viewer) === null || _a === void 0 ? void 0 : _a.isDestroyed()) && this.dataSource && this.viewer.dataSources.contains(this.dataSource)) {
|
|
53
|
+
this.viewer.dataSources.remove(this.dataSource);
|
|
54
|
+
this.dataSource = null;
|
|
55
|
+
this.viewer.scene.requestRender();
|
|
56
|
+
}
|
|
57
|
+
if (this.tickRemovals.length) {
|
|
58
|
+
this.tickRemovals.forEach(removal => removal());
|
|
59
|
+
this.tickRemovals = [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
console.error(e);
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Takes a set of CSV files and renders the collection as a single moving item (truck, car, etc).
|
|
70
|
+
* This will try to find which is the primary source of point data, and complimentary sources of attribute information.
|
|
71
|
+
* @param files
|
|
72
|
+
*/
|
|
73
|
+
async renderMovingItem() {
|
|
74
|
+
var _a;
|
|
75
|
+
const api = this.apiGetter.getApi();
|
|
76
|
+
await api.Loading;
|
|
77
|
+
let vehicleFileUrl;
|
|
78
|
+
let alarmFileUrl;
|
|
79
|
+
let lineColor;
|
|
80
|
+
let vehicleEntityId;
|
|
81
|
+
const fileStrings = [];
|
|
82
|
+
const files = this.item.CSV;
|
|
83
|
+
for (let i = 0; i < files.length; i++) {
|
|
84
|
+
const file = files[i];
|
|
85
|
+
const fileId = (_a = file === null || file === void 0 ? void 0 : file.ClientFile) === null || _a === void 0 ? void 0 : _a.ID;
|
|
86
|
+
const externalURL = file === null || file === void 0 ? void 0 : file.fileUrl;
|
|
87
|
+
if (!fileId && !externalURL) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
let fileUrl;
|
|
91
|
+
if (fileId) {
|
|
92
|
+
fileUrl = bruce_models_1.ClientFile.GetUrl({
|
|
93
|
+
api,
|
|
94
|
+
fileId,
|
|
95
|
+
viaCdn: true
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else if (externalURL) {
|
|
99
|
+
fileUrl = externalURL;
|
|
100
|
+
}
|
|
101
|
+
const fileStr = await (await fetch(fileUrl)).text();
|
|
102
|
+
fileStrings.push(fileStr);
|
|
103
|
+
if (this.disposed) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (file.vehicleFileId) {
|
|
107
|
+
vehicleFileUrl = bruce_models_1.ClientFile.GetUrl({
|
|
108
|
+
api,
|
|
109
|
+
fileId: file.vehicleFileId,
|
|
110
|
+
viaCdn: true
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
if (file.lineColor) {
|
|
114
|
+
lineColor = file.lineColor;
|
|
115
|
+
}
|
|
116
|
+
if (file.alertFileId) {
|
|
117
|
+
alarmFileUrl = bruce_models_1.ClientFile.GetUrl({
|
|
118
|
+
api,
|
|
119
|
+
fileId: file.alertFileId,
|
|
120
|
+
viaCdn: true
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (file.vehicleEntityId) {
|
|
124
|
+
vehicleEntityId = file.vehicleEntityId;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// We'll run through and turn the fileStrings into an array of objects that represent the CSV data.
|
|
128
|
+
// Each file string is the text of a CSV file.
|
|
129
|
+
const csvData = [];
|
|
130
|
+
for (let i = 0; i < fileStrings.length; i++) {
|
|
131
|
+
const delimiter = ",";
|
|
132
|
+
const fileStr = fileStrings[i];
|
|
133
|
+
const headers = fileStr.slice(0, fileStr.indexOf("\n")).split(delimiter).map(header => header.trim());
|
|
134
|
+
const rows = fileStr.slice(fileStr.indexOf("\n") + 1).split("\n");
|
|
135
|
+
const rowsArr = [];
|
|
136
|
+
for (let j = 0; j < rows.length; j++) {
|
|
137
|
+
const row = rows[j];
|
|
138
|
+
const rowArr = row.split(delimiter).map(item => item.trim());
|
|
139
|
+
if (rowArr.length === 1 && rowArr[0] === "") {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
rowsArr.push(rowArr);
|
|
143
|
+
}
|
|
144
|
+
csvData.push({
|
|
145
|
+
headers,
|
|
146
|
+
rows: rowsArr
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// TODO. Find one with lat/lon/dateTime values instead of just taking first one.
|
|
150
|
+
const primary = csvData[0];
|
|
151
|
+
const pHeaders = primary.headers;
|
|
152
|
+
const pLatIndex = pHeaders.findIndex(x => x.toLowerCase().includes("lat"));
|
|
153
|
+
const pLonIndex = pHeaders.findIndex(x => x.toLowerCase().includes("lon"));
|
|
154
|
+
const pDateTimeIndex = pHeaders.findIndex(x => x.toLowerCase().includes("date"));
|
|
155
|
+
// Ensure values are correct data types.
|
|
156
|
+
for (let i = 0; i < primary.rows.length; i++) {
|
|
157
|
+
const row = primary.rows[i];
|
|
158
|
+
const lat = row[pLatIndex];
|
|
159
|
+
if (typeof lat == "string") {
|
|
160
|
+
row[pLatIndex] = parseFloat(lat);
|
|
161
|
+
}
|
|
162
|
+
const lon = row[pLonIndex];
|
|
163
|
+
if (typeof lon == "string") {
|
|
164
|
+
row[pLonIndex] = parseFloat(lon);
|
|
165
|
+
}
|
|
166
|
+
const dateTimeStr = row[pDateTimeIndex];
|
|
167
|
+
if (typeof dateTimeStr === "string") {
|
|
168
|
+
let utcDate;
|
|
169
|
+
// Dates are assumed to be in UTC.
|
|
170
|
+
// Check for the format: `2023/12/24 04:15:00.743`.
|
|
171
|
+
if (dateTimeStr.includes("/") && dateTimeStr.includes(":")) {
|
|
172
|
+
const [datePart, timePart] = dateTimeStr.split(" ");
|
|
173
|
+
const [year, month, day] = datePart.split("/").map(Number);
|
|
174
|
+
const [hours, minutes, seconds] = timePart.split(":").map(Number);
|
|
175
|
+
const milliseconds = seconds % 1 * 1000; // Extract milliseconds
|
|
176
|
+
utcDate = new Date(Date.UTC(year, month - 1, day, hours, minutes, Math.floor(seconds), milliseconds));
|
|
177
|
+
}
|
|
178
|
+
// Check for the format: `24-12-2023 4:15:12 AM`.
|
|
179
|
+
else if (dateTimeStr.includes("-") && dateTimeStr.includes(":") && (dateTimeStr.includes("AM") || dateTimeStr.includes("PM"))) {
|
|
180
|
+
const convertTo24HourFormat = (dateTimeStr) => {
|
|
181
|
+
const [datePart, timePart, meridian] = dateTimeStr.split(/[: ]+/);
|
|
182
|
+
let [hours, minutes, seconds] = timePart.split(":").map(Number);
|
|
183
|
+
if (meridian === 'PM' && hours < 12) {
|
|
184
|
+
hours += 12;
|
|
185
|
+
}
|
|
186
|
+
if (meridian === 'AM' && hours === 12) {
|
|
187
|
+
hours = 0;
|
|
188
|
+
}
|
|
189
|
+
return `${datePart} ${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
|
|
190
|
+
};
|
|
191
|
+
// Convert to 24-hour format before parsing.
|
|
192
|
+
const dateTime24hr = convertTo24HourFormat(dateTimeStr);
|
|
193
|
+
const [datePart, timePart] = dateTime24hr.split(" ");
|
|
194
|
+
const [day, month, year] = datePart.split("-").map(Number);
|
|
195
|
+
const [hours, minutes, seconds] = timePart.split(":").map(Number);
|
|
196
|
+
utcDate = new Date(Date.UTC(year, month - 1, day, hours, minutes, seconds));
|
|
197
|
+
}
|
|
198
|
+
// Format: `2023-12-24 04:19:17.196`.
|
|
199
|
+
else if (dateTimeStr.includes("-") && dateTimeStr.includes(":")) {
|
|
200
|
+
const [datePart, timePart] = dateTimeStr.split(" ");
|
|
201
|
+
const [year, month, day] = datePart.split("-").map(Number);
|
|
202
|
+
const [hours, minutes, seconds] = timePart.split(":").map(Number);
|
|
203
|
+
utcDate = new Date(Date.UTC(year, month - 1, day, hours, minutes, seconds));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// Fallback to parsing in local time.
|
|
207
|
+
utcDate = new Date(dateTimeStr);
|
|
208
|
+
}
|
|
209
|
+
row[pDateTimeIndex] = utcDate.toISOString();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Sort by date.
|
|
213
|
+
primary.rows.sort((a, b) => {
|
|
214
|
+
const aDate = new Date(a[pDateTimeIndex]);
|
|
215
|
+
const bDate = new Date(b[pDateTimeIndex]);
|
|
216
|
+
return aDate.getTime() - bDate.getTime();
|
|
217
|
+
});
|
|
218
|
+
const vehicleCesiumId = bruce_models_1.ObjectUtils.UId();
|
|
219
|
+
const { czml, entityMapping } = createJourneyCzml(vehicleCesiumId, vehicleFileUrl, alarmFileUrl, lineColor, primary);
|
|
220
|
+
this.czmlDataInputs.push(czml);
|
|
221
|
+
// Dereference czml and remove clock property.
|
|
222
|
+
// We do this so our apps can reference the property and manage the clock themselves.
|
|
223
|
+
const czmlAdjusted = JSON.parse(JSON.stringify(czml));
|
|
224
|
+
czmlAdjusted.forEach((item) => {
|
|
225
|
+
delete item.clock;
|
|
226
|
+
});
|
|
227
|
+
// Get current cesium dateTime.
|
|
228
|
+
const curSettings = bruce_cesium_1.ViewUtils.GetTimeDetails({
|
|
229
|
+
viewer: this.viewer
|
|
230
|
+
});
|
|
231
|
+
const source = await this.viewer.dataSources.add(Cesium.CzmlDataSource.load(czmlAdjusted));
|
|
232
|
+
this.dataSource = source;
|
|
233
|
+
// Reset back to the previous dateTime.
|
|
234
|
+
// Adding the czml data source will have changed the clock.
|
|
235
|
+
bruce_cesium_1.ViewUtils.SetTimeDetails({
|
|
236
|
+
viewer: this.viewer,
|
|
237
|
+
isAnimating: curSettings.isAnimating,
|
|
238
|
+
animationSpeed: curSettings.animationSpeed,
|
|
239
|
+
currentTimeIso: curSettings.currentTimeIso,
|
|
240
|
+
startTimeIso: curSettings.startTimeIso,
|
|
241
|
+
stopTimeIso: curSettings.stopTimeIso
|
|
242
|
+
});
|
|
243
|
+
// Listen to update ticks and ensure orientation of moving item is correct.
|
|
244
|
+
if (this.viewer.clock) {
|
|
245
|
+
const pHeadingIndex = pHeaders.findIndex(x => x.toLowerCase().includes("head"));
|
|
246
|
+
let errorsInARow = 0;
|
|
247
|
+
const removal = this.viewer.clock.onTick.addEventListener(() => {
|
|
248
|
+
const vehicle = source.entities.getById(vehicleCesiumId);
|
|
249
|
+
if (vehicle) {
|
|
250
|
+
try {
|
|
251
|
+
updateOrientation(primary.rows, pHeadingIndex, pDateTimeIndex, this.viewer, vehicle);
|
|
252
|
+
errorsInARow = 0;
|
|
253
|
+
}
|
|
254
|
+
catch (e) {
|
|
255
|
+
console.error(e);
|
|
256
|
+
errorsInARow += 1;
|
|
257
|
+
if (errorsInARow >= 3) {
|
|
258
|
+
removal();
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
this.viewer.scene.requestRender();
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
this.tickRemovals.push(removal);
|
|
265
|
+
// Register vehicle rego.
|
|
266
|
+
if (vehicleEntityId) {
|
|
267
|
+
const vehicleEntity = source.entities.getById(vehicleCesiumId);
|
|
268
|
+
if (vehicleEntity) {
|
|
269
|
+
this.register.AddRego({
|
|
270
|
+
rego: {
|
|
271
|
+
canEdit: false,
|
|
272
|
+
entityId: vehicleEntityId,
|
|
273
|
+
menuItemId: this.item.id,
|
|
274
|
+
menuItemType: this.item.Type,
|
|
275
|
+
priority: 0,
|
|
276
|
+
visual: vehicleEntity,
|
|
277
|
+
accountId: this.apiGetter.accountId,
|
|
278
|
+
cdn: false,
|
|
279
|
+
overrideShow: true
|
|
280
|
+
},
|
|
281
|
+
requestRender: false
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// Register alarms (and any other Entities that were created).
|
|
286
|
+
const cesiumEntityIds = Object.keys(entityMapping);
|
|
287
|
+
for (let i = 0; i < cesiumEntityIds.length; i++) {
|
|
288
|
+
const cesiumEntityId = cesiumEntityIds[i];
|
|
289
|
+
const entity = source.entities.getById(cesiumEntityId);
|
|
290
|
+
if (entity) {
|
|
291
|
+
const nextspaceEntityId = entityMapping[cesiumEntityId];
|
|
292
|
+
if (nextspaceEntityId) {
|
|
293
|
+
this.register.AddRego({
|
|
294
|
+
rego: {
|
|
295
|
+
canEdit: false,
|
|
296
|
+
entityId: nextspaceEntityId,
|
|
297
|
+
menuItemId: this.item.id,
|
|
298
|
+
menuItemType: this.item.Type,
|
|
299
|
+
priority: 0,
|
|
300
|
+
visual: entity,
|
|
301
|
+
accountId: this.apiGetter.accountId,
|
|
302
|
+
cdn: false,
|
|
303
|
+
overrideShow: true
|
|
304
|
+
},
|
|
305
|
+
requestRender: false
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
Dispose() {
|
|
313
|
+
var _a;
|
|
314
|
+
if (this.disposed) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
this.disposed = true;
|
|
318
|
+
if (!((_a = this.viewer) === null || _a === void 0 ? void 0 : _a.isDestroyed())) {
|
|
319
|
+
if (this.dataSource && this.viewer.dataSources.contains(this.dataSource)) {
|
|
320
|
+
this.viewer.dataSources.remove(this.dataSource);
|
|
321
|
+
this.dataSource = null;
|
|
322
|
+
this.viewer.scene.requestRender();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (this.tickRemovals.length) {
|
|
326
|
+
this.tickRemovals.forEach(removal => removal());
|
|
327
|
+
this.tickRemovals = [];
|
|
328
|
+
}
|
|
329
|
+
this.register.RemoveRegos({
|
|
330
|
+
menuItemId: this.item.id,
|
|
331
|
+
doUpdate: false,
|
|
332
|
+
requestRender: false
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
async ReRender(params) {
|
|
336
|
+
const { entityIds, force } = params;
|
|
337
|
+
if (entityIds == null) {
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
DataSourceStaticCsvManager.Manager = Manager;
|
|
344
|
+
})(DataSourceStaticCsvManager = exports.DataSourceStaticCsvManager || (exports.DataSourceStaticCsvManager = {}));
|
|
345
|
+
/**
|
|
346
|
+
* Creates a CZML object from the CSV data.
|
|
347
|
+
* This shows a journey taken by a moving object and alarms detected along the way.
|
|
348
|
+
* @param vehicleId
|
|
349
|
+
* @param vehicleFileUrl
|
|
350
|
+
* @param alarmFileUrl
|
|
351
|
+
* @param lineColor
|
|
352
|
+
* @param data
|
|
353
|
+
* @returns
|
|
354
|
+
*/
|
|
355
|
+
function createJourneyCzml(vehicleId, vehicleFileUrl, alarmFileUrl, lineColor, data) {
|
|
356
|
+
const headers = data.headers;
|
|
357
|
+
const rows = data.rows;
|
|
358
|
+
const latIndex = headers.findIndex(x => x.toLowerCase().includes("lat"));
|
|
359
|
+
const lonIndex = headers.findIndex(x => x.toLowerCase().includes("lon"));
|
|
360
|
+
const dateTimeIndex = headers.findIndex(x => x.toLowerCase().includes("date"));
|
|
361
|
+
const alarmIndex = headers.findIndex(x => x.toLowerCase().includes("alarm"));
|
|
362
|
+
const entityIdIndex = headers.findIndex((x, i) => {
|
|
363
|
+
if (i === latIndex || i === lonIndex || i === dateTimeIndex || i === alarmIndex) {
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
const lower = x.toLowerCase();
|
|
367
|
+
return lower.includes("entityid") || lower.includes("bruce") || lower.includes("nextspace");
|
|
368
|
+
});
|
|
369
|
+
// Map between Cesium Entity ID and Nextspace Entity ID.
|
|
370
|
+
// This is returned to the caller so they can map between the two.
|
|
371
|
+
const entityMapping = {};
|
|
372
|
+
const czml = [
|
|
373
|
+
{
|
|
374
|
+
"id": "document",
|
|
375
|
+
"name": "Journey",
|
|
376
|
+
"version": "1.0",
|
|
377
|
+
"clock": {
|
|
378
|
+
"interval": rows[0][dateTimeIndex] + "/" + rows[rows.length - 1][dateTimeIndex],
|
|
379
|
+
"currentTime": rows[0][dateTimeIndex],
|
|
380
|
+
"multiplier": 10,
|
|
381
|
+
"range": "LOOP_STOP",
|
|
382
|
+
"step": "SYSTEM_CLOCK_MULTIPLIER"
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
];
|
|
386
|
+
const SEGMENTED = true;
|
|
387
|
+
// Create a polyline for the full path.
|
|
388
|
+
// If segmented we'll break it into pieces and display each piece based on relative time to the cesium viewer clock.
|
|
389
|
+
if (SEGMENTED) {
|
|
390
|
+
// Calculate the total duration of the journey in milliseconds.
|
|
391
|
+
const totalDuration = new Date(rows[rows.length - 1][dateTimeIndex]).getTime() - new Date(rows[0][dateTimeIndex]).getTime();
|
|
392
|
+
// Percentage of the journey to be visible before and after each point.
|
|
393
|
+
const visibilityPercentage = 0.05; // 5%
|
|
394
|
+
const visibilityDuration = totalDuration * visibilityPercentage;
|
|
395
|
+
rows.forEach((row, index) => {
|
|
396
|
+
const time = new Date(row[dateTimeIndex]).getTime();
|
|
397
|
+
const startTime = new Date(time - visibilityDuration / 2).toISOString();
|
|
398
|
+
const endTime = new Date(time + visibilityDuration / 2).toISOString();
|
|
399
|
+
const position = [
|
|
400
|
+
Number(row[lonIndex]),
|
|
401
|
+
Number(row[latIndex]),
|
|
402
|
+
0
|
|
403
|
+
];
|
|
404
|
+
if (index < rows.length - 1) {
|
|
405
|
+
const nextRow = rows[index + 1];
|
|
406
|
+
const nextPosition = [
|
|
407
|
+
Number(nextRow[lonIndex]),
|
|
408
|
+
Number(nextRow[latIndex]),
|
|
409
|
+
0
|
|
410
|
+
];
|
|
411
|
+
czml.push({
|
|
412
|
+
"id": "segment-" + bruce_models_1.ObjectUtils.UId(),
|
|
413
|
+
"name": "Path Segment",
|
|
414
|
+
"availability": startTime + "/" + endTime,
|
|
415
|
+
"polyline": {
|
|
416
|
+
"clampToGround": true,
|
|
417
|
+
"positions": {
|
|
418
|
+
"cartographicDegrees": position.concat(nextPosition)
|
|
419
|
+
},
|
|
420
|
+
"material": {
|
|
421
|
+
"solidColor": {
|
|
422
|
+
"color": {
|
|
423
|
+
"rgba": lineColor ? Cesium.Color.fromCssColorString(lineColor).toBytes() : [0, 255, 0, 100]
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
},
|
|
427
|
+
"width": 5
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
// Alarm points.
|
|
433
|
+
rows.filter(row => row[alarmIndex]).forEach((row, index) => {
|
|
434
|
+
const alarmTime = new Date(row[dateTimeIndex]).getTime();
|
|
435
|
+
const startTime = new Date(alarmTime - visibilityDuration / 2).toISOString();
|
|
436
|
+
const endTime = new Date(alarmTime + visibilityDuration / 2).toISOString();
|
|
437
|
+
const alarmCesiumId = bruce_models_1.ObjectUtils.UId();
|
|
438
|
+
czml.push({
|
|
439
|
+
"id": alarmCesiumId,
|
|
440
|
+
"name": "Alarm",
|
|
441
|
+
"availability": startTime + "/" + endTime,
|
|
442
|
+
"position": {
|
|
443
|
+
"cartographicDegrees": [
|
|
444
|
+
Number(row[lonIndex]),
|
|
445
|
+
Number(row[latIndex]),
|
|
446
|
+
5
|
|
447
|
+
]
|
|
448
|
+
},
|
|
449
|
+
"point": !alarmFileUrl ? {
|
|
450
|
+
"pixelSize": 10,
|
|
451
|
+
"color": {
|
|
452
|
+
"rgba": [255, 0, 0, 255]
|
|
453
|
+
},
|
|
454
|
+
"heightReference": "CLAMP_TO_GROUND"
|
|
455
|
+
} : undefined,
|
|
456
|
+
"billboard": alarmFileUrl ? {
|
|
457
|
+
"image": alarmFileUrl,
|
|
458
|
+
"scale": 1,
|
|
459
|
+
"pixelOffset": {
|
|
460
|
+
"cartesian2": [0, 0]
|
|
461
|
+
},
|
|
462
|
+
"heightReference": "CLAMP_TO_GROUND"
|
|
463
|
+
} : undefined
|
|
464
|
+
});
|
|
465
|
+
const entityId = entityIdIndex > -1 ? row[entityIdIndex] : null;
|
|
466
|
+
if (entityId) {
|
|
467
|
+
entityMapping[alarmCesiumId] = String(entityId);
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
const roadPositions = rows.map(row => {
|
|
473
|
+
const position = [
|
|
474
|
+
Number(row[lonIndex]),
|
|
475
|
+
Number(row[latIndex]),
|
|
476
|
+
0
|
|
477
|
+
];
|
|
478
|
+
return position;
|
|
479
|
+
}).flat();
|
|
480
|
+
czml.push({
|
|
481
|
+
"id": bruce_models_1.ObjectUtils.UId(),
|
|
482
|
+
"name": "Path",
|
|
483
|
+
"polyline": {
|
|
484
|
+
"clampToGround": true,
|
|
485
|
+
"positions": {
|
|
486
|
+
"cartographicDegrees": roadPositions
|
|
487
|
+
},
|
|
488
|
+
"material": {
|
|
489
|
+
"solidColor": {
|
|
490
|
+
"color": {
|
|
491
|
+
"rgba": lineColor ? Cesium.Color.fromCssColorString(lineColor).toBytes() : [0, 255, 0, 100]
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
},
|
|
495
|
+
"width": 5
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
// Alarm points.
|
|
499
|
+
rows.filter(row => row[alarmIndex]).forEach((row, index) => {
|
|
500
|
+
const position = [
|
|
501
|
+
Number(row[lonIndex]),
|
|
502
|
+
Number(row[latIndex]),
|
|
503
|
+
0
|
|
504
|
+
];
|
|
505
|
+
czml.push({
|
|
506
|
+
"id": bruce_models_1.ObjectUtils.UId(),
|
|
507
|
+
"name": "Alarm",
|
|
508
|
+
"position": {
|
|
509
|
+
"cartographicDegrees": position
|
|
510
|
+
},
|
|
511
|
+
"point": !alarmFileUrl ? {
|
|
512
|
+
"heightReference": "CLAMP_TO_GROUND",
|
|
513
|
+
"pixelSize": 10,
|
|
514
|
+
"color": {
|
|
515
|
+
"rgba": [255, 0, 0, 255]
|
|
516
|
+
}
|
|
517
|
+
} : undefined,
|
|
518
|
+
"billboard": alarmFileUrl ? {
|
|
519
|
+
"heightReference": "CLAMP_TO_GROUND",
|
|
520
|
+
"image": alarmFileUrl,
|
|
521
|
+
"scale": 1,
|
|
522
|
+
"pixelOffset": {
|
|
523
|
+
"cartesian2": [0, 0]
|
|
524
|
+
}
|
|
525
|
+
} : undefined,
|
|
526
|
+
/*
|
|
527
|
+
"label": {
|
|
528
|
+
"text": row[alarmIndex],
|
|
529
|
+
"show": true,
|
|
530
|
+
"font": "11pt monospace",
|
|
531
|
+
"style": "FILL",
|
|
532
|
+
"outlineColor": {
|
|
533
|
+
"rgba": [0, 0, 0, 255]
|
|
534
|
+
},
|
|
535
|
+
"outlineWidth": 2,
|
|
536
|
+
"pixelOffset": {
|
|
537
|
+
"cartesian2": [0, -16]
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
*/
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
// Add animated point for the moving item.
|
|
545
|
+
const vehiclePositions = rows.map((row) => {
|
|
546
|
+
const position = [
|
|
547
|
+
(new Date(row[dateTimeIndex]).getTime() - new Date(rows[0][dateTimeIndex]).getTime()) / 1000,
|
|
548
|
+
Number(row[lonIndex]),
|
|
549
|
+
Number(row[latIndex]),
|
|
550
|
+
0
|
|
551
|
+
];
|
|
552
|
+
return position;
|
|
553
|
+
}).flat();
|
|
554
|
+
czml.push({
|
|
555
|
+
"id": vehicleId,
|
|
556
|
+
"name": "Vehicle",
|
|
557
|
+
"availability": rows[0][dateTimeIndex] + "/" + rows[rows.length - 1][dateTimeIndex],
|
|
558
|
+
"model": vehicleFileUrl ? {
|
|
559
|
+
"heightReference": "CLAMP_TO_GROUND",
|
|
560
|
+
"gltf": vehicleFileUrl,
|
|
561
|
+
"scale": 1
|
|
562
|
+
} : undefined,
|
|
563
|
+
"point": !vehicleFileUrl ? {
|
|
564
|
+
"heightReference": "CLAMP_TO_GROUND",
|
|
565
|
+
"pixelSize": 20,
|
|
566
|
+
"color": {
|
|
567
|
+
"rgba": [0, 0, 255, 255]
|
|
568
|
+
}
|
|
569
|
+
} : undefined,
|
|
570
|
+
"orientation": {
|
|
571
|
+
"velocityReference": "#vehicle#position"
|
|
572
|
+
},
|
|
573
|
+
"position": {
|
|
574
|
+
"epoch": rows[0][dateTimeIndex],
|
|
575
|
+
"cartographicDegrees": vehiclePositions
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
return {
|
|
579
|
+
czml,
|
|
580
|
+
entityMapping
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
584
|
+
* Updates the orientation of the moving item.
|
|
585
|
+
* If there is a heading in the file then it will calculate based on the file data,
|
|
586
|
+
* if there isn't then it will calculate one based on the previous and current position.
|
|
587
|
+
* @param rows
|
|
588
|
+
* @param headingIndex
|
|
589
|
+
* @param dateTimeIndex
|
|
590
|
+
* @param viewer
|
|
591
|
+
* @param vehicleEntity
|
|
592
|
+
* @returns
|
|
593
|
+
*/
|
|
594
|
+
function updateOrientation(rows, headingIndex, dateTimeIndex, viewer, vehicleEntity) {
|
|
595
|
+
if (!vehicleEntity || !vehicleEntity.position) {
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
const positionProperty = vehicleEntity.position;
|
|
599
|
+
const currentTime = viewer.clock.currentTime;
|
|
600
|
+
const currentPosition = positionProperty.getValue(currentTime);
|
|
601
|
+
if (!currentPosition) {
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
if (headingIndex > -1) {
|
|
605
|
+
try {
|
|
606
|
+
const interpolatedHeading = interpolateHeading(dateTimeIndex, rows, currentTime, headingIndex);
|
|
607
|
+
if (interpolatedHeading !== null) {
|
|
608
|
+
const radians = Cesium.Math.toRadians(interpolatedHeading - 90);
|
|
609
|
+
const quaternion = Cesium.Transforms.headingPitchRollQuaternion(currentPosition, new Cesium.HeadingPitchRoll(radians, 0, 0));
|
|
610
|
+
if (!isNaN(quaternion.w) && !isNaN(quaternion.x) && !isNaN(quaternion.y) && !isNaN(quaternion.z)) {
|
|
611
|
+
vehicleEntity.orientation = new Cesium.ConstantProperty(quaternion);
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
console.error("Invalid quaternion", quaternion);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
catch (e) {
|
|
620
|
+
console.error(e);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
const previousTime = Cesium.JulianDate.addSeconds(currentTime, -1, new Cesium.JulianDate());
|
|
624
|
+
const previousPosition = positionProperty.getValue(previousTime);
|
|
625
|
+
if (previousPosition && !Cesium.Cartesian3.equals(currentPosition, previousPosition)) {
|
|
626
|
+
const direction = Cesium.Cartesian3.subtract(currentPosition, previousPosition, new Cesium.Cartesian3());
|
|
627
|
+
Cesium.Cartesian3.normalize(direction, direction);
|
|
628
|
+
const rotationMatrix = Cesium.Transforms.rotationMatrixFromPositionVelocity(previousPosition, direction);
|
|
629
|
+
vehicleEntity.orientation = new Cesium.ConstantProperty(Cesium.Quaternion.fromRotationMatrix(rotationMatrix));
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
function interpolateHeading(dateTimeIndex, rows, currentTime, headingIndex) {
|
|
633
|
+
const currentTimeMs = Cesium.JulianDate.toDate(currentTime).getTime();
|
|
634
|
+
let nearestBefore = null;
|
|
635
|
+
let nearestAfter = null;
|
|
636
|
+
for (const row of rows) {
|
|
637
|
+
const time = new Date(row[dateTimeIndex]).getTime();
|
|
638
|
+
let heading = parseFloat(String(row[headingIndex]));
|
|
639
|
+
if (!isNaN(heading)) {
|
|
640
|
+
if (time <= currentTimeMs) {
|
|
641
|
+
nearestBefore = { time, heading };
|
|
642
|
+
}
|
|
643
|
+
else if (time > currentTimeMs && nearestAfter === null) {
|
|
644
|
+
nearestAfter = { time, heading };
|
|
645
|
+
break;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
if (nearestBefore && nearestAfter) {
|
|
650
|
+
// Normalize headings to handle wraparound from 359 to 0.
|
|
651
|
+
let deltaHeading = nearestAfter.heading - nearestBefore.heading;
|
|
652
|
+
if (deltaHeading > 180) {
|
|
653
|
+
deltaHeading -= 360;
|
|
654
|
+
}
|
|
655
|
+
else if (deltaHeading < -180) {
|
|
656
|
+
deltaHeading += 360;
|
|
657
|
+
}
|
|
658
|
+
const factor = (currentTimeMs - nearestBefore.time) / (nearestAfter.time - nearestBefore.time);
|
|
659
|
+
let interpolatedHeading = nearestBefore.heading + factor * deltaHeading;
|
|
660
|
+
interpolatedHeading = (interpolatedHeading + 360) % 360;
|
|
661
|
+
return interpolatedHeading;
|
|
662
|
+
}
|
|
663
|
+
else if (nearestBefore) {
|
|
664
|
+
return nearestBefore.heading;
|
|
665
|
+
}
|
|
666
|
+
return null;
|
|
667
|
+
}
|
|
668
|
+
//# sourceMappingURL=data-source-static-csv-manager.js.map
|