gisviewer-vue3-arcgis 1.0.85
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/README.md +103 -0
- package/es/index.d.ts +8 -0
- package/es/index.mjs +16 -0
- package/es/src/components.d.ts +9 -0
- package/es/src/gis-map/gis-map.vue.d.ts +91 -0
- package/es/src/gis-map/gis-map.vue.mjs +124 -0
- package/es/src/gis-map/gis-map.vue2.mjs +4 -0
- package/es/src/gis-map/index.d.ts +81 -0
- package/es/src/gis-map/index.mjs +7 -0
- package/es/src/gis-map/stores/appData.d.ts +3 -0
- package/es/src/gis-map/stores/appData.mjs +9 -0
- package/es/src/gis-map/stores/index.d.ts +7 -0
- package/es/src/gis-map/stores/index.mjs +10 -0
- package/es/src/gis-map/style/index.css +13 -0
- package/es/src/gis-map/utils/FlyToPoints.d.ts +37 -0
- package/es/src/gis-map/utils/FlyToPoints.mjs +67 -0
- package/es/src/gis-map/utils/GreenWaveline.mjs +193 -0
- package/es/src/gis-map/utils/Layers.d.ts +31 -0
- package/es/src/gis-map/utils/Layers.mjs +99 -0
- package/es/src/gis-map/utils/common-utils.d.ts +65 -0
- package/es/src/gis-map/utils/common-utils.mjs +159 -0
- package/es/src/gis-map/utils/holo-flow/index.d.ts +15 -0
- package/es/src/gis-map/utils/holo-flow/index.mjs +50 -0
- package/es/src/gis-map/utils/holo-flow/signal-holo-flow.d.ts +40 -0
- package/es/src/gis-map/utils/holo-flow/signal-holo-flow.mjs +209 -0
- package/es/src/gis-map/utils/holo-flow/trace-external-renderer.d.ts +69 -0
- package/es/src/gis-map/utils/holo-flow/trace-external-renderer.mjs +316 -0
- package/es/src/gis-map/utils/holo-flow/trace-holo-flow.d.ts +18 -0
- package/es/src/gis-map/utils/holo-flow/trace-holo-flow.mjs +75 -0
- package/es/src/gis-map/utils/holo-flow/trace-layer-renderer.d.ts +35 -0
- package/es/src/gis-map/utils/holo-flow/trace-layer-renderer.mjs +286 -0
- package/es/src/gis-map/utils/index.d.ts +21 -0
- package/es/src/gis-map/utils/index.mjs +23 -0
- package/es/src/gis-map/utils/map-initializer.d.ts +50 -0
- package/es/src/gis-map/utils/map-initializer.mjs +248 -0
- package/es/src/gis-map/utils/open-drive-renderer/index.d.ts +9 -0
- package/es/src/gis-map/utils/open-drive-renderer/index.mjs +271 -0
- package/es/src/gis-map/utils/overlay.d.ts +83 -0
- package/es/src/gis-map/utils/overlay.mjs +149 -0
- package/es/src/gis-map/utils/queue-length.d.ts +14 -0
- package/es/src/gis-map/utils/queue-length.mjs +83 -0
- package/es/src/gis-map/utils/renderer/greenWaveline.d.ts +2 -0
- package/es/src/gis-map/utils/renderer/greenWaveline.mjs +169 -0
- package/es/src/gis-map/utils/road-config-tool/cross.d.ts +51 -0
- package/es/src/gis-map/utils/road-config-tool/cross.mjs +127 -0
- package/es/src/gis-map/utils/road-config-tool/entrance.d.ts +24 -0
- package/es/src/gis-map/utils/road-config-tool/entrance.mjs +79 -0
- package/es/src/gis-map/utils/road-config-tool/exit.d.ts +18 -0
- package/es/src/gis-map/utils/road-config-tool/exit.mjs +86 -0
- package/es/src/gis-map/utils/road-config-tool/index.d.ts +44 -0
- package/es/src/gis-map/utils/road-config-tool/index.mjs +112 -0
- package/es/src/gis-map/utils/road-config-tool/indicator-area.d.ts +22 -0
- package/es/src/gis-map/utils/road-config-tool/indicator-area.mjs +44 -0
- package/es/src/gis-map/utils/road-config-tool/lane.d.ts +21 -0
- package/es/src/gis-map/utils/road-config-tool/lane.mjs +35 -0
- package/es/src/gis-map/utils/road-config-tool/search-nearby-lanes.d.ts +62 -0
- package/es/src/gis-map/utils/road-config-tool/search-nearby-lanes.mjs +265 -0
- package/es/src/gis-map/utils/sketchView.d.ts +209 -0
- package/es/src/gis-map/utils/sketchView.mjs +516 -0
- package/es/src/gis-map/utils/sketchViewTool.d.ts +259 -0
- package/es/src/gis-map/utils/sketchViewTool.mjs +503 -0
- package/es/src/gis-map/utils/syncMapView.d.ts +43 -0
- package/es/src/gis-map/utils/syncMapView.mjs +64 -0
- package/es/src/gis-map/utils/traffic-flow.d.ts +66 -0
- package/es/src/gis-map/utils/traffic-flow.mjs +308 -0
- package/es/src/index.d.ts +1 -0
- package/es/src/index.mjs +4 -0
- package/es/src/types/index.d.ts +142 -0
- package/es/src/types/index.mjs +5 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +1 -0
- package/lib/src/components.d.ts +9 -0
- package/lib/src/gis-map/gis-map.vue.d.ts +91 -0
- package/lib/src/gis-map/gis-map.vue.js +1 -0
- package/lib/src/gis-map/gis-map.vue2.js +1 -0
- package/lib/src/gis-map/index.d.ts +81 -0
- package/lib/src/gis-map/index.js +1 -0
- package/lib/src/gis-map/stores/appData.d.ts +3 -0
- package/lib/src/gis-map/stores/appData.js +1 -0
- package/lib/src/gis-map/stores/index.d.ts +7 -0
- package/lib/src/gis-map/stores/index.js +1 -0
- package/lib/src/gis-map/style/index.css +13 -0
- package/lib/src/gis-map/utils/FlyToPoints.d.ts +37 -0
- package/lib/src/gis-map/utils/FlyToPoints.js +1 -0
- package/lib/src/gis-map/utils/GreenWaveline.js +1 -0
- package/lib/src/gis-map/utils/Layers.d.ts +31 -0
- package/lib/src/gis-map/utils/Layers.js +1 -0
- package/lib/src/gis-map/utils/common-utils.d.ts +65 -0
- package/lib/src/gis-map/utils/common-utils.js +1 -0
- package/lib/src/gis-map/utils/holo-flow/index.d.ts +15 -0
- package/lib/src/gis-map/utils/holo-flow/index.js +1 -0
- package/lib/src/gis-map/utils/holo-flow/signal-holo-flow.d.ts +40 -0
- package/lib/src/gis-map/utils/holo-flow/signal-holo-flow.js +1 -0
- package/lib/src/gis-map/utils/holo-flow/trace-external-renderer.d.ts +69 -0
- package/lib/src/gis-map/utils/holo-flow/trace-external-renderer.js +1 -0
- package/lib/src/gis-map/utils/holo-flow/trace-holo-flow.d.ts +18 -0
- package/lib/src/gis-map/utils/holo-flow/trace-holo-flow.js +1 -0
- package/lib/src/gis-map/utils/holo-flow/trace-layer-renderer.d.ts +35 -0
- package/lib/src/gis-map/utils/holo-flow/trace-layer-renderer.js +1 -0
- package/lib/src/gis-map/utils/index.d.ts +21 -0
- package/lib/src/gis-map/utils/index.js +1 -0
- package/lib/src/gis-map/utils/map-initializer.d.ts +50 -0
- package/lib/src/gis-map/utils/map-initializer.js +1 -0
- package/lib/src/gis-map/utils/open-drive-renderer/index.d.ts +9 -0
- package/lib/src/gis-map/utils/open-drive-renderer/index.js +1 -0
- package/lib/src/gis-map/utils/overlay.d.ts +83 -0
- package/lib/src/gis-map/utils/overlay.js +1 -0
- package/lib/src/gis-map/utils/queue-length.d.ts +14 -0
- package/lib/src/gis-map/utils/queue-length.js +1 -0
- package/lib/src/gis-map/utils/renderer/greenWaveline.d.ts +2 -0
- package/lib/src/gis-map/utils/renderer/greenWaveline.js +43 -0
- package/lib/src/gis-map/utils/road-config-tool/cross.d.ts +51 -0
- package/lib/src/gis-map/utils/road-config-tool/cross.js +1 -0
- package/lib/src/gis-map/utils/road-config-tool/entrance.d.ts +24 -0
- package/lib/src/gis-map/utils/road-config-tool/entrance.js +1 -0
- package/lib/src/gis-map/utils/road-config-tool/exit.d.ts +18 -0
- package/lib/src/gis-map/utils/road-config-tool/exit.js +1 -0
- package/lib/src/gis-map/utils/road-config-tool/index.d.ts +44 -0
- package/lib/src/gis-map/utils/road-config-tool/index.js +1 -0
- package/lib/src/gis-map/utils/road-config-tool/indicator-area.d.ts +22 -0
- package/lib/src/gis-map/utils/road-config-tool/indicator-area.js +1 -0
- package/lib/src/gis-map/utils/road-config-tool/lane.d.ts +21 -0
- package/lib/src/gis-map/utils/road-config-tool/lane.js +1 -0
- package/lib/src/gis-map/utils/road-config-tool/search-nearby-lanes.d.ts +62 -0
- package/lib/src/gis-map/utils/road-config-tool/search-nearby-lanes.js +1 -0
- package/lib/src/gis-map/utils/sketchView.d.ts +209 -0
- package/lib/src/gis-map/utils/sketchView.js +1 -0
- package/lib/src/gis-map/utils/sketchViewTool.d.ts +259 -0
- package/lib/src/gis-map/utils/sketchViewTool.js +1 -0
- package/lib/src/gis-map/utils/syncMapView.d.ts +43 -0
- package/lib/src/gis-map/utils/syncMapView.js +1 -0
- package/lib/src/gis-map/utils/traffic-flow.d.ts +66 -0
- package/lib/src/gis-map/utils/traffic-flow.js +1 -0
- package/lib/src/index.d.ts +1 -0
- package/lib/src/index.js +1 -0
- package/lib/src/types/index.d.ts +142 -0
- package/lib/src/types/index.js +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("pinia"),a=require("./appData.js"),e={},o=()=>{const t=r.createPinia();e.useAppDataStore=a.useAppDataStore(t)};exports.default=e;exports.registerStore=o;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
@import url('@arcgis/core/assets/esri/themes/dark/main.css');
|
|
2
|
+
.gis-viewer {
|
|
3
|
+
position: relative;
|
|
4
|
+
width: 100%;
|
|
5
|
+
height: 100%;
|
|
6
|
+
}
|
|
7
|
+
.gis-viewer-main {
|
|
8
|
+
width: 100%;
|
|
9
|
+
height: 100%;
|
|
10
|
+
}
|
|
11
|
+
.esri-view .esri-view-surface:focus::after {
|
|
12
|
+
outline: none !important;
|
|
13
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import MapView from '@arcgis/core/views/MapView';
|
|
2
|
+
import Extent from '@arcgis/core/geometry/Extent.js';
|
|
3
|
+
interface FlyToPointsOptions {
|
|
4
|
+
viewer: MapView;
|
|
5
|
+
points: {
|
|
6
|
+
longitude: number;
|
|
7
|
+
latitude: number;
|
|
8
|
+
}[];
|
|
9
|
+
duration?: number;
|
|
10
|
+
paddingRatio?: number;
|
|
11
|
+
onComplete?: () => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 动态点位 计算可视范围
|
|
15
|
+
*
|
|
16
|
+
* @export
|
|
17
|
+
* @class FlyToPoints
|
|
18
|
+
*/
|
|
19
|
+
export default class FlyToPoints {
|
|
20
|
+
private viewer;
|
|
21
|
+
private points;
|
|
22
|
+
constructor(options: FlyToPointsOptions);
|
|
23
|
+
/**
|
|
24
|
+
* 移动到可视角度
|
|
25
|
+
*
|
|
26
|
+
* @returns
|
|
27
|
+
* @memberof FlyToPoints
|
|
28
|
+
*/
|
|
29
|
+
flyToPoints(): void;
|
|
30
|
+
calculateZoomLevel(extent: Extent, viewWidth: number, viewHeight: number): number;
|
|
31
|
+
calculateExtent(points: string | any[]): Extent;
|
|
32
|
+
calculateCenterPoint(points: string | any[]): {
|
|
33
|
+
longitude: number;
|
|
34
|
+
latitude: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("@arcgis/core/geometry/Extent.js");class h{constructor(t){this.viewer=t.viewer,this.points=t.points}flyToPoints(){if(this.points.length==0)return;const t=this.calculateExtent(this.points),n=t.center,i=Math.abs(t.xmax-t.xmin),o=Math.abs(t.ymax-t.ymin),a=.6,e=i*a,l=o*a,s=new c({xmin:t.xmin-e,ymin:t.ymin-l,xmax:t.xmax+e,ymax:t.ymax+l,spatialReference:t.spatialReference}),r=this.calculateZoomLevel(s,this.viewer.width,this.viewer.height);this.viewer.goTo({target:s,zoom:r,center:n})}calculateZoomLevel(t,n,i){const o=Math.abs(t.xmax-t.xmin),a=Math.abs(t.ymax-t.ymin),e=Math.log2(360*(n/o)/256),l=Math.log2(180*(i/a)/256);return Math.floor(Math.min(e,l))}calculateExtent(t){let n=Number.MAX_VALUE,i=Number.MAX_VALUE,o=Number.MIN_VALUE,a=Number.MIN_VALUE;for(let e=0;e<t.length;e++){const l=t[e];n=Math.min(n,l.longitude),i=Math.min(i,l.latitude),o=Math.max(o,l.longitude),a=Math.max(a,l.latitude)}return new c({xmin:n,ymin:i,xmax:o,ymax:a,spatialReference:{wkid:4326}})}calculateCenterPoint(t){let n=0,i=0;for(let e=0;e<t.length;e++)n+=t[e].longitude,i+=t[e].latitude;const o=n/t.length,a=i/t.length;return{longitude:o,latitude:a}}}exports.default=h;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("@arcgis/core/Graphic"),y=require("@arcgis/core/geometry"),u=require("@arcgis/core/geometry/Polyline"),p=require("@arcgis/core/geometry/support/webMercatorUtils.js"),b=require("@arcgis/core/layers/GraphicsLayer"),g=require("./renderer/greenWaveline.js");function f(o){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const t in o)if(t!=="default"){const e=Object.getOwnPropertyDescriptor(o,t);Object.defineProperty(i,t,e.get?e:{enumerable:!0,get:()=>o[t]})}}return i.default=o,Object.freeze(i)}const l=f(p);function v(...o){const i={},t=e=>{for(const r in e)e.hasOwnProperty(r)&&(Object.prototype.toString.call(e[r])==="[object Object]"?i[r]=v(i[r],e[r]):i[r]=e[r])};for(let e=0;e<o.length;e++)t(o[e]);return i}class m{constructor(i){this.defaultAnimationOptions={isAnimation:!1,positive:!0,positiveColor:[0,255,0],negative:!0,negativeColor:[0,255,0]},this.viewer=i.viewer,this.overlayLayer=new b({...i.graphicsLayerOptions}),this.customGreenWaveLineView=new g.default({graphics:[]}),this.viewer.map.layers.add(this.customGreenWaveLineView),this.viewer.map.layers.add(this.overlayLayer)}addGreenWaveLine(i,t={isAnimation:!1,positive:!0,positiveColor:[0,255,0],negative:!0,negativeColor:[0,255,0]}){const e=[],r=[];t=v(this.defaultAnimationOptions,t),i.map(a=>{const s=a.visible==null?!0:a.visible;if(t.isAnimation){const n=[...a.paths];r.push(...this.getAnimationPath(n,t))}e.push(this.createLine(a.paths,a.symbol,a.attributes,s))}),this.overlayLayer.addMany(e),t.isAnimation&&this.customGreenWaveLineView.addMany(r)}getAnimationPath(i,t={isAnimation:!1,positive:!0,positiveColor:[0,255,0],negative:!0,negativeColor:[0,255,0]}){const e=[];return t.positive&&e.push({attributes:{color:t.positiveColor},geometry:l.geographicToWebMercator({paths:[i],type:"polyline"})}),t.negative&&e.push({attributes:{color:t.negativeColor},geometry:l.geographicToWebMercator({paths:[i.reverse()],type:"polyline"})}),e}createLine(i,t,e={},r){const a={type:"simple-line",color:[0,0,255,.5],width:2,...t},s=new u({paths:i}),n=l.geographicToWebMercator(s);return new c({geometry:n,symbol:a,attributes:{type:"greenWaveLine",...e},visible:r})}addPointText(i){const t=[];i.map(e=>{const r=e.visible==null?!0:e.visible;t.push(this.createPointText(e.point,e.symbol,e.attributes,r))}),this.overlayLayer.addMany(t)}createPointText(i,t,e={},r){const a={type:"text",color:"white",haloColor:"black",haloSize:"1px",xoffset:3,yoffset:3,font:{size:12,family:"Josefin Slab",weight:"bold"},...t},s=new y.Point({x:i[0],y:i[1]}),n=l.geographicToWebMercator(s);return new c({geometry:n,symbol:a,attributes:{type:"greenWaveLine-Text",...e},visible:r})}hideWaveLine(i){i?this.overlayLayer.graphics.filter(e=>{const r=e.getAttribute("id");return i.includes(r)}).forEach(e=>{e.visible=!1}):this.overlayLayer.graphics.map(t=>{t.visible=!1})}showWaveLine(i){i?this.overlayLayer.graphics.filter(e=>{const r=e.getAttribute("id");return i.includes(r)}).forEach(e=>{e.visible=!0}):this.overlayLayer.graphics.map(t=>{t.visible=!0})}hideLayer(){this.overlayLayer.visible=!1,this.customGreenWaveLineView.visible=!1}showLayer(){this.overlayLayer.visible=!0,this.customGreenWaveLineView.visible=!0}clearGreenWaveLine(){this.overlayLayer.removeAll(),this.customGreenWaveLineView.removeAll()}destroy(){this.overlayLayer.removeAll(),this.customGreenWaveLineView.removeAll(),this.viewer.map.layers.remove(this.customGreenWaveLineView),this.viewer.map.layers.remove(this.overlayLayer)}}exports.default=m;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Layer from '@arcgis/core/layers/Layer';
|
|
2
|
+
import MapView from '@arcgis/core/views/MapView';
|
|
3
|
+
import SceneView from '@arcgis/core/views/SceneView';
|
|
4
|
+
interface LayersOptions {
|
|
5
|
+
viewer: MapView | SceneView;
|
|
6
|
+
graphicsLayerOptions: {
|
|
7
|
+
id: string;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
interface layerDataFace {
|
|
11
|
+
url: string;
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
visible?: boolean;
|
|
15
|
+
type: string;
|
|
16
|
+
options?: any;
|
|
17
|
+
}
|
|
18
|
+
export default class BaseLayers {
|
|
19
|
+
private viewer;
|
|
20
|
+
private layerList;
|
|
21
|
+
constructor(options: LayersOptions);
|
|
22
|
+
getLayerById(id: string): Layer | undefined;
|
|
23
|
+
getLayers(): Map<string, Layer>;
|
|
24
|
+
getTileInfo(): {};
|
|
25
|
+
addLayer(layerData: layerDataFace | layerDataFace[], index?: number): void;
|
|
26
|
+
createLayer(layerData: layerDataFace): Layer | null;
|
|
27
|
+
removeLayerById(ids: string | string[]): void;
|
|
28
|
+
hideLayerById(ids: string | string[]): void;
|
|
29
|
+
showLayerById(ids: string | string[]): void;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("@arcgis/core/layers/GeoJSONLayer"),y=require("@arcgis/core/layers/TileLayer"),o=require("@arcgis/core/layers/WebTileLayer");class a{constructor(e){this.layerList=new Map,this.viewer=e.viewer;const i=this.viewer.map.findLayerById("dark-gray-base-layer");i&&this.layerList.set("dark-gray-base-layer",i)}getLayerById(e){return this.layerList.get(e)}getLayers(){return this.layerList}getTileInfo(){return{}}addLayer(e,i){const r=[];if(Array.isArray(e))e.map(t=>{const s=this.createLayer(t);s&&(this.layerList.set(t.id,s),r.push(this.createLayer(t)))});else{const t=this.createLayer(e);if(!t)return;this.layerList.set(e.id,t),r.push(this.createLayer(e))}r.map(t=>{this.viewer.map.add(t,i)})}createLayer(e){let i=null;switch(e.type){case"webTile":i=new o({urlTemplate:e.url,...e.options,title:e.options.id,visible:e.visible});break;case"hdLayers":i=new l({url:e.url,...e.options,title:e.options.id,visible:e.visible});break;case"tile":i=new y({url:e.url,...e.options,title:e.options.id,visible:e.visible});break}return i}removeLayerById(e){if(typeof e=="string"){const i=this.layerList.get(e);i&&(this.viewer.map.remove(i),this.layerList.delete(e))}Array.isArray(e)&&e.forEach(i=>{const r=this.layerList.get(i);r&&(this.viewer.map.remove(r),this.layerList.delete(i))})}hideLayerById(e){if(typeof e=="string"){const i=this.layerList.get(e);i&&(i.visible=!1)}Array.isArray(e)&&e.forEach(i=>{const r=this.layerList.get(i);r&&(r.visible=!1)})}showLayerById(e){if(typeof e=="string"){const i=this.layerList.get(e);i&&(i.visible=!0)}Array.isArray(e)&&e.forEach(i=>{const r=this.layerList.get(i);r&&(r.visible=!0)})}}exports.default=a;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Point, Polygon, Polyline } from '@arcgis/core/geometry';
|
|
2
|
+
export default class CommonUtils {
|
|
3
|
+
/**
|
|
4
|
+
* 得到某个点在一定方向、距离之外的另一个点
|
|
5
|
+
* @param point
|
|
6
|
+
* @param angel
|
|
7
|
+
* @param distance
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
static destinationWithPoint(point: Point, angel: number, distance: number): Point;
|
|
11
|
+
/**
|
|
12
|
+
* 线段与正北方向夹角
|
|
13
|
+
* @param line
|
|
14
|
+
* @returns
|
|
15
|
+
*/
|
|
16
|
+
static angleOfLine(line: Polyline): number;
|
|
17
|
+
/**
|
|
18
|
+
* 在头尾两个方向上延长折线
|
|
19
|
+
* @param line
|
|
20
|
+
* @param distance
|
|
21
|
+
*/
|
|
22
|
+
static extendLineInTowDir(line: Polyline, distance: number): Polyline;
|
|
23
|
+
/**
|
|
24
|
+
* 两条线的交点
|
|
25
|
+
* @param line1
|
|
26
|
+
* @param line2
|
|
27
|
+
* @returns
|
|
28
|
+
*/
|
|
29
|
+
static getIntersectPointOfTwoLines(line1: Polyline, line2: Polyline): Promise<Point | undefined>;
|
|
30
|
+
/**
|
|
31
|
+
* 获取停止线与车道面的交点
|
|
32
|
+
* @param stopLine
|
|
33
|
+
* @param lanePolygon
|
|
34
|
+
* @param offsetDistances
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
static getIntersectPointsOfStopLineAndLane(stopLine: Polyline, lanePolygon: Polygon, offsetDistances?: number[]): Promise<number[][]>;
|
|
38
|
+
/**
|
|
39
|
+
* 两个点之间的距离
|
|
40
|
+
* @param points
|
|
41
|
+
* @returns
|
|
42
|
+
*/
|
|
43
|
+
private static pointDistance;
|
|
44
|
+
/**
|
|
45
|
+
* 线按一定距离平移之后,与面相交的两个端点
|
|
46
|
+
* @param line
|
|
47
|
+
* @param polygon
|
|
48
|
+
* @param offsetDistance 线平移的距离
|
|
49
|
+
* @returns 线面交线的头尾端点
|
|
50
|
+
*/
|
|
51
|
+
static getIntersectPointOfLineAndPolygon(line: Polyline, polygon: Polygon, offsetDistance?: number): Promise<number[][]>;
|
|
52
|
+
/**
|
|
53
|
+
* 对polyline做平移
|
|
54
|
+
* @param line
|
|
55
|
+
* @param offsetDistance
|
|
56
|
+
* @returns 平移后的polyline
|
|
57
|
+
*/
|
|
58
|
+
static getOffsetLine(line: Polyline, offsetDistance: number): Promise<Polyline>;
|
|
59
|
+
/**
|
|
60
|
+
* 解压
|
|
61
|
+
* @param key
|
|
62
|
+
* @returns
|
|
63
|
+
*/
|
|
64
|
+
static unzip(key: string): string | undefined;
|
|
65
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("@arcgis/core/geometry"),w=require("@arcgis/core/geometry/geometryEngineAsync"),O=require("@arcgis/core/geometry/support/webMercatorUtils"),y=require("@turf/bearing"),l=require("@turf/destination"),L=require("@turf/helpers"),b=require("pako");function p(c){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(c){for(const t in c)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(c,t);Object.defineProperty(e,t,n.get?n:{enumerable:!0,get:()=>c[t]})}}return e.default=c,Object.freeze(e)}const g=p(w),P=p(O),f=p(L);class s{static destinationWithPoint(e,t,n){const r=f.point([e.x,e.y]),o=l(r,n,t,{units:"meters"});return new a.Point({x:o.geometry.coordinates[0],y:o.geometry.coordinates[1]})}static angleOfLine(e){const t=e.paths[0],n=f.point(t[0]),r=f.point(t[t.length-1]);return y(n,r)}static extendLineInTowDir(e,t){const n=e.paths[0],r=f.point(n[0]),o=f.point(n[1]),i=y(o,r),u=l(r,t,i,{units:"meters"}),h=i>0?i-180:i+180,d=l(o,t,h,{units:"meters"});return new a.Polyline({paths:[[u.geometry.coordinates,d.geometry.coordinates]]})}static async getIntersectPointOfTwoLines(e,t){const n=await g.intersectLinesToPoints(e,t);if(n.length)return n[0]}static async getIntersectPointsOfStopLineAndLane(e,t,n){let r=await s.getIntersectPointOfLineAndPolygon(e,t);if(await s.pointDistance(r)<3&&n){for(const o of n)if(r=await s.getIntersectPointOfLineAndPolygon(e,t,o),await s.pointDistance(r)>2.5){const i=new a.Polyline({paths:[r]});return(await s.getOffsetLine(i,-o)).paths[0]}}else return r;return[]}static async pointDistance(e){if(e.length<2)return 0;const t=new a.Polyline({paths:[e]});return await g.geodesicLength(t,"meters")}static async getIntersectPointOfLineAndPolygon(e,t,n=0){n!==0&&(e=await s.getOffsetLine(e,n));const r=await g.intersect(e,t);if(r instanceof a.Polyline){const o=r.paths[0],i=o[0],u=o[o.length-1];return[i,u]}return[]}static async getOffsetLine(e,t){const n=P.geographicToWebMercator(e),r=await g.offset(n,t,"meters");return P.webMercatorToGeographic(r,!1)}static unzip(e){try{const t=[],n=e.split("");for(let o=0;o<n.length;o++){const i=n[o];t.push(i.charCodeAt(0))}const r=new Uint8Array(t);return b.inflate(r,{to:"string"})}catch{console.log(`非压缩内容: ${e}`)}}}exports.default=s;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import View from '@arcgis/core/views/View';
|
|
2
|
+
export default class Index {
|
|
3
|
+
private readonly view;
|
|
4
|
+
private traceHoloFlow;
|
|
5
|
+
private signalHoloFlow;
|
|
6
|
+
constructor(view: View);
|
|
7
|
+
/**
|
|
8
|
+
* 处理全息流轨迹数据
|
|
9
|
+
* */
|
|
10
|
+
handleVehicleTraceData(data: any): void;
|
|
11
|
+
clearHoloTrace(): void;
|
|
12
|
+
updatePanelContent(contentType: string): void;
|
|
13
|
+
handleSignalData(data: any): Promise<void>;
|
|
14
|
+
clearHoloSignal(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("../../../types/index.js"),o=require("./signal-holo-flow.js"),i=require("./trace-holo-flow.js");class n{constructor(e){this.view=e}handleVehicleTraceData(e){this.traceHoloFlow||(this.traceHoloFlow=new i.default(this.view)),this.traceHoloFlow.handleVehicleTraceData(e)}clearHoloTrace(){var e;(e=this.traceHoloFlow)==null||e.clearTrace()}updatePanelContent(e){var t;let a=l.EVehiclePlateState.None;switch(e){case"none":a=l.EVehiclePlateState.None;break;case"plateNumber":a=l.EVehiclePlateState.PlateNumber;break;case"vehicleId":a=l.EVehiclePlateState.Id;break;case"mix":a=l.EVehiclePlateState.Mix;break}(t=this.traceHoloFlow)==null||t.updatePanelContent(a)}async handleSignalData(e){this.signalHoloFlow||(this.signalHoloFlow=new o.default(this.view)),await this.signalHoloFlow.initializeLayer(),await this.signalHoloFlow.handleSignalData(e)}clearHoloSignal(){var e;(e=this.signalHoloFlow)==null||e.clearSignal()}}exports.default=n;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import View from '@arcgis/core/views/View';
|
|
2
|
+
export default class SignalHoloFlow {
|
|
3
|
+
private view;
|
|
4
|
+
private mapConfig;
|
|
5
|
+
/** 显示停止线的图层 */
|
|
6
|
+
private phaseLineLayer;
|
|
7
|
+
/** 每个路口的当前相位 */
|
|
8
|
+
private currentPhaseMap;
|
|
9
|
+
/** 每个路口倒计时canvas */
|
|
10
|
+
private countdownCanvasMap;
|
|
11
|
+
private countdownWatchHandel;
|
|
12
|
+
private lastDataTime;
|
|
13
|
+
constructor(view: View);
|
|
14
|
+
/**
|
|
15
|
+
* 初始化相位线图层
|
|
16
|
+
* */
|
|
17
|
+
initializeLayer(): Promise<void>;
|
|
18
|
+
handleSignalData(data: any): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* 清除实时信号相关图层
|
|
21
|
+
* */
|
|
22
|
+
clearSignal(): void;
|
|
23
|
+
private isDeletingCanvas;
|
|
24
|
+
/**
|
|
25
|
+
* 获取显示倒计时的canvas
|
|
26
|
+
* */
|
|
27
|
+
private updateCountdown;
|
|
28
|
+
private drawCountdownText;
|
|
29
|
+
private updatePhaseLine;
|
|
30
|
+
/**
|
|
31
|
+
* 车道是否在通道中
|
|
32
|
+
* @param laneCode 车道编码
|
|
33
|
+
* @param channels 通道列表
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
36
|
+
private isLaneInChannels;
|
|
37
|
+
private readonly canvasWidth;
|
|
38
|
+
private readonly canvasHeight;
|
|
39
|
+
private createCountdownCanvas;
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const d=require("@arcgis/core/core/reactiveUtils"),u=require("@arcgis/core/geometry"),p=require("@arcgis/core/layers/FeatureLayer"),g=require("../../stores/index.js");function y(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const t in r)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(r,t);Object.defineProperty(e,t,a.get?a:{enumerable:!0,get:()=>r[t]})}}return e.default=r,Object.freeze(e)}const w=y(d);class m{constructor(e){this.currentPhaseMap=new Map,this.countdownCanvasMap=new Map,this.lastDataTime=0,this.isDeletingCanvas=!1,this.canvasWidth=80,this.canvasHeight=50,this.view=(e.type==="2d",e);const t=g.default.useAppDataStore;this.mapConfig=JSON.parse(JSON.stringify(t.mapConfig))}async initializeLayer(){if(this.mapConfig.phaseLineLayer)if(this.phaseLineLayer)this.phaseLineLayer.visible||(this.phaseLineLayer.visible=!0);else{const e=`${this.mapConfig.assetsRoot}/${this.mapConfig.phaseLineLayer}`,o=(await(await fetch(e)).json()).features.map((i,n)=>({geometry:{type:"polyline",paths:[i.geometry.coordinates]},attributes:{ObjectID:n+1,id:i.properties.id,color:"hide"}}));this.phaseLineLayer=new p({source:o,geometryType:"polyline",objectIdField:"ObjectID",outFields:["*"],fields:[{name:"ObjectID",alias:"ObjectID",type:"oid"},{name:"color",alias:"color",type:"string"}],renderer:{type:"unique-value",field:"color",defaultSymbol:{type:"simple-line",color:"lightblue",width:"2px",style:"none"},uniqueValueInfos:[{value:"green",symbol:{type:"line-3d",symbolLayers:[{type:"path",profile:"quad",material:{color:[19,255,69,.8]},width:1,height:.5}]}},{value:"red",symbol:{type:"line-3d",symbolLayers:[{type:"path",profile:"quad",material:{color:[254,5,9,.8]},width:1,height:.5}]}},{value:"yellow",symbol:{type:"line-3d",symbolLayers:[{type:"path",profile:"quad",material:{color:[255,215,0,.8]},width:1,height:.5}]}}]}}),this.view.map.add(this.phaseLineLayer)}}async handleSignalData(e){const t=new Date().getTime();if(t-this.lastDataTime<100)return;this.lastDataTime=t;const{crossId:o,lat:i,lon:n,rtStage:s,channelsConfig:l}=e;await this.updateCountdown(o,i,n,s),this.phaseLineLayer&&((!this.currentPhaseMap.has(o)||this.currentPhaseMap.get(o)!==s.stagePhase)&&await this.updatePhaseLine(o,s.channelsConfig,l),this.currentPhaseMap.set(o,s.stagePhase))}clearSignal(){this.phaseLineLayer.visible=!1,this.countdownWatchHandel&&(this.countdownWatchHandel.remove(),this.countdownWatchHandel=void 0),this.countdownCanvasMap.forEach(e=>{this.view.container.removeChild(e.backgroundCanvas),this.view.container.removeChild(e.countdownCanvas)}),this.countdownCanvasMap.clear()}async updateCountdown(e,t,a,o){if(this.isDeletingCanvas)return;const i=this.countdownCanvasMap.get(e);if(i)this.drawCountdownText(i.countdownCanvas,o);else{const n=new u.Point({longitude:a,latitude:t,z:10}),s=this.view.toScreen(n);if(s.x>this.view.width||s.y>this.view.height)return;this.createCountdownCanvas(l=>{const c=l[0],h=l[1];c.style.left=s.x+"px",c.style.top=s.y+"px",h.style.left=s.x+"px",h.style.top=s.y+"px",this.countdownCanvasMap.set(e,{backgroundCanvas:c,countdownCanvas:h,mapPoint:n}),this.drawCountdownText(h,o)})}this.countdownWatchHandel||(this.countdownWatchHandel=w.watch(()=>this.view.extent,()=>{this.countdownCanvasMap.forEach(n=>{const s=this.view.toScreen(n.mapPoint);s.x>this.view.width||s.y>this.view.height?(this.isDeletingCanvas=!0,this.view.container.removeChild(n.backgroundCanvas),this.view.container.removeChild(n.countdownCanvas),this.countdownCanvasMap.delete(e),this.isDeletingCanvas=!1):(n.backgroundCanvas.style.left=s.x+"px",n.backgroundCanvas.style.top=s.y+"px",n.countdownCanvas.style.left=s.x+"px",n.countdownCanvas.style.top=s.y+"px")})}))}drawCountdownText(e,t){const a=e.getContext("2d");a.clearRect(0,0,e.width,e.height),a.font="32px LESLIE",a.textBaseline="middle",a.textAlign="center",a.fillStyle=t.stageRemainingTime<=t.stageAllRedTime?"red":t.stageRemainingTime<=t.stageAllRedTime+t.stageYellowTime?"yellow":"lime",a.fillText(t.stageRemainingTime,e.width/2,e.height/2)}async updatePhaseLine(e,t,a){const o=this.phaseLineLayer.source.filter(i=>i.getAttribute("id").includes(e));o.forEach(i=>{const n=i.getAttribute("id");this.isLaneInChannels(n,t)?i.setAttribute("color","green"):this.isLaneInChannels(n,a)?i.setAttribute("color","red"):i.setAttribute("color","green")}),await this.phaseLineLayer.applyEdits({updateFeatures:o})}isLaneInChannels(e,t){const a=e.split("+"),o=a[1],i=a[2];for(let n=0;n<t.length;n++)for(let s=0;s<t[n].laneSnList.length;s++){const l=t[n].laneSnList[s].toFixed(0);if(o===l[0]&&i===l[1])return!0}return!1}createCountdownCanvas(e){const t=new Image;t.src=`${this.mapConfig.assetsRoot}/Images/timeboard/CountdownBG.png`,t.onload=()=>{const a=document.createElement("canvas");a.width=this.canvasWidth,a.height=this.canvasHeight,a.style.position="absolute",a.style.transform="translate(-50%, -50%)",a.getContext("2d").drawImage(t,0,0,this.canvasWidth,this.canvasHeight),this.view.container.appendChild(a);const i=document.createElement("canvas");i.width=this.canvasWidth-10,i.height=this.canvasHeight-10,i.style.position="absolute",i.style.transform="translate(-50%, -50%)",this.view.container.appendChild(i),e([a,i])}}}exports.default=m;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { EVehiclePlateState, ITraceRendererInterface, IVehicleTrack } from '../../../types';
|
|
2
|
+
export default class TraceExternalRenderer implements ITraceRendererInterface {
|
|
3
|
+
private renderer;
|
|
4
|
+
private scene;
|
|
5
|
+
private camera;
|
|
6
|
+
private ambient;
|
|
7
|
+
private sun;
|
|
8
|
+
/** 默认车身材质 */
|
|
9
|
+
private defaultMaterial;
|
|
10
|
+
/** 车身颜色材质 */
|
|
11
|
+
private materialMap;
|
|
12
|
+
private readonly view;
|
|
13
|
+
private readonly assetsRoot;
|
|
14
|
+
private carModel;
|
|
15
|
+
private carModelReady;
|
|
16
|
+
private vanModel;
|
|
17
|
+
private vanModelReady;
|
|
18
|
+
private truckModel;
|
|
19
|
+
private truckModelReady;
|
|
20
|
+
private busModel;
|
|
21
|
+
private busModelReady;
|
|
22
|
+
private bicycleModel;
|
|
23
|
+
private bicycleModelReady;
|
|
24
|
+
private currentSpriteContent;
|
|
25
|
+
private historyPositionMap;
|
|
26
|
+
private vehicleObjectMap;
|
|
27
|
+
constructor(view: __esri.SceneView);
|
|
28
|
+
setup(context: any): Promise<void>;
|
|
29
|
+
render(context: any): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* 新增车辆
|
|
32
|
+
* */
|
|
33
|
+
addVehicles(objects: IVehicleTrack[]): void;
|
|
34
|
+
/**
|
|
35
|
+
* 更新车辆
|
|
36
|
+
* */
|
|
37
|
+
updateVehicles(objects: IVehicleTrack[]): void;
|
|
38
|
+
/**
|
|
39
|
+
* 删除车辆
|
|
40
|
+
* */
|
|
41
|
+
deleteVehicles(idList: string[]): void;
|
|
42
|
+
/**
|
|
43
|
+
* 清除全部车辆
|
|
44
|
+
* */
|
|
45
|
+
clearVehicles(): void;
|
|
46
|
+
/**
|
|
47
|
+
* 设置号牌显示状态
|
|
48
|
+
* @param contentType
|
|
49
|
+
* @returns
|
|
50
|
+
*/
|
|
51
|
+
updatePanelContent(contentType: EVehiclePlateState): void;
|
|
52
|
+
/**
|
|
53
|
+
* 释放模型资源
|
|
54
|
+
* */
|
|
55
|
+
private disposeModel;
|
|
56
|
+
/**
|
|
57
|
+
* 计算车辆位置
|
|
58
|
+
* */
|
|
59
|
+
private computeVehiclePosition;
|
|
60
|
+
/**
|
|
61
|
+
* 根据车辆类型、车身颜色获取模型
|
|
62
|
+
* */
|
|
63
|
+
private getVehicleModel;
|
|
64
|
+
/**
|
|
65
|
+
* 创建号牌canvas
|
|
66
|
+
* */
|
|
67
|
+
private createCanvas;
|
|
68
|
+
private createPlateSprite;
|
|
69
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const w=require("@arcgis/core/geometry/SpatialReference"),R=require("@arcgis/core/views/3d/externalRenderers"),S=require("three"),P=require("three/examples/jsm/loaders/GLTFLoader.js"),p=require("../../../types/index.js"),T=require("../../stores/index.js");function b(u){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(u){for(const e in u)if(e!=="default"){const t=Object.getOwnPropertyDescriptor(u,e);Object.defineProperty(i,e,t.get?t:{enumerable:!0,get:()=>u[e]})}}return i.default=u,Object.freeze(i)}const y=b(R),o=b(S);class C{constructor(i){this.defaultMaterial=new o.MeshBasicMaterial({color:6908265}),this.materialMap=new Map([[1,new o.MeshBasicMaterial({color:16777215})],[2,new o.MeshBasicMaterial({color:7833753})],[3,new o.MeshBasicMaterial({color:16766720})],[4,new o.MeshBasicMaterial({color:16758465})],[5,new o.MeshBasicMaterial({color:14423100})],[6,new o.MeshBasicMaterial({color:3329330})],[7,new o.MeshBasicMaterial({color:2003183})],[8,new o.MeshBasicMaterial({color:16032864})],[9,new o.MeshBasicMaterial({color:2105376})],[10,new o.MeshBasicMaterial({color:9662683})],[99,new o.MeshBasicMaterial({color:6908265})]]),this.carModelReady=!1,this.vanModelReady=!1,this.truckModelReady=!1,this.busModelReady=!1,this.bicycleModelReady=!1,this.currentSpriteContent=p.EVehiclePlateState.None,this.historyPositionMap=new Map,this.vehicleObjectMap=new Map;const e=T.default.useAppDataStore;this.assetsRoot=JSON.parse(JSON.stringify(e.mapConfig)).assetsRoot,this.view=i;const t=new P.GLTFLoader;t.load(`${this.assetsRoot}/3DModels/car.glb`,s=>{this.carModel=s.scene,this.carModel.rotation.x=o.MathUtils.degToRad(90),this.carModelReady=!0}),t.load(`${this.assetsRoot}/3DModels/van.glb`,s=>{this.vanModel=s.scene,this.vanModel.rotation.x=o.MathUtils.degToRad(90),this.vanModelReady=!0}),t.load(`${this.assetsRoot}/3DModels/truck.glb`,s=>{this.truckModel=s.scene,this.truckModel.scale.set(1.2,1,1.5),this.truckModel.rotation.x=o.MathUtils.degToRad(90),this.truckModelReady=!0}),t.load(`${this.assetsRoot}/3DModels/bus.glb`,s=>{this.busModel=s.scene,this.busModel.rotation.x=o.MathUtils.degToRad(90),this.busModelReady=!0}),t.load(`${this.assetsRoot}/3DModels/bicycle.glb`,s=>{this.bicycleModel=s.scene,this.bicycleModel.rotation.x=o.MathUtils.degToRad(90),this.bicycleModel.rotation.y=o.MathUtils.degToRad(180),this.bicycleModelReady=!0})}async setup(i){this.renderer=new o.WebGLRenderer({context:i.gl,premultipliedAlpha:!1,antialias:!0}),this.renderer.setPixelRatio(window.devicePixelRatio),this.renderer.setViewport(0,0,this.view.width,this.view.height),this.renderer.autoClearDepth=!1,this.renderer.autoClearStencil=!1,this.renderer.autoClearColor=!1;const e=this.renderer.setRenderTarget.bind(this.renderer);this.renderer.setRenderTarget=t=>{e(t),t==null&&i.bindRenderTarget()},this.scene=new o.Scene,this.camera=new o.PerspectiveCamera,this.ambient=new o.AmbientLight(16777215,.5),this.scene.add(this.ambient),this.sun=new o.DirectionalLight(16777215,.5),this.scene.add(this.sun),i.resetWebGLState()}async render(i){var s;const e=i.camera;this.camera.position.set(e.eye[0],e.eye[1],e.eye[2]),this.camera.up.set(e.up[0],e.up[1],e.up[2]),this.camera.lookAt(new o.Vector3(e.center[0],e.center[1],e.center[2])),this.camera.projectionMatrix.fromArray(e.projectionMatrix);for(const r of this.vehicleObjectMap.keys()){const l=(s=this.vehicleObjectMap.get(r))==null?void 0:s.model;if(!l)continue;const a=this.computeVehiclePosition(r);if(a){const c=[0,0,0];y.toRenderCoordinates(this.view,a,0,w.WGS84,c,0,1),l.position.set(c[0],c[1],c[2]),l.rotation.y=o.MathUtils.degToRad(-a[3])}}const t=i.sunLight;this.sun.position.set(t.direction[0],t.direction[1],t.direction[2]),this.sun.intensity=t.diffuse.intensity,this.sun.color=new o.Color(t.diffuse.color[0],t.diffuse.color[1],t.diffuse.color[2]),this.ambient.intensity=t.ambient.intensity,this.ambient.color=new o.Color(t.ambient.color[0],t.ambient.color[1],t.ambient.color[2]),this.renderer.resetState(),i.bindRenderTarget(),this.renderer.render(this.scene,this.camera),y.requestRender(this.view),i.resetWebGLState()}addVehicles(i){!this.carModelReady||!this.vanModelReady||!this.truckModelReady||!this.busModelReady||!this.bicycleModelReady||i.forEach(e=>{const{crossId:t,ptcId:s,localTimestamp:r}=e,l=Number(e.x),a=Number(e.y),c=Number(e.heading),h=`${t}-${s}`;this.historyPositionMap.set(h,[{pos:[l,a,0],heading:c,time:r}]);const n=this.getVehicleModel(e);n.name=h,n.visible=!1,this.createPlateSprite(e,d=>{n.add(d),d.position.set(0,5,-4)}),this.scene.add(n),this.vehicleObjectMap.set(h,{model:n,data:e})})}updateVehicles(i){!this.carModelReady||!this.vanModelReady||!this.truckModelReady||!this.busModelReady||!this.bicycleModelReady||i.forEach(e=>{const{crossId:t,ptcId:s,localTimestamp:r}=e,l=Number(e.x),a=Number(e.y);let c=Number(e.heading);const h=`${t}-${s}`,n=this.vehicleObjectMap.get(h);if(n){if((n.data.vehicleColor!==e.vehicleColor||n.data.vehicleType!==e.vehicleType)&&(this.scene.remove(n.model),this.disposeModel(n.model),n.model=this.getVehicleModel(e),this.scene.add(n.model)),n.data.showName!==e.showName||n.data.plateColor!==e.plateColor){const f=n.model.getObjectByName("VehiclePlate");f&&(n.model.remove(f),this.disposeModel(f)),this.createPlateSprite(e,g=>{n.model.add(g),g.position.set(0,5,-4)})}n.data=e;const d=this.historyPositionMap.get(h),M=d[d.length-1];Math.abs(c-M.heading)>=180&&(c>M.heading?M.heading+=360:c+=360),d.push({pos:[l,a,0],heading:c,time:r})}else{this.historyPositionMap.set(h,[{pos:[l,a,0],heading:c,time:r}]);const d=this.getVehicleModel(e);d.name=h,d.visible=!1,this.createPlateSprite(e,M=>{d.add(M),M.position.set(0,5,-4)}),this.scene.add(d),this.vehicleObjectMap.set(h,{model:d,data:e})}})}deleteVehicles(i){i.forEach(e=>{const t=this.vehicleObjectMap.get(e);t&&(this.disposeModel(t.model),this.scene.remove(t.model),this.vehicleObjectMap.delete(e),this.historyPositionMap.delete(e))})}clearVehicles(){for(const i of this.vehicleObjectMap.keys()){const e=this.vehicleObjectMap.get(i);e&&(this.disposeModel(e.model),this.scene.remove(e.model))}this.vehicleObjectMap.clear(),this.historyPositionMap.clear()}updatePanelContent(i){if(i!==this.currentSpriteContent){this.currentSpriteContent=i;for(const e of this.vehicleObjectMap.keys()){const t=this.vehicleObjectMap.get(e);if(t){const s=t.model.getObjectByName("VehiclePlate");s&&(t.model.remove(s),this.disposeModel(s)),i!==p.EVehiclePlateState.None&&this.createPlateSprite(t.data,r=>{t.model.add(r),r.position.set(0,5,-4)})}}}}disposeModel(i){i.traverse(e=>{e instanceof o.Mesh&&(e.geometry.dispose(),e.material.dispose())})}computeVehiclePosition(i){const e=this.historyPositionMap.get(i),t=this.vehicleObjectMap.get(i);if(!t||!e)return[0,0,0,0];if(e.length===0)return[0,0,0,0];if(e.length<=2)return[...e[0].pos,e[0].heading];const s=Date.now();t.model.visible=!0,t.segmentStartTime||(t.segmentStartTime=s,t.segmentTotalTime=e[1].time-e[0].time);const r=s-t.segmentStartTime,l=Math.min(r/t.segmentTotalTime,1);if(l===1)if(e.shift(),e.length===1){t.segmentStartTime=void 0;return}else return t.segmentStartTime=s,t.segmentTotalTime=e[1].time-e[0].time,Math.abs(e[1].heading-e[0].heading)>=180&&(e[1].heading>e[0].heading?e[0].heading+=360:e[1].heading+=360),[...e[0].pos,e[0].heading];else{const a=e[0].pos[0]+(e[1].pos[0]-e[0].pos[0])*l,c=e[0].pos[1]+(e[1].pos[1]-e[0].pos[1])*l,h=e[0].heading+(e[1].heading-e[0].heading)*l;return[a,c,0,h]}}getVehicleModel(i){let e;if(i.ptcType===2)e=this.bicycleModel.clone();else{switch(i.vehicleType){case 10:e=this.carModel.clone();break;case 20:e=this.vanModel.clone();break;case 25:e=this.truckModel.clone();break;case 50:e=this.busModel.clone();break;default:e=this.carModel.clone();break}const t=this.materialMap.get(i.vehicleColor)||this.defaultMaterial;let s=!1;e.traverse(r=>{!s&&r instanceof o.Mesh&&(r.material=t,s=!0)})}return e}createCanvas(i,e,t){const s=document.createElement("canvas"),r=i.width,l=i.height;s.width=r,s.height=l;const a=s.getContext("2d");if(!a){console.log("canvas创建失败");return}return a.fillStyle="rgba(0,0,0,0.0)",a.fillRect(0,0,r,l),a.drawImage(i,0,0,r,l),a.beginPath(),a.translate(r/2,l/2),a.fillStyle=t,a.font="bold 32px 宋体",a.textBaseline="middle",a.textAlign="center",a.fillText(e,0,0),s}createPlateSprite(i,e){var c,h;const t=!i.plateNo||i.plateNo==="0"||i.plateNo==="000000";if(this.currentSpriteContent===p.EVehiclePlateState.None||this.currentSpriteContent===p.EVehiclePlateState.PlateNumber&&t)return;const s=new Image;let r="",l="",a="";if(this.currentSpriteContent===p.EVehiclePlateState.PlateNumber||this.currentSpriteContent===p.EVehiclePlateState.Mix)if(t)r="grey",l=i.ptcId,a="#ffffff";else switch(l=((c=i.showName)==null?void 0:c.substring(0,2))+"•"+((h=i.showName)==null?void 0:h.substring(2)),i.plateColor){case 1:r="blue",a="#ffffff";break;case 2:r="yellow",a="#000000";break;case 3:r="white",a="#000000";break;case 4:r="black";break;case 5:r="neo_yellow",a="#000000";break;case 6:r="neo_green",a="#000000";break;default:r="grey",l=i.plateNo,a="#ffffff";break}else this.currentSpriteContent===p.EVehiclePlateState.Id&&(r="grey",l=i.ptcId,a="#ffffff");s.src=`${this.assetsRoot}/Images/PlateBG/${r}.png`,s.onload=()=>{const n=this.createCanvas(s,l,a);if(!n)return;const d=new o.CanvasTexture(n),M=new o.SpriteMaterial({map:d}),m=new o.Sprite(M),f=.05,g=n.width*f,v=n.height*f;m.scale.set(g,v,1),m.name="VehiclePlate",e(m)}}}exports.default=C;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { EVehiclePlateState } from '../../../types';
|
|
2
|
+
export default class TraceHoloFlow {
|
|
3
|
+
private mapConfig;
|
|
4
|
+
private view;
|
|
5
|
+
private lastDataTime;
|
|
6
|
+
private readonly traceRenderer;
|
|
7
|
+
constructor(view: __esri.View);
|
|
8
|
+
/**
|
|
9
|
+
* 处理全息流轨迹数据
|
|
10
|
+
* */
|
|
11
|
+
handleVehicleTraceData(data: any): void;
|
|
12
|
+
/**
|
|
13
|
+
* 清除轨迹流
|
|
14
|
+
* */
|
|
15
|
+
clearTrace(): void;
|
|
16
|
+
updatePanelContent(contentType: EVehiclePlateState): void;
|
|
17
|
+
private buildVehicleTrackData;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const m=require("@arcgis/core/views/3d/externalRenderers"),f=require("../../stores/index.js"),T=require("./trace-external-renderer.js"),g=require("./trace-layer-renderer.js");function b(i){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(i){for(const r in i)if(r!=="default"){const o=Object.getOwnPropertyDescriptor(i,r);Object.defineProperty(e,r,o.get?o:{enumerable:!0,get:()=>i[r]})}}return e.default=i,Object.freeze(e)}const y=b(m);class D{constructor(e){this.lastDataTime=0,this.view=e;const r=f.default.useAppDataStore;this.mapConfig=JSON.parse(JSON.stringify(r.mapConfig)),e.type==="3d"?(this.traceRenderer=new T.default(e),y.add(e,this.traceRenderer)):this.traceRenderer=new g.default(e)}handleVehicleTraceData(e){const r=new Date().getTime();if(r-this.lastDataTime<100)return;this.lastDataTime=r;const{newVehList:a,updateVehList:l,deleteVehList:c,crossId:s}=e,u=[],p=[];if(a&&a.length>0){for(const t of a){const n=this.buildVehicleTrackData(t,s);n&&u.push(n)}this.traceRenderer.addVehicles(u)}if(l&&l.length>0){for(const t of l){const n=this.buildVehicleTrackData(t,s);n&&p.push(n)}this.traceRenderer.updateVehicles(p)}if(c&&c.length>0){const t=c.map(n=>s+"-"+n.ptcId);this.traceRenderer.deleteVehicles(t)}}clearTrace(){this.traceRenderer.clearVehicles()}updatePanelContent(e){this.traceRenderer.updatePanelContent(e)}buildVehicleTrackData(e,r){const o=e.longitude,a=e.latitude,l=e.ptcId,c=Number(e.ptcType),s=e.heading,u=Number(e.vehicleType),p=Number(e.vehicleColor),t=e.plateNo||e.plateno,n=Number(e.plateColor),d=e.timestamp,h=e.localTimestamp;if(!(c<0||c>8))return{ptcId:l,crossId:r,x:o,y:a,ptcType:c,vehicleType:u,heading:c===2?-s:s,vehicleColor:p,showName:t&&t!==""&&t!=="0"&&t!=="000000"?t:"",plateNo:t,plateColor:n,timestamp:d,localTimestamp:h}}}exports.default=D;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { EVehiclePlateState, ITraceRendererInterface, IVehicleTrack } from '../../../types';
|
|
2
|
+
export default class TraceLayerRenderer implements ITraceRendererInterface {
|
|
3
|
+
private view;
|
|
4
|
+
private readonly vehicleLayer;
|
|
5
|
+
private mapConfig;
|
|
6
|
+
constructor(view: __esri.MapView);
|
|
7
|
+
private showVehiclePlate;
|
|
8
|
+
private historyPositionMap;
|
|
9
|
+
private vehicleObjectMap;
|
|
10
|
+
addVehicles(objects: IVehicleTrack[]): void;
|
|
11
|
+
updateVehicles(objects: IVehicleTrack[]): void;
|
|
12
|
+
deleteVehicles(idList: string[]): void;
|
|
13
|
+
clearVehicles(): void;
|
|
14
|
+
updatePanelContent(contentType: EVehiclePlateState): void;
|
|
15
|
+
private render;
|
|
16
|
+
private updatePosition;
|
|
17
|
+
/**
|
|
18
|
+
* 基于轨迹数据创建cim符号,显示车辆图标和车牌号码
|
|
19
|
+
* @param vehTrack
|
|
20
|
+
* @returns
|
|
21
|
+
*/
|
|
22
|
+
private createCIMSymbol;
|
|
23
|
+
/**
|
|
24
|
+
* 根据车身颜色属性返回对应的车辆图标
|
|
25
|
+
* @param carColor
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
28
|
+
private getCarPic;
|
|
29
|
+
/**
|
|
30
|
+
* 根据号牌颜色属性获取填充色和背景色
|
|
31
|
+
* @param plateColor
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
private getPlateFontColor;
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const g=require("@arcgis/core/Graphic"),y=require("@arcgis/core/layers/GraphicsLayer"),d=require("../../stores/index.js");class b{constructor(i){this.showVehiclePlate=!1,this.historyPositionMap=new Map,this.vehicleObjectMap=new Map,this.view=i;const e=d.default.useAppDataStore;this.mapConfig=JSON.parse(JSON.stringify(e.mapConfig)),this.vehicleLayer=new y({id:"vehicleLayer"}),this.view.map.add(this.vehicleLayer),requestAnimationFrame(()=>this.render())}addVehicles(i){const e=i.map(t=>{const{crossId:o,ptcId:c,localTimestamp:a}=t,r=Number(t.x),n=Number(t.y),s=Number(t.heading),h=`${o}-${c}`;this.historyPositionMap.set(h,[{pos:[r,n,0],heading:s,time:a}]);const l=new g({geometry:{type:"point",x:r,y:n},attributes:{...t},symbol:this.createCIMSymbol(t)});return l.visible=!1,this.vehicleObjectMap.set(h,{graphic:l,data:t}),l});this.vehicleLayer.addMany(e)}updateVehicles(i){const e=[];i.forEach(t=>{const{crossId:o,ptcId:c,localTimestamp:a}=t,r=Number(t.x),n=Number(t.y);let s=Number(t.heading);const h=`${o}-${c}`,l=this.vehicleObjectMap.get(h);if(l){l.data=t;const p=this.historyPositionMap.get(h),m=p[p.length-1];Math.abs(s-m.heading)>=180&&(s>m.heading?m.heading+=360:s+=360),p.push({pos:[r,n,0],heading:s,time:a})}else e.push(t)}),this.addVehicles(e)}deleteVehicles(i){i.forEach(e=>{const t=this.vehicleObjectMap.get(e);t&&(this.vehicleLayer.remove(t.graphic),this.vehicleObjectMap.delete(e),this.historyPositionMap.delete(e))})}clearVehicles(){this.vehicleLayer.removeAll(),this.vehicleObjectMap.clear(),this.historyPositionMap.clear()}updatePanelContent(i){console.log(i)}render(){this.vehicleObjectMap.forEach((i,e)=>{this.updatePosition(e)}),requestAnimationFrame(()=>this.render())}updatePosition(i){const e=this.historyPositionMap.get(i),t=this.vehicleObjectMap.get(i);if(!e||!t||e.length<2)return;const o=Date.now();t.graphic.visible=!0,t.segmentStartTime||(t.segmentStartTime=o,t.segmentTotalTime=e[1].time-e[0].time);const c=o-t.segmentStartTime,a=Math.min(1,c/t.segmentTotalTime);if(a===1)if(e.shift(),e.length===1){t.segmentStartTime=void 0,t.segmentTotalTime=void 0;return}else t.segmentStartTime=o,t.segmentTotalTime=e[1].time-e[0].time,Math.abs(e[1].heading-e[0].heading)>=180&&(e[1].heading>e[0].heading?e[0].heading+=360:e[1].heading+=360),t.graphic.geometry={type:"point",x:e[0].pos[0],y:e[0].pos[1]};else{const r=e[0].pos[0]+(e[1].pos[0]-e[0].pos[0])*a,n=e[0].pos[1]+(e[1].pos[1]-e[0].pos[1])*a,s=e[0].heading+(e[1].heading-e[0].heading)*a;t.graphic.geometry={type:"point",x:r,y:n},t.data.heading=s,t.graphic.symbol=this.createCIMSymbol(t.data)}}createCIMSymbol(i){const e=this.getPlateFontColor(i.plateColor);return{type:"cim",data:{type:"CIMSymbolReference",primitiveOverrides:[{type:"CIMPrimitiveOverride",primitiveName:"textGraphic",propertyName:"TextString",valueExpressionInfo:{type:"CIMExpressionInfo",title:"Custom",expression:"$feature.showName",returnType:"Default"}}],symbol:{type:"CIMPointSymbol",symbolLayers:[{type:"CIMVectorMarker",enable:this.showVehiclePlate,size:32,colorLocked:!0,anchorPointUnits:"Relative",frame:{xmin:-8,ymin:-8,xmax:8,ymax:8},markerGraphics:[{type:"CIMMarkerGraphic",primitiveName:"textGraphic",geometry:{x:0,y:0},symbol:{type:"CIMTextSymbol",height:4,horizontalAlignment:"Center",offsetX:0,offsetY:8,haloSize:1,haloSymbol:{type:"CIMPolygonSymbol",symbolLayers:[{type:"CIMSolidFill",enable:!0,color:e.backgroundColor}]},symbol:{type:"CIMPolygonSymbol",symbolLayers:[{type:"CIMSolidFill",enable:!0,color:e.fillColor}]},verticalAlignment:"Center"},textString:""}],scaleSymbolsProportionally:!0,respectFrame:!0},{type:"CIMPictureMarker",enable:!0,anchorPoint:{x:0,y:0},anchorPointUnits:"Relative",size:30,rotation:i.heading,rotateClockwise:!0,textureFilter:"Picture",url:`${this.mapConfig.assetsRoot}Images/car/${this.getCarPic(i.vehicleColor)}`}]}}}}getCarPic(i){if(this.view.zoom<=15)return"point.png";let e="grey";switch(typeof i=="string"&&(i=i.toLowerCase()),i){case"a":case 1:e="white";break;case"b":case 2:e="grey";break;case"c":case 3:e="yellow";break;case"d":case 4:e="pink";break;case"e":case 5:e="red";break;case"f":case 10:e="purple";break;case"g":case 6:e="green";break;case"h":case 7:e="blue";break;case"i":case 8:e="brown";break;case"j":case 9:e="black";break}return e+".png"}getPlateFontColor(i){let e=[255,255,255,255],t=[169,169,169,255];switch(i){case 0:e=[0,0,0,255],t=[255,255,255,255];break;case 1:e=[0,0,0,255],t=[244,164,96,255];break;case 2:e=[255,255,255,255],t=[65,105,225,255];break;case 3:e=[255,255,255,255],t=[0,0,0,255];break;case 15:e=[244,164,96,255],t=[0,250,154,255];break;case 16:e=[0,0,0,255],t=[0,250,154,255];break}return{fillColor:e,backgroundColor:t}}}exports.default=b;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import FlyToPoints from './FlyToPoints';
|
|
2
|
+
import MapInitializer from './map-initializer';
|
|
3
|
+
import Overlay from './overlay';
|
|
4
|
+
import RoadConfigTool from './road-config-tool';
|
|
5
|
+
import SketchView from './sketchView';
|
|
6
|
+
import sketchViewTool from './sketchViewTool';
|
|
7
|
+
import GreenWaveLine from './GreenWaveline';
|
|
8
|
+
import BaseLayers from './Layers';
|
|
9
|
+
import SyncMapView from './syncMapView';
|
|
10
|
+
declare const MapUtils: {
|
|
11
|
+
MapInitializer: typeof MapInitializer;
|
|
12
|
+
RoadConfigTool: typeof RoadConfigTool;
|
|
13
|
+
FlyToPoints: typeof FlyToPoints;
|
|
14
|
+
Overlay: typeof Overlay;
|
|
15
|
+
SketchView: typeof SketchView;
|
|
16
|
+
sketchViewTool: typeof sketchViewTool;
|
|
17
|
+
SyncMapView: typeof SyncMapView;
|
|
18
|
+
GreenWaveLine: typeof GreenWaveLine;
|
|
19
|
+
BaseLayers: typeof BaseLayers;
|
|
20
|
+
};
|
|
21
|
+
export default MapUtils;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./FlyToPoints.js"),t=require("./map-initializer.js"),i=require("./overlay.js"),r=require("./road-config-tool/index.js"),a=require("./sketchView.js"),o=require("./sketchViewTool.js"),l=require("./GreenWaveline.js"),u=require("./Layers.js"),n=require("./syncMapView.js"),s={MapInitializer:t.default,RoadConfigTool:r.default,FlyToPoints:e.default,Overlay:i.default,SketchView:a.default,sketchViewTool:o.default,SyncMapView:n.default,GreenWaveLine:l.default,BaseLayers:u.default};exports.default=s;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import MapView from '@arcgis/core/views/MapView';
|
|
2
|
+
import SceneView from '@arcgis/core/views/SceneView';
|
|
3
|
+
import { ILookAtParams, IResult, ISetMapCameraParams, ISetMapCenterParams } from '../../types';
|
|
4
|
+
export default class MapInitializer {
|
|
5
|
+
private view;
|
|
6
|
+
private mapConfig;
|
|
7
|
+
/**
|
|
8
|
+
* 初始化地图
|
|
9
|
+
* @param params 容器
|
|
10
|
+
* @returns view
|
|
11
|
+
*/
|
|
12
|
+
initialize(params: {
|
|
13
|
+
container: HTMLElement;
|
|
14
|
+
markerClickCallback?: (type: string, id: string, detail: any, event?: any) => void;
|
|
15
|
+
mapClickCallback?: (mapPoint: number[], screenPoint: number[], event?: any) => void;
|
|
16
|
+
}): Promise<MapView | SceneView>;
|
|
17
|
+
/**
|
|
18
|
+
* 设置地图中心点
|
|
19
|
+
* @param params
|
|
20
|
+
* @returns
|
|
21
|
+
*/
|
|
22
|
+
setMapCenter(params: ISetMapCenterParams): Promise<IResult>;
|
|
23
|
+
/**
|
|
24
|
+
* 在一定的高度,以一定的角度去观察某个坐标
|
|
25
|
+
* */
|
|
26
|
+
lookAt(params: ILookAtParams): Promise<void>;
|
|
27
|
+
setMapCamera(params: ISetMapCameraParams): Promise<IResult>;
|
|
28
|
+
private watchHandleMap;
|
|
29
|
+
private handleIndex;
|
|
30
|
+
/**
|
|
31
|
+
* 经纬度转像素坐标,在地图移动时回调
|
|
32
|
+
* */
|
|
33
|
+
requestCoordinateTransform(points: number[][], callback: (points: number[][]) => void): {
|
|
34
|
+
handle: number;
|
|
35
|
+
points: number[][];
|
|
36
|
+
};
|
|
37
|
+
private transformPoints;
|
|
38
|
+
/**
|
|
39
|
+
* 停止坐标转换回调
|
|
40
|
+
* */
|
|
41
|
+
cancelCoordinateTransform(handleIndex: number): void;
|
|
42
|
+
private zoomWatchHandle;
|
|
43
|
+
/**
|
|
44
|
+
* 设置地图zoom范围
|
|
45
|
+
* */
|
|
46
|
+
setMapZoomRange(zoomRange: {
|
|
47
|
+
min?: number;
|
|
48
|
+
max?: number;
|
|
49
|
+
}): void;
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const v=require("@arcgis/core/Basemap"),P=require("@arcgis/core/Map"),p=require("@arcgis/core/config"),T=require("@arcgis/core/core/reactiveUtils"),z=require("@arcgis/core/geometry"),k=require("@arcgis/core/geometry/support/webMercatorUtils"),q=require("@arcgis/core/layers/GeoJSONLayer"),O=require("@arcgis/core/layers/TileLayer"),S=require("@arcgis/core/layers/WebTileLayer"),x=require("@arcgis/core/views/MapView"),W=require("@arcgis/core/views/SceneView"),L=require("@turf/destination"),I=require("@turf/helpers"),R=require("../stores/index.js");function g(r){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const s in r)if(s!=="default"){const t=Object.getOwnPropertyDescriptor(r,s);Object.defineProperty(e,s,t.get?t:{enumerable:!0,get:()=>r[s]})}}return e.default=r,Object.freeze(e)}const M=g(T),f=g(k),_=g(I);function m(r,e){return r.startsWith("http://")||r.startsWith("https://")?r:e+r}class H{constructor(){this.mapConfig={},this.watchHandleMap=new Map,this.handleIndex=0,this.zoomWatchHandle=null}async initialize(e){const s=R.default.useAppDataStore,t=JSON.parse(JSON.stringify(s.mapConfig));this.mapConfig=t;const{container:a,markerClickCallback:h,mapClickCallback:w}=e;p.assetsPath=`${t.assetsRoot}/ArcgisAssets`,p.fontsUrl=`${t.assetsRoot}/fonts`,p.apiKey="AAPKf5a3e1044d7a4faeb3b1ec7060f5c68equIrP2KbRyL-t_b40Kk4GTWUQ1BFCyttvyQPQnWpFmBd7kp9gkrVihjfmcKBwxjW";const c=new P;if((t==null?void 0:t.mapOptions.mode.toLowerCase())==="2d"?this.view=new x({map:c,container:a,...t.mapOptions}):this.view=new W({map:c,container:a,...t==null?void 0:t.mapOptions}),this.view.on("click",async i=>{var b,y;if(w){let o=i.mapPoint;o.spatialReference.isWebMercator&&(o=f.webMercatorToGeographic(o)),w([o.x,o.y],[i.screenPoint.x,i.screenPoint.y],i)}if(this.view.type==="3d"){const o=this.view.camera;if(this.view.spatialReference.isWebMercator){const u=f.webMercatorToGeographic(o.position),d={heading:o.heading,tilt:o.tilt,position:u.toJSON()};console.log(d),(b=navigator.clipboard)==null||b.writeText(JSON.stringify(d))}else console.log(o.toJSON())}else{let o=this.view.center;this.view.spatialReference.isWebMercator&&(o=f.webMercatorToGeographic(o)),console.log({center:o.toJSON(),zoom:this.view.zoom})}const l=(y=(await this.view.hitTest(i)).results)==null?void 0:y.filter(o=>o.type==="graphic");l.length>0&&l.forEach(o=>{var d;const u=o.graphic;(d=u.attributes)!=null&&d.type&&h&&h(u.attributes.type,u.attributes.id,u.attributes,i)})}),t!=null&&t.baseLayers?t.baseLayers.forEach(i=>{switch(i.type.toLowerCase()){case"webTile".toLowerCase():{const n=m(i.url,t.assetsRoot),l=new S({urlTemplate:n,...i.options});c.add(l);break}case"tile":{const n=m(i.url,t.assetsRoot),l=new O({url:n,...i.options});c.add(l);break}case"arcgis":{const n=new v(i.options);c.basemap=n;break}}}):c.basemap=new v({style:{id:"arcgis/dark-gray",language:"zh-CN"}}),t!=null&&t.hdLayers){const i=t.hdLayers.map(n=>new q({url:m(n.url,t.assetsRoot),...n.options,title:n.options.id}));c.addMany(i)}return this.view.ui.remove("attribution"),this.view.ui.add("compass","top-left"),await this.view.when(),this.view}async setMapCenter(e){return this.view?(e.center?await this.view.goTo({target:e.center,zoom:e.zoom},{duration:(e.duration||0)*1e3}):e.camera&&await this.view.goTo(e.camera,{duration:(e.duration||0)*1e3}),{status:0,message:"成功"}):{status:-1,message:"未初始化"}}async lookAt(e){if(this.view.type==="2d")return;const s=e.tilt||0,t=e.heading||0;if(s===0)await this.view.goTo({position:{x:e.center[0],y:e.center[1],z:e.height},heading:t,tilt:0},{duration:(e.duration||2)*1e3});else{const a=Math.tan(s*Math.PI/180)*e.height,h=L(_.point(e.center),a,180,{units:"meters"});await this.view.goTo({position:{x:h.geometry.coordinates[0],y:h.geometry.coordinates[1],z:e.height},heading:t,tilt:s},{duration:(e.duration||2)*1e3})}}async setMapCamera(e){if(!this.view)return{status:-1,message:"未初始化"};const{crossId:s,duration:t=0}=e,{camera:a}=this.mapConfig;return a?a[s]?(await this.view.goTo({target:a.center,zoom:e.zoom||15},{duration:t*1e3}),{status:0,message:"成功"}):{status:-1,message:"未配置camera"}:{status:-1,message:"未配置camera"}}requestCoordinateTransform(e,s){let t=0;const h=1e3/30,w=M.watch(()=>this.view.center,()=>{const c=this.transformPoints(e),i=Date.now();i-t>h&&(s(c),t=i)});return this.handleIndex++,this.watchHandleMap.set(this.handleIndex,w),{handle:this.handleIndex,points:this.transformPoints(e)}}transformPoints(e){return e.map(s=>{const t=new z.Point({x:s[0],y:s[1]}),a=this.view.toScreen(t);return[a.x,a.y]})}cancelCoordinateTransform(e){const s=this.watchHandleMap.get(e);s&&(s.remove(),this.watchHandleMap.delete(e))}setMapZoomRange(e){const{min:s,max:t}=e;!s&&!t||(this.zoomWatchHandle&&this.zoomWatchHandle.remove(),this.zoomWatchHandle=M.watch(()=>this.view.zoom,a=>{s&&a<=s&&(this.view.zoom=s),t&&a>=t&&(this.view.zoom=t)}))}}exports.default=H;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import View from '@arcgis/core/views/View';
|
|
2
|
+
export default class OpenDriveRenderer {
|
|
3
|
+
private readonly view;
|
|
4
|
+
private laneLayer;
|
|
5
|
+
constructor(view: View);
|
|
6
|
+
showOpenDrive(server: string, projectName: string): Promise<void>;
|
|
7
|
+
private showRoad;
|
|
8
|
+
hideOpenDrive(): Promise<void>;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const h=require("@arcgis/core/Graphic"),w=require("@arcgis/core/layers/FeatureLayer"),m=require("axios"),f=require("pako");class b{constructor(e){this.view=e,this.laneLayer=new w({id:"OpenDriveLane",fields:[{name:"ObjectID",alias:"ObjectID",type:"oid"},{name:"id",alias:"编号",type:"string"},{name:"roadId",alias:"道路号",type:"string"},{name:"roadName",alias:"道路名称",type:"string"},{name:"sectionId",alias:"路段号",type:"string"},{name:"laneId",alias:"车道号",type:"string"},{name:"type",alias:"类型",type:"string"}],objectIdField:"ObjectID",geometryType:"polygon",spatialReference:{wkid:4326},source:[],outFields:["*"],renderer:{type:"unique-value",field:"type",defaultSymbol:{type:"simple-fill",color:[100,100,100],style:"solid",outline:{color:"white",width:1}},uniqueValueInfos:[{value:"shoulder",label:"路肩",symbol:{type:"simple-fill",color:"#008000",style:"solid",outline:{color:"white",width:1}}},{value:"border",label:"路沿",symbol:{type:"simple-fill",color:"#DCDCDC",style:"solid",outline:{color:"white",width:1}}},{value:"driving",label:"机动车道",symbol:{type:"simple-fill",color:"#2F4F4F",style:"solid",outline:{color:"white",width:1}}},{value:"none",label:"无",symbol:{type:"simple-fill",color:[111,120,135],style:"none",outline:{color:"white",width:1}}},{value:"restricted",label:"禁行区",symbol:{type:"simple-fill",color:"yellow",style:"solid",outline:{color:"yellow",width:2}}},{value:"parking",label:"停车区",symbol:{type:"simple-fill",color:[115,115,115],style:"solid",outline:{color:"white",width:1}}},{value:"median",label:"中央隔离带",symbol:{type:"simple-fill",color:"#008000",style:"solid",outline:{color:"white",width:1}}},{value:"biking",label:"非机动车道",symbol:{type:"simple-fill",color:"#D3D3D3",style:"solid",outline:{color:"white",width:1}}},{value:"sidewalk",label:"人行道",symbol:{type:"simple-fill",color:"#C0C0C0",style:"solid",outline:{color:"white",width:1}}},{value:"junction",label:"路口区域",symbol:{type:"simple-fill",color:"#2F4F4F",style:"solid",outline:{color:"white",width:1}}},{value:"selected",label:"选中车道",symbol:{type:"simple-fill",color:[141,168,211],style:"solid",outline:{color:"white",width:1}}}]}}),this.view.map.add(this.laneLayer)}async showOpenDrive(e,i){const t=`http://${e}/api/openDrive/analyzeXodr`,o=await m.get(t,{headers:{projectName:i},params:{analyze:!1,compressed:!0}});if(o.status!==200)throw new Error(`OpenDriveRenderer: ${o.statusText}`);let l=o.data.result.json;l.startsWith("http")||(l=`http://${e}${l}`);const r=await(await fetch(l)).arrayBuffer(),n=f.inflate(r,{to:"string"}),a=JSON.parse(n);this.showRoad(a)}async showRoad(e){const i=await this.laneLayer.queryFeatures();i.features.length>0&&this.laneLayer.applyEdits({deleteFeatures:i.features});for(const t of e){const o=t.id,l=[];for(const s of t.laneSections){const r=s.id;for(const n of s.lanePaths){const{id:a,type:c,innerPath:d,outerPath:p}=n,y=d.concat(p.reverse());y.push(d[0]);const u=new h({geometry:{type:"polygon",rings:[y]},attributes:{id:a,roadId:o,roadName:t.name,sectionId:r,laneId:a,type:c}});l.push(u)}}await this.laneLayer.applyEdits({addFeatures:l})}}async hideOpenDrive(){const e=await this.laneLayer.queryFeatures();e.features.length>0&&this.laneLayer.applyEdits({deleteFeatures:e.features})}}exports.default=b;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import Graphic from '@arcgis/core/Graphic';
|
|
2
|
+
import GraphicsLayer from '@arcgis/core/layers/GraphicsLayer';
|
|
3
|
+
import MapView from '@arcgis/core/views/MapView';
|
|
4
|
+
import SceneView from '@arcgis/core/views/SceneView';
|
|
5
|
+
import { IOverlay, IOverlayParam, IPointSymbol, IResult } from '../../types';
|
|
6
|
+
interface IOverlayOptions {
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
export default class Overlay {
|
|
10
|
+
private view;
|
|
11
|
+
overlayLayer: GraphicsLayer;
|
|
12
|
+
constructor(view: MapView | SceneView, options?: IOverlayOptions);
|
|
13
|
+
private defaultPointSymbol;
|
|
14
|
+
/**
|
|
15
|
+
* 添加覆盖物
|
|
16
|
+
* @param params
|
|
17
|
+
*/
|
|
18
|
+
addOverlays(params: IOverlayParam): IResult;
|
|
19
|
+
/**
|
|
20
|
+
* 按type移除覆盖物
|
|
21
|
+
* @param types
|
|
22
|
+
*/
|
|
23
|
+
removeOverlaysByType(types: string[]): IResult;
|
|
24
|
+
/**
|
|
25
|
+
* 按id移除覆盖物
|
|
26
|
+
* @param ids
|
|
27
|
+
*/
|
|
28
|
+
removeOverlaysById(ids: string[]): IResult;
|
|
29
|
+
/**
|
|
30
|
+
* 按id显示或隐藏覆盖物
|
|
31
|
+
* @param ids
|
|
32
|
+
* @param isShow
|
|
33
|
+
*/
|
|
34
|
+
isShowOverlaysByIds(ids: string[], isShow: boolean): void;
|
|
35
|
+
/**
|
|
36
|
+
* 显示全部覆盖物
|
|
37
|
+
*
|
|
38
|
+
* @memberof Overlay
|
|
39
|
+
*/
|
|
40
|
+
showAllOverlays(): void;
|
|
41
|
+
/**
|
|
42
|
+
* 删除全部覆盖物
|
|
43
|
+
* @returns
|
|
44
|
+
*/
|
|
45
|
+
removeAllOverlays(): IResult;
|
|
46
|
+
/**
|
|
47
|
+
* 销毁
|
|
48
|
+
*
|
|
49
|
+
* @memberof Overlay
|
|
50
|
+
*/
|
|
51
|
+
destroy(): void;
|
|
52
|
+
removeGraphics(graphics: Graphic | Graphic[]): void;
|
|
53
|
+
/**
|
|
54
|
+
* 查找当前点击是否有覆盖物在当前图层
|
|
55
|
+
*
|
|
56
|
+
* @param {((MouseEvent | __esri.MapViewScreenPoint) &
|
|
57
|
+
* (__esri.SceneViewScreenPoint | MouseEvent))} event
|
|
58
|
+
* @returns
|
|
59
|
+
* @memberof Overlay
|
|
60
|
+
*/
|
|
61
|
+
findGraphic(event: (MouseEvent | __esri.MapViewScreenPoint) & (__esri.SceneViewScreenPoint | MouseEvent)): Promise<__esri.ViewHit[]>;
|
|
62
|
+
/**
|
|
63
|
+
* 隐藏图层
|
|
64
|
+
*
|
|
65
|
+
* @memberof Overlay
|
|
66
|
+
*/
|
|
67
|
+
hideLayer(): void;
|
|
68
|
+
/**
|
|
69
|
+
* 显示图层
|
|
70
|
+
*
|
|
71
|
+
* @memberof Overlay
|
|
72
|
+
*/
|
|
73
|
+
showLayer(): void;
|
|
74
|
+
/**
|
|
75
|
+
* 添加点覆盖物
|
|
76
|
+
* @param overlay
|
|
77
|
+
* @param symbol
|
|
78
|
+
* @param properties
|
|
79
|
+
*/
|
|
80
|
+
addPoint(overlay: IOverlay, symbol: IPointSymbol, properties: any, visible?: boolean): IResult;
|
|
81
|
+
private addOverlay;
|
|
82
|
+
}
|
|
83
|
+
export {};
|