@ino-cesium/analysis 0.0.21 → 0.0.22-beta.1

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/index.d.ts CHANGED
@@ -1,48 +1,126 @@
1
1
  import * as Cesium from 'cesium';
2
2
 
3
3
  interface IBaseAnalysis<T, R> {
4
- set: (options: T) => R;
4
+ set: (options: T) => R | any;
5
5
  remove: (item: R) => void;
6
6
  removeAll: () => void;
7
7
  destroy: () => void;
8
8
  }
9
- interface IClipPlane extends IBaseAnalysis<IClipPlaneOPtions, any> {
9
+ interface IGroundClip extends IBaseAnalysis<IGroundClipOptions, IGroundClipItem> {
10
10
  }
11
- interface IClipPlaneOPtions {
11
+ interface IGroundClipOptions {
12
12
  positions: Cesium.Cartesian3[];
13
+ /**
14
+ * 边界插值点数量
15
+ */
16
+ interCount?: number;
17
+ /**
18
+ * 裁切深度
19
+ */
13
20
  depth: number;
14
- unionClippingRegions?: boolean;
15
21
  }
16
- interface IClipPolygon extends IBaseAnalysis<IClipPolygonPtions, IClipPolygonItem> {
22
+ interface IGroundClipItem {
23
+ id: string;
24
+ positions: Cesium.Cartesian3[];
25
+ clipPolygon: Cesium.ClippingPolygon;
26
+ clipEntity: Cesium.Entity;
27
+ }
28
+ interface ITilesetClip extends IBaseAnalysis<ITilesetClipOptions, ITilesetClipItem> {
29
+ /**
30
+ * 设置裁切翻转
31
+ * @param inverse
32
+ */
33
+ setInverse: (inverse: boolean, item: ITilesetClipItem) => void;
34
+ setInverseAll: (inverse: boolean) => void;
17
35
  }
18
- interface IClipPolygonPtions {
36
+ interface ITilesetClipOptions {
19
37
  positions: Cesium.Cartesian3[];
20
- depth: number;
21
- inverse?: boolean;
38
+ inverse: boolean;
39
+ tileset: Cesium.Cesium3DTileset;
22
40
  }
23
- interface IClipPolygonItem {
41
+ interface ITilesetClipItem {
24
42
  id: string;
25
- polygon: Cesium.ClippingPolygon;
26
- bottomEntity: Cesium.Entity;
43
+ tileset: Cesium.Cesium3DTileset;
44
+ clipPolygon?: Cesium.ClippingPolygon;
27
45
  }
28
- interface IFlood extends IBaseAnalysis<IFloodOptions, IFloodItem> {
46
+ interface IFillVolume extends IBaseAnalysis<IFillVolumeOptions, IFillVolumeItem> {
47
+ changeBaseHeight: (item: IFillVolumeItem) => void;
29
48
  }
30
- interface IFloodOptions {
49
+ interface IFillVolumeOptions {
31
50
  positions: Cesium.Cartesian3[];
32
- type: 'model' | 'terrain';
33
- speed: number;
34
51
  }
35
- interface IFloodItem {
52
+ interface IFillVolumeItem {
36
53
  id: string;
37
- polygon: Cesium.Entity;
54
+ maxHeight: number;
55
+ minHeight: number;
56
+ baseHeight: number;
57
+ digVolume: number;
58
+ fillVolume: number;
59
+ cellsize: number;
60
+ positions: Cesium.Cartesian3[];
61
+ heightPositions: Cesium.Cartesian3[];
62
+ centroid: any;
63
+ area: number;
64
+ polygonPrimitive: Cesium.Primitive;
65
+ linePrimitive: Cesium.PrimitiveCollection;
66
+ labelPrimitive: Cesium.LabelCollection;
67
+ vloumePrimitive: Cesium.PrimitiveCollection;
68
+ volumeLabel: Cesium.Label;
69
+ }
70
+ interface ITilesExplode extends IBaseAnalysis<ITilesExplodeOptions, ITilesExplodeItem> {
71
+ set: (options: ITilesExplodeOptions) => Promise<ITilesExplodeItem>;
72
+ remove: (item: ITilesExplodeItem) => Promise<any>;
73
+ changeHeight: (item: ITilesExplodeItem, height: number) => void;
74
+ }
75
+ interface ITilesExplodeOptions {
76
+ tiles: Cesium.Cesium3DTile[];
77
+ height: number;
38
78
  }
39
- interface IFillDig extends IBaseAnalysis<IFillDigOptions, IFillDigItem> {
79
+ interface ITilesExplodeItem {
80
+ id: string;
81
+ tiles: Cesium.Cesium3DTile[];
82
+ /**
83
+ * tiles对应的原始包围盒
84
+ */
85
+ originBoundingSpheres: Cesium.BoundingSphere[];
86
+ fromHeight: number;
87
+ toHeight: number;
88
+ }
89
+ interface ITilesProfile extends IBaseAnalysis<ITilesProfileOptions, ITilesProfileItem> {
90
+ set: (options: ITilesProfileOptions) => Promise<ITilesProfileItem>;
91
+ changeTipPoint: (profileData: ITilesProfileData) => void;
40
92
  }
41
- interface IFillDigOptions {
93
+ interface ITilesProfileOptions {
94
+ tileSetLoader: I3dTilesLoader;
42
95
  positions: Cesium.Cartesian3[];
96
+ /**
97
+ * 插值点距离
98
+ * 默认为20米一个点
99
+ */
100
+ distance?: number;
101
+ /**
102
+ * 分析进度,回调当前分析的索引和对应tile
103
+ * @param progress 当前分析的索引
104
+ * @param tile 当前分析的tile
105
+ */
106
+ progress?: (progress: number, tile: Cesium.Cesium3DTile) => void;
43
107
  }
44
- interface IFillDigItem {
108
+ interface ITilesProfileData {
109
+ height: number;
110
+ distance: number;
111
+ allDistance: number;
112
+ positionIndex: number;
113
+ position: Cesium.Cartesian3;
114
+ }
115
+ interface ITilesProfileResult {
116
+ datas: ITilesProfileData[];
117
+ name: string;
118
+ index: number;
119
+ }
120
+ interface ITilesProfileItem {
45
121
  id: string;
122
+ tiles: Cesium.Cesium3DTile[];
123
+ results: ITilesProfileResult[];
46
124
  }
47
125
  interface IProFile<T> {
48
126
  set: (options: T) => Promise<IProFileItem>;
@@ -72,68 +150,87 @@ interface IProFileItemData {
72
150
  distance: number;
73
151
  allDistance: number;
74
152
  }
75
- interface IModelProFileOptions extends IProFileOptions {
76
- layers: any;
77
- /**
78
- * 分析进度
79
- */
80
- progress: (data: IProFileItemData) => void;
153
+ interface I3dTilesLoader {
154
+ tileset: Cesium.Cesium3DTileset;
155
+ heightOffset: number;
156
+ remove: () => void;
157
+ flyTo: () => void;
158
+ flyToByFeatureId: (id: string) => Promise<boolean>;
159
+ twinkingByFeatureId: (id: string) => void;
160
+ twinkingByTileId: (id: string) => void;
161
+ setHeightOffset: (heightOffsetValue: number) => void;
162
+ setOpacity: (opactiy: number) => void;
163
+ setScale: (scale: number) => void;
164
+ setSplitDirection: (splitDirection: Cesium.SplitDirection) => void;
165
+ setSelectByFeatureIds: (id?: string) => void;
166
+ setSelectByTileIds: (id?: string) => void;
167
+ setSelectColor: (color: string) => void;
168
+ setBrightness: (brightness: number) => void;
169
+ setVisible: (visible: boolean) => void;
170
+ setVisibleByFeatureIds: (ids: string[], visible: boolean) => void;
171
+ setVisibleByTileId: (ids: string[], visible: boolean) => void;
172
+ getFeatures: () => any[];
173
+ getFeaturesGroupByTileId: () => any;
81
174
  }
82
175
 
83
176
  type types_IBaseAnalysis<T, R> = IBaseAnalysis<T, R>;
84
- type types_IClipPlane = IClipPlane;
85
- type types_IClipPlaneOPtions = IClipPlaneOPtions;
86
- type types_IClipPolygon = IClipPolygon;
87
- type types_IClipPolygonItem = IClipPolygonItem;
88
- type types_IClipPolygonPtions = IClipPolygonPtions;
89
- type types_IFillDig = IFillDig;
90
- type types_IFillDigItem = IFillDigItem;
91
- type types_IFillDigOptions = IFillDigOptions;
92
- type types_IFlood = IFlood;
93
- type types_IFloodItem = IFloodItem;
94
- type types_IFloodOptions = IFloodOptions;
95
- type types_IModelProFileOptions = IModelProFileOptions;
177
+ type types_IFillVolume = IFillVolume;
178
+ type types_IFillVolumeItem = IFillVolumeItem;
179
+ type types_IFillVolumeOptions = IFillVolumeOptions;
180
+ type types_IGroundClip = IGroundClip;
181
+ type types_IGroundClipItem = IGroundClipItem;
182
+ type types_IGroundClipOptions = IGroundClipOptions;
96
183
  type types_IProFile<T> = IProFile<T>;
97
184
  type types_IProFileItem = IProFileItem;
98
185
  type types_IProFileItemData = IProFileItemData;
99
186
  type types_IProFileOptions = IProFileOptions;
187
+ type types_ITilesExplode = ITilesExplode;
188
+ type types_ITilesExplodeItem = ITilesExplodeItem;
189
+ type types_ITilesExplodeOptions = ITilesExplodeOptions;
190
+ type types_ITilesProfile = ITilesProfile;
191
+ type types_ITilesProfileData = ITilesProfileData;
192
+ type types_ITilesProfileItem = ITilesProfileItem;
193
+ type types_ITilesProfileOptions = ITilesProfileOptions;
194
+ type types_ITilesProfileResult = ITilesProfileResult;
195
+ type types_ITilesetClip = ITilesetClip;
196
+ type types_ITilesetClipItem = ITilesetClipItem;
197
+ type types_ITilesetClipOptions = ITilesetClipOptions;
100
198
  declare namespace types {
101
- export type { types_IBaseAnalysis as IBaseAnalysis, types_IClipPlane as IClipPlane, types_IClipPlaneOPtions as IClipPlaneOPtions, types_IClipPolygon as IClipPolygon, types_IClipPolygonItem as IClipPolygonItem, types_IClipPolygonPtions as IClipPolygonPtions, types_IFillDig as IFillDig, types_IFillDigItem as IFillDigItem, types_IFillDigOptions as IFillDigOptions, types_IFlood as IFlood, types_IFloodItem as IFloodItem, types_IFloodOptions as IFloodOptions, types_IModelProFileOptions as IModelProFileOptions, types_IProFile as IProFile, types_IProFileItem as IProFileItem, types_IProFileItemData as IProFileItemData, types_IProFileOptions as IProFileOptions };
199
+ export type { types_IBaseAnalysis as IBaseAnalysis, types_IFillVolume as IFillVolume, types_IFillVolumeItem as IFillVolumeItem, types_IFillVolumeOptions as IFillVolumeOptions, types_IGroundClip as IGroundClip, types_IGroundClipItem as IGroundClipItem, types_IGroundClipOptions as IGroundClipOptions, types_IProFile as IProFile, types_IProFileItem as IProFileItem, types_IProFileItemData as IProFileItemData, types_IProFileOptions as IProFileOptions, types_ITilesExplode as ITilesExplode, types_ITilesExplodeItem as ITilesExplodeItem, types_ITilesExplodeOptions as ITilesExplodeOptions, types_ITilesProfile as ITilesProfile, types_ITilesProfileData as ITilesProfileData, types_ITilesProfileItem as ITilesProfileItem, types_ITilesProfileOptions as ITilesProfileOptions, types_ITilesProfileResult as ITilesProfileResult, types_ITilesetClip as ITilesetClip, types_ITilesetClipItem as ITilesetClipItem, types_ITilesetClipOptions as ITilesetClipOptions };
102
200
  }
103
201
 
104
202
  /**
105
- * 地形开挖
203
+ * 填挖方分析
106
204
  */
107
- declare const createClipPlaneAnalysis: (viewer: Cesium.Viewer) => IClipPlane;
205
+ declare const createFillVolumeHandler: (viewer: Cesium.Viewer) => IFillVolume;
108
206
 
109
207
  /**
110
- * 裁剪面分析,
208
+ * 地形裁剪 , 地形开挖
111
209
  */
112
- declare const createClipPolygonAnalysis: (viewer: Cesium.Viewer) => IClipPolygon;
210
+ declare const createGroundClipHandler: (viewer: Cesium.Viewer) => IGroundClip;
113
211
 
114
212
  /**
115
- * 淹没分析
116
- * @param viewer
213
+ * 3D 瓦片炸开
214
+ * Cesium3DTile[]
117
215
  */
118
- declare const createFloodAnalysis: (viewer: Cesium.Viewer) => IFlood;
216
+ declare const createTilesExplodeHandler: (viewer: Cesium.Viewer) => ITilesExplode;
119
217
 
120
218
  /**
121
- * 填挖方分析
122
- * @param viewer
219
+ * 模型上剖面分析
220
+ * 基于Cesium3DTile[]
123
221
  */
124
- declare const createFillAndDigAnalysis: (viewer: Cesium.Viewer) => IFillDig;
222
+ declare const createTilesProfileHandler: (viewer: Cesium.Viewer) => ITilesProfile;
125
223
 
126
224
  /**
127
- * 淹没分析
128
- * @param viewer
225
+ * 3dtiles 裁切
129
226
  */
130
- declare const createProfileAnalysis: (viewer: Cesium.Viewer) => IProFile<IProFileOptions>;
227
+ declare const createTilesetClipHandler: (viewer: Cesium.Viewer) => ITilesetClip;
131
228
 
132
229
  /**
133
- * 剖面分析(模型上分析)
134
- * 分层分析模型
230
+ * 剖面分析
231
+ * @param viewer
135
232
  */
136
- declare const createModelProfileAnalysis: (viewer: Viewer) => IProFile<IModelProFileOptions>;
233
+ declare const createProfileAnalysis: (viewer: Cesium.Viewer) => IProFile<IProFileOptions>;
137
234
 
138
- export { types as Analysis, createClipPlaneAnalysis, createClipPolygonAnalysis, createFillAndDigAnalysis, createFloodAnalysis, createModelProfileAnalysis, createProfileAnalysis };
139
- export type { IBaseAnalysis, IClipPlane, IClipPlaneOPtions, IClipPolygon, IClipPolygonItem, IClipPolygonPtions, IFillDig, IFillDigItem, IFillDigOptions, IFlood, IFloodItem, IFloodOptions, IModelProFileOptions, IProFile, IProFileItem, IProFileItemData, IProFileOptions };
235
+ export { types as Analysis, createFillVolumeHandler, createGroundClipHandler, createProfileAnalysis, createTilesExplodeHandler, createTilesProfileHandler, createTilesetClipHandler };
236
+ export type { IBaseAnalysis, IFillVolume, IFillVolumeItem, IFillVolumeOptions, IGroundClip, IGroundClipItem, IGroundClipOptions, IProFile, IProFileItem, IProFileItemData, IProFileOptions, ITilesExplode, ITilesExplodeItem, ITilesExplodeOptions, ITilesProfile, ITilesProfileData, ITilesProfileItem, ITilesProfileOptions, ITilesProfileResult, ITilesetClip, ITilesetClipItem, ITilesetClipOptions };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import*as e from"cesium";import{makePositionsForClockwise as o,makePositionsForAntiClockwise as t,makeLnglatsToPositions as i,makePositionsToLnglats as n,numberId as r,makePositionsClose as a,makeLnglatToPosition as s,calcGeodesicDistances as l,calcLerpPosition as c,calcGeodesicDistance as d,makePositiontoLnglat as p}from"@ino-cesium/common";import*as m from"@turf/turf";const g=i=>{const n=new e.ClippingPlaneCollection({edgeColor:e.Color.YELLOW,enabled:!0,modelMatrix:e.Matrix4.IDENTITY,edgeWidth:2});i.scene.globe.clippingPlanes=n,i.scene.globe.backFaceCulling=!1,i.scene.globe.showSkirts=!1;return{set:i=>{Object.assign(i,{unionClippingRegions:!1,...i}),n.unionClippingRegions=i.unionClippingRegions||!1,n.removeAll();let r=i?.positions;r=i.unionClippingRegions?o(r):t(r),r.forEach((o,t)=>{const i=(t+1)%r.length,a=r[i];let s=e.Cartesian3.add(o,a,new e.Cartesian3);s=e.Cartesian3.multiplyByScalar(s,.5,s);const l=e.Cartesian3.normalize(s,new e.Cartesian3);let c=e.Cartesian3.subtract(a,s,new e.Cartesian3);c=e.Cartesian3.normalize(c,c);let d=e.Cartesian3.cross(c,l,new e.Cartesian3);d=e.Cartesian3.normalize(d,d);const p=new e.Plane(d,0),m=e.Plane.getPointDistance(p,s);n.add(new e.ClippingPlane(d,m))})},remove:()=>{n.removeAll()},removeAll:()=>{n.removeAll()},destroy:()=>{}}},h=o=>{const t=new e.ClippingPolygonCollection;o.scene.globe.clippingPolygons=t;const a=new e.CustomDataSource("clipPolygon");o.dataSources.add(a),o.scene.globe.backFaceCulling=!1,o.scene.globe.showSkirts=!1;return{set:o=>{o={inverse:!1,...o};const s=o?.positions,l=new e.ClippingPolygon({positions:s});t.add(l);const c=i(n(s).map(e=>(e.height=-o.depth,e))),d=a.entities.add({polygon:{hierarchy:c,perPositionHeight:!0,material:new e.ImageMaterialProperty({image:"/icons/terrain/poly-soil.jpg"})}});a.entities.add({polygon:{hierarchy:c,perPositionHeight:!0,extrudedHeight:o.depth,material:new e.ImageMaterialProperty({image:"/icons/terrain/poly-soil.jpg"})}});return{id:r(),polygon:l,bottomEntity:d}},remove:()=>{t.isDestroyed()||t.removeAll(),o.scene.globe.clippingPolygons=new e.ClippingPolygonCollection,a.entities.removeAll()},removeAll:()=>{t.isDestroyed()||t.removeAll(),o.scene.globe.clippingPolygons=new e.ClippingPolygonCollection,a.entities.removeAll()},destroy:()=>{}}},y=o=>{const t=new e.CustomDataSource("flood-analysis");o.dataSources.add(t);return{set:e=>{const{positions:o,type:t,speed:i}=e;return console.log(o,e,t,i),{id:r()}},remove:()=>{},removeAll:()=>{t.entities.removeAll()},destroy:()=>{o.dataSources.remove(t)}}},u=o=>{const t=new e.PrimitiveCollection({destroyPrimitives:!1}),i=new e.PrimitiveCollection({destroyPrimitives:!1}),n=new e.PointPrimitiveCollection,s=new e.LabelCollection;i.add(n),t.add(s),t.add(i),o.scene.primitives.add(t);const l=(o,t)=>{o.forEach(o=>{t.add({position:o,color:e.Color.TRANSPARENT})})},c=(o,t)=>{const i=new e.GroundPolylineGeometry({positions:o,width:3}),n=new e.GeometryInstance({geometry:i});t.add(new e.GroundPolylinePrimitive({geometryInstances:n,asynchronous:!1,appearance:new e.MaterialAppearance({translucent:!0,faceForward:!0,material:e.Material.fromType("Color",{color:e.Color.fromCssColorString("#ff00ff").withAlpha(.5)})})}))},d=(o,t)=>{const i=new e.WallGeometry({positions:o}),n=e.WallGeometry.createGeometry(i),r=new e.GeometryInstance({geometry:n});t.add(new e.Primitive({geometryInstances:[r],asynchronous:!1,appearance:new e.MaterialAppearance({translucent:!0,faceForward:!0,material:e.Material.fromType("Color",{color:e.Color.fromCssColorString("#00ff00").withAlpha(.5)})})}))},p=(o,t,i)=>{const n=new e.PolygonGeometry({polygonHierarchy:new e.PolygonHierarchy(o),height:t}),r=new e.GeometryInstance({geometry:n});i.add(new e.Primitive({geometryInstances:[r],asynchronous:!1,appearance:new e.MaterialAppearance({translucent:!0,faceForward:!0,material:e.Material.fromType("Color",{color:e.Color.fromCssColorString("#0088ff").withAlpha(.5)})})}))},g=(o,t,i,n,r)=>{const a=o.map(o=>e.Cartographic.fromCartesian(o).height),s=Math.min(...a),l=Math.max(...a);let c=0;for(let e=0;e<a.length;e++)c+=(a[e]-s)*t*t;const d=e.Cartesian3.fromDegrees(i.geometry.coordinates[0],i.geometry.coordinates[1],l),p={},m=r*l;c?p["挖方体积"]=`${y(c)}方\n`:c=0,m&&(p["填方体积"]=`${y(m-c)}方\n`),r&&(p["横切面积"]=`${y(r)}平方米\n`),s&&(p["最小高程"]=`${y(s)}米\n`),l&&(p["最大高程"]=`${y(l)}米\n`),s&&(p["基准面高程"]=`${y(s)}米`);let g="";Object.keys(p).forEach(e=>{g+=`${e}:${p[e]}`}),n.add({position:d,text:g,font:"16px sans-serif",fillColor:e.Color.WHITE,showBackground:!0,style:e.LabelStyle.FILL_AND_OUTLINE,disableDepthTestDistance:Number.POSITIVE_INFINITY})},h=(o,t,i)=>{o.forEach((o,n)=>{i.add({position:o,text:`高程:${y(t[n].height)}米`,font:"14px sans-serif",fillColor:e.Color.WHITE,showBackground:!0,style:e.LabelStyle.FILL_AND_OUTLINE,disableDepthTestDistance:Number.POSITIVE_INFINITY})})},y=e=>{const o=["","万","百万","千万","亿"];let t=0;for(;e>=1e4&&t<o.length-1;)e/=1e4,t++;return`${e.toFixed(2).replace(/\.?0+$/,"")}${o[t]}`};return{set:y=>{const u=a(y.positions),C=u.map(o=>{const t=e.Cartographic.fromCartesian(o);return{lng:e.Math.toDegrees(t.longitude),lat:e.Math.toDegrees(t.latitude),height:t.height}}),v=Math.min(...C.map(e=>e.height)),w=m.polygon([C.map(e=>[e.lng,e.lat])]),f=m.area(w),P=Math.sqrt(m.area(w)/200),I=m.envelope(w),T=m.centroid(w),b=m.bbox(I),A=m.pointGrid(b,P,{units:"meters"}),M=m.pointsWithinPolygon(A,w).features.map(o=>e.Cartesian3.fromDegrees(o.geometry.coordinates[0],o.geometry.coordinates[1]));return o.scene.clampToHeightMostDetailed(M).then(e=>{l(e,n),p(u,v,t),c(u,i),d(u,t),g(e,P,T,s,f),h(u,C,s)}),{id:r()}},remove:()=>{},removeAll:()=>{s.removeAll(),n.removeAll(),i.removeAll(),t.removeAll(),i.add(n),t.add(i),t.add(s)},destroy:()=>{}}},C=o=>{const t=new e.PrimitiveCollection({destroyPrimitives:!1});let i,n="/icons/markers/mark-icon.png";const a=[];o.scene.primitives.add(t);const m=t=>{if(!t)return i&&o.entities.remove(i),void(i=void 0);i||(i=o.entities.add({position:s(new e.Cartographic(t.longitude,t.latitude,t.height)),billboard:{image:n,scale:.5,verticalOrigin:e.VerticalOrigin.BOTTOM,heightReference:e.HeightReference.CLAMP_TO_GROUND,disableDepthTestDistance:Number.POSITIVE_INFINITY}})),i.position=s(new e.Cartographic(t.longitude,t.latitude,t.height))};return{set:async e=>{e.tipMarkerUrl&&(n=e.tipMarkerUrl);const{positions:t}=e;let i=l(t);const s=Math.floor(i/e.pointDistance);let m=c(t,s);m=await o.scene.clampToHeightMostDetailed(m),i=0;const g=m.map((e,o)=>{let t=0;o>0&&(t=d(m[o-1],e),i+=t);return{...p(e),distance:t,allDistance:i}}),h={id:r(),datas:g};return a.push(h),h},remove:e=>{const o=a.findIndex(o=>o.id===e.id);-1!==o&&a.splice(o,1),m()},removeAll:()=>{t.removeAll(),m()},destroy:()=>{o.scene.primitives.remove(t)},changeTipPoint:m}},v=e=>{const o=new PrimitiveCollection({destroyPrimitives:!1});let t=null,i="";const n=[];e.scene.primitives.add(o);const a=async(o,t,i)=>{const n=JSON.parse(JSON.stringify(o));await e.scene.clampToHeightMostDetailed(n)},d=o=>{if(!o)return t&&e.entities.remove(t),void(t=void 0);t||(t=e.entities.add({position:s(new Cartographic(o.longitude,o.latitude,o.height)),billboard:{image:i,scale:.5,verticalOrigin:VerticalOrigin.BOTTOM,disableDepthTestDistance:Number.POSITIVE_INFINITY}})),t.position=s(new Cartographic(o.longitude,o.latitude,o.height))};return{set:async o=>{o.tipMarkerUrl&&(i=o.tipMarkerUrl);const t=o.layers;return e.terrainProvider instanceof EllipsoidTerrainProvider||(e.terrainProvider,e.terrainProvider=new EllipsoidTerrainProvider),t.forEach(e=>{e.visible=!1}),new Promise(e=>{setTimeout(()=>{const{positions:t}=o,i=l(t),n=Math.floor(i/o.pointDistance),s=c(t,n).filter(e=>e&&e.x&&e.y&&e.z),d={id:r(),datas:[]};a(s),e(d)},500)})},remove:e=>{const o=n.findIndex(o=>o.id===e.id);-1!==o&&n.splice(o,1),d(void 0)},removeAll:()=>{o.removeAll(),d(void 0)},destroy:()=>{e.scene.primitives.remove(o)},changeTipPoint:d}};export{g as createClipPlaneAnalysis,h as createClipPolygonAnalysis,u as createFillAndDigAnalysis,y as createFloodAnalysis,v as createModelProfileAnalysis,C as createProfileAnalysis};
1
+ import{pickPoint as e,makePositionsClose as i,numberId as t,calcLerpPosition as o,makeLnglatsToPositions as n,makePositionsToLnglats as r,calcGeodesicDistances as s,delayTime as l,calcGeodesicDistance as a,makeLnglatToPosition as c,makePositiontoLnglat as g}from"@ino-cesium/common";import*as m from"@turf/turf";import*as p from"cesium";import h from"gsap";const d=o=>{const n=[],r=()=>{n.forEach(e=>{e.vloumePrimitive.removeAll(),o.scene.primitives.remove(e.vloumePrimitive)}),n.length=0};return{set:async e=>{const r=i(e.positions),s=new p.PrimitiveCollection({destroyPrimitives:!1}),l=new p.PrimitiveCollection({destroyPrimitives:!1}),a=new p.PointPrimitiveCollection,c=new p.LabelCollection;l.add(a),s.add(c),s.add(l),o.scene.primitives.add(s);const g=t();let h={};const d=r.map(e=>{const i=p.Cartographic.fromCartesian(e);return{lng:p.Math.toDegrees(i.longitude),lat:p.Math.toDegrees(i.latitude),height:i.height}}),f=Math.min(...d.map(e=>e.height)),P=m.polygon([d.map(e=>[e.lng,e.lat])]),w=m.area(P),C=Math.sqrt(m.area(P)/200),I=m.envelope(P),H=m.centroid(P),b=m.bbox(I),T=m.pointGrid(b,C,{units:"meters"}),S=m.pointsWithinPolygon(T,P).features.map(e=>p.Cartesian3.fromDegrees(e.geometry.coordinates[0],e.geometry.coordinates[1])),M=await o.scene.clampToHeightMostDetailed(S),{maxHeight:D,minHeight:E,digVolume:x,fillVolume:A,volumeLabel:_}=v(M,C,H,c,w,f),N=u(r,f,s);return function(e,i,t,o){const n=p.WallGeometry.fromConstantHeights({positions:e,minimumHeight:t,maximumHeight:i}),r=p.WallGeometry.createGeometry(n),s=new p.GeometryInstance({geometry:r});o.add(new p.Primitive({geometryInstances:[s],asynchronous:!1,appearance:new p.MaterialAppearance({translucent:!0,faceForward:!0,material:p.Material.fromType("Color",{color:p.Color.fromCssColorString("#00ff00").withAlpha(.5)})})}))}(r,D,E,s),function(e,i,t){e.forEach((e,o)=>{t.add({position:e,text:`高程:${y(i[o].height)}米`,font:"14px sans-serif",fillColor:p.Color.WHITE,showBackground:!0,style:p.LabelStyle.FILL_AND_OUTLINE,disableDepthTestDistance:Number.POSITIVE_INFINITY})})}(r,d,c),h={id:g,maxHeight:D,minHeight:E,baseHeight:f,digVolume:x,fillVolume:A,cellsize:C,positions:r,centroid:H,area:w,heightPositions:M,polygonPrimitive:N,linePrimitive:l,labelPrimitive:c,vloumePrimitive:s,volumeLabel:_},n.push(h),h},changeBaseHeight:async i=>{const t=n.findIndex(e=>e.id===i.id);if(-1===t)return;const r=n[t];let s=(await e(o)).lnglat.height;s>i.maxHeight&&(s=i.maxHeight),s<i.minHeight&&(s=i.minHeight),r.baseHeight=Number(s.toFixed(2));const l=r.vloumePrimitive,a=r.labelPrimitive;r.polygonPrimitive&&l.remove(r.polygonPrimitive),r.volumeLabel&&a.remove(r.volumeLabel);const{positions:c,baseHeight:g,heightPositions:m,cellsize:p,centroid:h,area:d}=r,y=u(c,g,l),{digVolume:f,fillVolume:P,volumeLabel:w}=v(m,p,h,a,d,g);n[t]={...r,digVolume:f,fillVolume:P,polygonPrimitive:y,volumeLabel:w}},remove:e=>{const i=n.findIndex(i=>i.id===e.id);-1!==i&&(e.vloumePrimitive.removeAll(),o.scene.primitives.remove(e.vloumePrimitive),n.splice(i,1))},removeAll:r,destroy:()=>{r()}}};function u(e,i,t){const o=new p.PolygonGeometry({polygonHierarchy:new p.PolygonHierarchy(e),height:i}),n=new p.GeometryInstance({geometry:o});return t.add(new p.Primitive({allowPicking:!1,asynchronous:!1,geometryInstances:[n],appearance:new p.MaterialAppearance({translucent:!0,faceForward:!0,material:p.Material.fromType("Color",{color:p.Color.fromCssColorString("#0088ff").withAlpha(.5)})})}))}function v(e,i,t,o,n,r){const s=e.map(e=>p.Cartographic.fromCartesian(e).height),l=Math.min(...s),a=Math.max(...s);let c=0;for(let e=0;e<s.length;e++)s[e]-r>0&&(c+=(s[e]-r)*i*i);let g=0;for(let e=0;e<s.length;e++)r-s[e]>0&&(g+=(r-s[e])*i*i);const m=p.Cartesian3.fromDegrees(t.geometry.coordinates[0],t.geometry.coordinates[1],a),h={};c?h["挖方体积"]=`${y(c)}方\n`:c=0,g?h["填方体积"]=`${y(g)}方\n`:g=0,n&&(h["横切面积"]=`${y(n)}平方米\n`),l&&(h["最小高程"]=`${y(l)}米\n`),a&&(h["最大高程"]=`${y(a)}米\n`),l&&(h["基准面高程"]=`${y(r)}米`);let d="";Object.keys(h).forEach(e=>{d+=`${e}:${h[e]}`});return{maxHeight:a,minHeight:l,digVolume:c,fillVolume:g,volumeLabel:o.add({position:m,text:d,font:"16px sans-serif",fillColor:p.Color.WHITE,showBackground:!0,style:p.LabelStyle.FILL_AND_OUTLINE,disableDepthTestDistance:Number.POSITIVE_INFINITY})}}function y(e){const i=["","万","百万","千万","亿"];let t=0;for(;e>=1e4&&t<i.length-1;)e/=1e4,t++;return`${e.toFixed(2).replace(/\.?0+$/,"")}${i[t]}`}const f=e=>{const s=new p.ClippingPolygonCollection({polygons:[]});e.scene.globe.clippingPolygons=s;const l=[],a=new p.CustomDataSource("ground-clip");e.dataSources.add(a);const c=()=>{s.isDestroyed()||s.removeAll(),l.length=0,a.entities.removeAll()};return{set:async c=>{if(s.isDestroyed())throw new Error("对象已被销毁");c={interCount:50,...c};let g=o(i(c.positions),c.interCount);g=await e.scene.clampToHeightMostDetailed(g);const m=[],h=n(r(g).map(e=>(m.push(e.height),e.height=-c.depth,e))),d=m.map(e=>e-c.depth),u=Math.min(...d),v=Array.from({length:d.length}).fill(u),y=a.entities.add({wall:{positions:h,minimumHeights:v,maximumHeights:m,material:new p.ImageMaterialProperty({image:`${window.INO_CESIUM_BASE_URL}/assets/images/ground-clip/wall.jpg`})},polygon:{hierarchy:h,height:u,material:new p.ImageMaterialProperty({image:`${window.INO_CESIUM_BASE_URL}/assets/images/ground-clip/poly-soil.jpg`})}}),f=new p.ClippingPolygon({positions:g});s.add(f);const P={id:t(),positions:g,clipPolygon:f,clipEntity:y};return l.push(P),P},remove:i=>{const t=l.findIndex(e=>e.id===i.id);-1!==t&&(l.splice(t,1),a.entities.remove(i.clipEntity),e.scene.globe.clippingPolygons.remove(i.clipPolygon))},removeAll:c,destroy:()=>{c(),s.destroy(),e.scene.globe.clippingPolygons=new p.ClippingPolygonCollection}}},P=e=>{const i=[];e.scene.logarithmicDepthBuffer=!1;const o=e=>{const{tiles:i,fromHeight:t,toHeight:o}=e;return new Promise(n=>{const r=[];console.log(i),i.forEach((i,t)=>{const n=p.Cartesian3.fromElements(0,0,o*(t+1),new p.Cartesian3),s=p.Matrix4.fromTranslation(n),l=p.BoundingSphere.clone(e.originBoundingSpheres[t]),a=p.BoundingSphere.transform(l,s);r.push(a)});const s=i[0].tileset;r.push(s.boundingSphere),s._newBoundingSphere=p.BoundingSphere.fromBoundingSpheres(r);const l={value:o},a={value:t};h.to(a,{...l,duration:2,delay:.5,onUpdate:()=>{i.forEach((e,i)=>{const t=a.value*(i+1),o=p.Cartesian3.fromElements(0,0,t,new p.Cartesian3),n=p.Matrix4.fromTranslation(o);e.transform=n})},onComplete:()=>{}}),n(!0)})},n=()=>{i.forEach(e=>{e.fromHeight=e.toHeight,e.toHeight=0,o(e),e.tiles[0].tileset._newBoundingSphere=void 0}),i.length=0};return{set:async e=>{const{tiles:n,height:r}=e,s=n.map(e=>p.BoundingSphere.clone(e.boundingSphere)),l={id:t(),tiles:n,originBoundingSpheres:s,fromHeight:0,toHeight:r};return n.length&&r?(await o(l),i.push(l),l):l},changeHeight:async(e,i)=>{e.fromHeight=e.toHeight,e.toHeight=i,e.toHeight!==e.fromHeight&&await o(e)},remove:async e=>{const t=i.findIndex(i=>i.id===e.id);-1!==t&&(e.fromHeight=e.toHeight,e.toHeight=0,await o(e),e.tiles[0].tileset._newBoundingSphere=void 0,i.splice(t,1))},removeAll:n,destroy:()=>{n()}}},w=e=>{const i=[];let n;const r=()=>{i.length=0};return{set:async n=>{const{tileSetLoader:r}=n,c=r.getFeatures();let g=r.tileset.root.children;c.length||(g=[g[0]]);const m={id:t(),tiles:g,results:[]};if(!g.length||!n.positions.length)return m;n.distance||(n.distance=10);const h=n.positions,d=s(h),u=Math.floor(d/n.distance),v=o(h,u),y=[];let f=0,P=null;e.terrainProvider instanceof p.EllipsoidTerrainProvider||(P=e.terrainProvider,e.terrainProvider=new p.EllipsoidTerrainProvider);const w=g.map(e=>e._tileId);for(const i of g){r.setVisibleByTileId(w,!1),n.progress&&n.progress(f,i),await l(1e3),r.setVisibleByTileId([i._tileId],!0);let t=JSON.parse(JSON.stringify(v));t=await e.scene.clampToHeightMostDetailed(t);let o=0;const s=t.map((e,i)=>{const n=p.Cartographic.fromCartesian(e);return i>0&&(o+=a(t[i-1],e)),{height:n.height,distance:o,positionIndex:i,position:e,allDistance:d}});f+=1,y.push({datas:s,name:i._tileId,index:f})}return m.results=y,i.push(m),P&&(e.terrainProvider=P),m},changeTipPoint:i=>{if(!i)return n&&e.entities.remove(n),void(n=void 0);n||(n=e.entities.add({position:i.position,billboard:{image:"/earth/images/marker-2d.png",scale:.5,verticalOrigin:p.VerticalOrigin.BOTTOM,disableDepthTestDistance:Number.POSITIVE_INFINITY}})),n.position=i.position},remove:e=>{const t=i.findIndex(i=>i.id===e.id);-1!==t&&i.splice(t,1)},removeAll:r,destroy:()=>{r()}}},C=e=>{const i=[],o=async n=>{if(!n.tileset)return(async i=>{const t=e.scene.primitives._primitives.filter(e=>e instanceof p.Cesium3DTileset),n=[];for(const e of t){const t=await o({positions:i.positions,inverse:i.inverse,tileset:e});n.push(t)}return n})(n);const r=n.positions,s=new p.ClippingPolygon({positions:r});n.tileset.clippingPolygons?n.tileset.clippingPolygons.add(s):n.tileset.clippingPolygons=new p.ClippingPolygonCollection({polygons:[s],inverse:n.inverse});const l={id:t(),tileset:n.tileset,clipPolygon:s};return i.push(l),l},n=e=>{e?e.clippingPolygons.removeAll():(i.forEach(e=>{e.tileset.clippingPolygons.removeAll()}),i.length=0)},r=(e,i)=>{i?i.tileset.clippingPolygons&&(i.tileset.clippingPolygons=new p.ClippingPolygonCollection({polygons:i.tileset.clippingPolygons._polygons,inverse:e})):s(e)},s=e=>{i.forEach(i=>{r(e,i)})};return{set:o,remove:e=>{e.clipPolygon&&e.tileset.clippingPolygons.remove(e.clipPolygon)},setInverse:r,setInverseAll:s,removeAll:n,destroy:()=>{n()}}},I=e=>{const i=new p.PrimitiveCollection({destroyPrimitives:!1});let n,r="/icons/markers/mark-icon.png";const l=[];e.scene.primitives.add(i);const m=i=>{if(!i)return n&&e.entities.remove(n),void(n=void 0);n||(n=e.entities.add({position:c(new p.Cartographic(i.longitude,i.latitude,i.height)),billboard:{image:r,scale:.5,verticalOrigin:p.VerticalOrigin.BOTTOM,heightReference:p.HeightReference.CLAMP_TO_GROUND,disableDepthTestDistance:Number.POSITIVE_INFINITY}})),n.position=c(new p.Cartographic(i.longitude,i.latitude,i.height))};return{set:async i=>{i.tipMarkerUrl&&(r=i.tipMarkerUrl);const{positions:n}=i;let c=s(n);const m=Math.floor(c/i.pointDistance);let p=o(n,m);p=await e.scene.clampToHeightMostDetailed(p),c=0;const h=p.map((e,i)=>{let t=0;i>0&&(t=a(p[i-1],e),c+=t);return{...g(e),distance:t,allDistance:c}}),d={id:t(),datas:h};return l.push(d),d},remove:e=>{const i=l.findIndex(i=>i.id===e.id);-1!==i&&l.splice(i,1),m()},removeAll:()=>{i.removeAll(),m()},destroy:()=>{e.scene.primitives.remove(i)},changeTipPoint:m}};export{d as createFillVolumeHandler,f as createGroundClipHandler,I as createProfileAnalysis,P as createTilesExplodeHandler,w as createTilesProfileHandler,C as createTilesetClipHandler};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ino-cesium/analysis",
3
3
  "type": "module",
4
- "version": "0.0.21",
4
+ "version": "0.0.22-beta.1",
5
5
  "author": "koino",
6
6
  "keywords": [
7
7
  "cesium",
@@ -25,11 +25,12 @@
25
25
  "README.MD"
26
26
  ],
27
27
  "peerDependencies": {
28
- "cesium": "1.131.0"
28
+ "cesium": "1.134.0"
29
29
  },
30
30
  "dependencies": {
31
31
  "@turf/turf": "^7.0.0",
32
- "@ino-cesium/common": "0.0.21"
32
+ "gsap": "^3.12.5",
33
+ "@ino-cesium/common": "0.0.22-beta.1"
33
34
  },
34
35
  "scripts": {
35
36
  "build": "rimraf dist && rollup -c",