@ino-cesium/analysis 0.0.21-beta.3 → 0.0.22-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +154 -57
- package/dist/index.js +1 -1
- package/package.json +4 -3
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
|
|
9
|
+
interface IGroundClip extends IBaseAnalysis<IGroundClipOptions, IGroundClipItem> {
|
|
10
10
|
}
|
|
11
|
-
interface
|
|
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
|
|
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
|
|
36
|
+
interface ITilesetClipOptions {
|
|
19
37
|
positions: Cesium.Cartesian3[];
|
|
20
|
-
|
|
21
|
-
|
|
38
|
+
inverse: boolean;
|
|
39
|
+
tileset: Cesium.Cesium3DTileset;
|
|
22
40
|
}
|
|
23
|
-
interface
|
|
41
|
+
interface ITilesetClipItem {
|
|
24
42
|
id: string;
|
|
25
|
-
|
|
26
|
-
|
|
43
|
+
tileset: Cesium.Cesium3DTileset;
|
|
44
|
+
clipPolygon?: Cesium.ClippingPolygon;
|
|
27
45
|
}
|
|
28
|
-
interface
|
|
46
|
+
interface IFillVolume extends IBaseAnalysis<IFillVolumeOptions, IFillVolumeItem> {
|
|
47
|
+
changeBaseHeight: (item: IFillVolumeItem) => void;
|
|
29
48
|
}
|
|
30
|
-
interface
|
|
49
|
+
interface IFillVolumeOptions {
|
|
31
50
|
positions: Cesium.Cartesian3[];
|
|
32
|
-
type: 'model' | 'terrain';
|
|
33
|
-
speed: number;
|
|
34
51
|
}
|
|
35
|
-
interface
|
|
52
|
+
interface IFillVolumeItem {
|
|
36
53
|
id: string;
|
|
37
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
85
|
-
type
|
|
86
|
-
type
|
|
87
|
-
type
|
|
88
|
-
type
|
|
89
|
-
type
|
|
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,
|
|
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
|
|
205
|
+
declare const createFillVolumeHandler: (viewer: Cesium.Viewer) => IFillVolume;
|
|
108
206
|
|
|
109
207
|
/**
|
|
110
|
-
*
|
|
208
|
+
* 地形裁剪 , 地形开挖
|
|
111
209
|
*/
|
|
112
|
-
declare const
|
|
210
|
+
declare const createGroundClipHandler: (viewer: Cesium.Viewer) => IGroundClip;
|
|
113
211
|
|
|
114
212
|
/**
|
|
115
|
-
*
|
|
116
|
-
*
|
|
213
|
+
* 3D 瓦片炸开
|
|
214
|
+
* Cesium3DTile[]
|
|
117
215
|
*/
|
|
118
|
-
declare const
|
|
216
|
+
declare const createTilesExplodeHandler: (viewer: Cesium.Viewer) => ITilesExplode;
|
|
119
217
|
|
|
120
218
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
219
|
+
* 模型上剖面分析
|
|
220
|
+
* 基于Cesium3DTile[]
|
|
123
221
|
*/
|
|
124
|
-
declare const
|
|
222
|
+
declare const createTilesProfileHandler: (viewer: Cesium.Viewer) => ITilesProfile;
|
|
125
223
|
|
|
126
224
|
/**
|
|
127
|
-
*
|
|
128
|
-
* @param viewer
|
|
225
|
+
* 3dtiles 裁切
|
|
129
226
|
*/
|
|
130
|
-
declare const
|
|
227
|
+
declare const createTilesetClipHandler: (viewer: Cesium.Viewer) => ITilesetClip;
|
|
131
228
|
|
|
132
229
|
/**
|
|
133
|
-
* 剖面分析
|
|
134
|
-
*
|
|
230
|
+
* 剖面分析
|
|
231
|
+
* @param viewer
|
|
135
232
|
*/
|
|
136
|
-
declare const
|
|
233
|
+
declare const createProfileAnalysis: (viewer: Cesium.Viewer) => IProFile<IProFileOptions>;
|
|
137
234
|
|
|
138
|
-
export { types as Analysis,
|
|
139
|
-
export type { IBaseAnalysis,
|
|
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.
|
|
4
|
+
"version": "0.0.22-beta.0",
|
|
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.
|
|
28
|
+
"cesium": "1.134.0"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@turf/turf": "^7.0.0",
|
|
32
|
-
"
|
|
32
|
+
"gsap": "^3.12.5",
|
|
33
|
+
"@ino-cesium/common": "0.0.22-beta.0"
|
|
33
34
|
},
|
|
34
35
|
"scripts": {
|
|
35
36
|
"build": "rimraf dist && rollup -c",
|