@ino-cesium/analysis 0.0.2

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 ADDED
@@ -0,0 +1,2 @@
1
+ # ino-cesium 分析
2
+ 分析
@@ -0,0 +1,139 @@
1
+ import * as Cesium from 'cesium';
2
+ import { Viewer } from 'cesium';
3
+
4
+ interface IBaseAnalysis<T, R> {
5
+ set: (options: T) => R;
6
+ remove: (item: R) => void;
7
+ removeAll: () => void;
8
+ destroy: () => void;
9
+ }
10
+ interface IClipPlane extends IBaseAnalysis<IClipPlaneOPtions, any> {
11
+ }
12
+ interface IClipPlaneOPtions {
13
+ positions: Cesium.Cartesian3[];
14
+ depth: number;
15
+ unionClippingRegions?: boolean;
16
+ }
17
+ interface IClipPolygon extends IBaseAnalysis<IClipPolygonPtions, IClipPolygonItem> {
18
+ }
19
+ interface IClipPolygonPtions {
20
+ positions: Cesium.Cartesian3[];
21
+ depth: number;
22
+ inverse?: boolean;
23
+ }
24
+ interface IClipPolygonItem {
25
+ id: string;
26
+ polygon: Cesium.ClippingPolygon;
27
+ bottomEntity: Cesium.Entity;
28
+ }
29
+ interface IFlood extends IBaseAnalysis<IFloodOptions, IFloodItem> {
30
+ }
31
+ interface IFloodOptions {
32
+ positions: Cesium.Cartesian3[];
33
+ type: 'model' | 'terrain';
34
+ speed: number;
35
+ }
36
+ interface IFloodItem {
37
+ id: string;
38
+ polygon: Cesium.Entity;
39
+ }
40
+ interface IFillDig extends IBaseAnalysis<IFillDigOptions, IFillDigItem> {
41
+ }
42
+ interface IFillDigOptions {
43
+ positions: Cesium.Cartesian3[];
44
+ }
45
+ interface IFillDigItem {
46
+ id: string;
47
+ }
48
+ interface IProFile<T> {
49
+ set: (options: T) => Promise<IProFileItem>;
50
+ remove: (item: IProFileItem) => void;
51
+ removeAll: () => void;
52
+ destroy: () => void;
53
+ changeTipPoint: (data?: IProFileItemData) => void;
54
+ }
55
+ interface IProFileOptions {
56
+ positions: Cesium.Cartesian3[];
57
+ /**
58
+ * 插值点距离
59
+ * 根据距离和线的长度计算插值点数量
60
+ * 单位为米
61
+ */
62
+ pointDistance: number;
63
+ tipMarkerUrl?: string;
64
+ }
65
+ interface IProFileItem {
66
+ id: string;
67
+ datas: IProFileItemData[];
68
+ }
69
+ interface IProFileItemData {
70
+ longitude: number;
71
+ latitude: number;
72
+ height: number;
73
+ distance: number;
74
+ allDistance: number;
75
+ }
76
+ interface IModelProFileOptions extends IProFileOptions {
77
+ layers: any;
78
+ /**
79
+ * 分析进度
80
+ */
81
+ progress: (data: IProFileItemData) => void;
82
+ }
83
+
84
+ type types_IBaseAnalysis<T, R> = IBaseAnalysis<T, R>;
85
+ type types_IClipPlane = IClipPlane;
86
+ type types_IClipPlaneOPtions = IClipPlaneOPtions;
87
+ type types_IClipPolygon = IClipPolygon;
88
+ type types_IClipPolygonItem = IClipPolygonItem;
89
+ type types_IClipPolygonPtions = IClipPolygonPtions;
90
+ type types_IFillDig = IFillDig;
91
+ type types_IFillDigItem = IFillDigItem;
92
+ type types_IFillDigOptions = IFillDigOptions;
93
+ type types_IFlood = IFlood;
94
+ type types_IFloodItem = IFloodItem;
95
+ type types_IFloodOptions = IFloodOptions;
96
+ type types_IModelProFileOptions = IModelProFileOptions;
97
+ type types_IProFile<T> = IProFile<T>;
98
+ type types_IProFileItem = IProFileItem;
99
+ type types_IProFileItemData = IProFileItemData;
100
+ type types_IProFileOptions = IProFileOptions;
101
+ declare namespace types {
102
+ 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 };
103
+ }
104
+
105
+ /**
106
+ * 地形开挖
107
+ */
108
+ declare const createClipPlaneAnalysis: (viewer: Cesium.Viewer) => IClipPlane;
109
+
110
+ /**
111
+ * 裁剪面分析,
112
+ */
113
+ declare const createClipPolygonAnalysis: (viewer: Cesium.Viewer) => IClipPolygon;
114
+
115
+ /**
116
+ * 淹没分析
117
+ * @param viewer
118
+ */
119
+ declare const createFloodAnalysis: (viewer: Cesium.Viewer) => IFlood;
120
+
121
+ /**
122
+ * 填挖方分析
123
+ * @param viewer
124
+ */
125
+ declare const createFillAndDigAnalysis: (viewer: Cesium.Viewer) => IFillDig;
126
+
127
+ /**
128
+ * 淹没分析
129
+ * @param viewer
130
+ */
131
+ declare const createProfileAnalysis: (viewer: Cesium.Viewer) => IProFile<IProFileOptions>;
132
+
133
+ /**
134
+ * 剖面分析(模型上分析)
135
+ * 分层分析模型
136
+ */
137
+ declare const createModelProfileAnalysis: (viewer: Viewer) => IProFile<IModelProFileOptions>;
138
+
139
+ export { types as Analysis, createClipPlaneAnalysis, createClipPolygonAnalysis, createFillAndDigAnalysis, createFloodAnalysis, createModelProfileAnalysis, createProfileAnalysis };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ import*as e from"cesium";import{PrimitiveCollection as o,VerticalOrigin as t,Cartographic as i,EllipsoidTerrainProvider as n}from"cesium";import{makePositionsForClockwise as r,makePositionsForAntiClockwise as a,makeLnglatsToPositions as s,makePositionsToLnglats as l,numberId as c,makePositionsClose as d,makeLnglatToPosition as m,calcGeodesicDistances as p,calcLerpPosition as g,calcGeodesicDistance as h,makePositiontoLnglat as y}from"@ino-cesium/common";import*as u from"@turf/turf";const C=o=>{const t=new e.ClippingPlaneCollection({edgeColor:e.Color.YELLOW,enabled:!0,modelMatrix:e.Matrix4.IDENTITY,edgeWidth:2});o.scene.globe.clippingPlanes=t,o.scene.globe.backFaceCulling=!1,o.scene.globe.showSkirts=!1;return{set:o=>{Object.assign(o,{unionClippingRegions:!1,...o}),t.unionClippingRegions=o.unionClippingRegions||!1,t.removeAll();let i=o?.positions;i=o.unionClippingRegions?r(i):a(i),i.forEach(((o,n)=>{const r=(n+1)%i.length,a=i[r];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 m=new e.Plane(d,0),p=e.Plane.getPointDistance(m,s);t.add(new e.ClippingPlane(d,p))}))},remove:()=>{t.removeAll()},removeAll:()=>{t.removeAll()},destroy:()=>{}}},v=o=>{const t=new e.ClippingPolygonCollection;o.scene.globe.clippingPolygons=t;const i=new e.CustomDataSource("clipPolygon");o.dataSources.add(i),o.scene.globe.backFaceCulling=!1,o.scene.globe.showSkirts=!1;return{set:o=>{o={inverse:!1,...o};const n=o?.positions,r=new e.ClippingPolygon({positions:n});t.add(r);const a=s(l(n).map((e=>(e.height=-o.depth,e)))),d=i.entities.add({polygon:{hierarchy:a,perPositionHeight:!0,material:new e.ImageMaterialProperty({image:"/icons/terrain/poly-soil.jpg"})}});i.entities.add({polygon:{hierarchy:a,perPositionHeight:!0,extrudedHeight:o.depth,material:new e.ImageMaterialProperty({image:"/icons/terrain/poly-soil.jpg"})}});return{id:c(),polygon:r,bottomEntity:d}},remove:()=>{t.isDestroyed()||t.removeAll(),o.scene.globe.clippingPolygons=new e.ClippingPolygonCollection,i.entities.removeAll()},removeAll:()=>{t.isDestroyed()||t.removeAll(),o.scene.globe.clippingPolygons=new e.ClippingPolygonCollection,i.entities.removeAll()},destroy:()=>{}}},f=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:c()}},remove:()=>{},removeAll:()=>{t.entities.removeAll()},destroy:()=>{o.dataSources.remove(t)}}},w=o=>{const t=new e.PrimitiveCollection({destroyPrimitives:!1}),i=new e.PrimitiveCollection({destroyPrimitives:!1}),n=new e.PointPrimitiveCollection,r=new e.LabelCollection;i.add(n),t.add(r),t.add(i),o.scene.primitives.add(t);const a=(o,t)=>{o.forEach((o=>{t.add({position:o,color:e.Color.TRANSPARENT})}))},s=(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)})})}))},l=(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)})})}))},m=(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)})})}))},p=(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),m={},p=r*l;c?m["挖方体积"]=`${h(c)}方\n`:c=0,p&&(m["填方体积"]=`${h(p-c)}方\n`),r&&(m["横切面积"]=`${h(r)}平方米\n`),s&&(m["最小高程"]=`${h(s)}米\n`),l&&(m["最大高程"]=`${h(l)}米\n`),s&&(m["基准面高程"]=`${h(s)}米`);let g="";Object.keys(m).forEach((e=>{g+=`${e}:${m[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})},g=(o,t,i)=>{o.forEach(((o,n)=>{i.add({position:o,text:`高程:${h(t[n].height)}米`,font:"14px sans-serif",fillColor:e.Color.WHITE,showBackground:!0,style:e.LabelStyle.FILL_AND_OUTLINE,disableDepthTestDistance:Number.POSITIVE_INFINITY})}))},h=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:h=>{const y=d(h.positions),C=y.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))),f=u.polygon([C.map((e=>[e.lng,e.lat]))]),w=u.area(f),P=Math.sqrt(u.area(f)/200),I=u.envelope(f),T=u.centroid(f),b=u.bbox(I),A=u.pointGrid(b,P,{units:"meters"}),M=u.pointsWithinPolygon(A,f).features.map((o=>e.Cartesian3.fromDegrees(o.geometry.coordinates[0],o.geometry.coordinates[1])));return o.scene.clampToHeightMostDetailed(M).then((e=>{a(e,n),m(y,v,t),s(y,i),l(y,t),p(e,P,T,r,w),g(y,C,r)})),{id:c()}},remove:()=>{},removeAll:()=>{r.removeAll(),n.removeAll(),i.removeAll(),t.removeAll(),i.add(n),t.add(i),t.add(r)},destroy:()=>{}}},P=o=>{const t=new e.PrimitiveCollection({destroyPrimitives:!1});let i,n="/icons/markers/mark-icon.png";const r=[];o.scene.primitives.add(t);const a=t=>{if(!t)return i&&o.entities.remove(i),void(i=void 0);i||(i=o.entities.add({position:m(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=m(new e.Cartographic(t.longitude,t.latitude,t.height))};return{set:async e=>{e.tipMarkerUrl&&(n=e.tipMarkerUrl);const{positions:t}=e;let i=p(t);const a=Math.floor(i/e.pointDistance);let s=g(t,a);s=await o.scene.clampToHeightMostDetailed(s),i=0;const l=s.map(((e,o)=>{let t=0;o>0&&(t=h(s[o-1],e),i+=t);return{...y(e),distance:t,allDistance:i}})),d={id:c(),datas:l};return r.push(d),d},remove:e=>{const o=r.findIndex((o=>o.id===e.id));-1!==o&&r.splice(o,1),a()},removeAll:()=>{t.removeAll(),a()},destroy:()=>{o.scene.primitives.remove(t)},changeTipPoint:a}},I=e=>{const r=new o({destroyPrimitives:!1});let a=null,s="";const l=[];e.scene.primitives.add(r);const d=async(o,t,i)=>{const n=JSON.parse(JSON.stringify(o));await e.scene.clampToHeightMostDetailed(n)},h=o=>{if(!o)return a&&e.entities.remove(a),void(a=void 0);a||(a=e.entities.add({position:m(new i(o.longitude,o.latitude,o.height)),billboard:{image:s,scale:.5,verticalOrigin:t.BOTTOM,disableDepthTestDistance:Number.POSITIVE_INFINITY}})),a.position=m(new i(o.longitude,o.latitude,o.height))};return{set:async o=>{o.tipMarkerUrl&&(s=o.tipMarkerUrl);const t=o.layers;return e.terrainProvider instanceof n||(e.terrainProvider,e.terrainProvider=new n),t.forEach((e=>{e.visible=!1})),new Promise((e=>{setTimeout((()=>{const{positions:t}=o,i=p(t),n=Math.floor(i/o.pointDistance),r=g(t,n).filter((e=>e&&e.x&&e.y&&e.z)),a={id:c(),datas:[]};d(r),e(a)}),500)}))},remove:e=>{const o=l.findIndex((o=>o.id===e.id));-1!==o&&l.splice(o,1),h(void 0)},removeAll:()=>{r.removeAll(),h(void 0)},destroy:()=>{e.scene.primitives.remove(r)},changeTipPoint:h}};export{C as createClipPlaneAnalysis,v as createClipPolygonAnalysis,w as createFillAndDigAnalysis,f as createFloodAnalysis,I as createModelProfileAnalysis,P as createProfileAnalysis};
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@ino-cesium/analysis",
3
+ "type": "module",
4
+ "version": "0.0.2",
5
+ "author": "koino",
6
+ "keywords": [
7
+ "cesium",
8
+ "ino-cesium",
9
+ "ino-cesium-analysis"
10
+ ],
11
+ "exports": {
12
+ ".": "./src/index.js"
13
+ },
14
+ "typesVersions": {
15
+ "*": {
16
+ "*": [
17
+ "./src/*"
18
+ ]
19
+ }
20
+ },
21
+ "files": [
22
+ "dist/*.d.ts",
23
+ "dist/*.js",
24
+ "README.MD"
25
+ ],
26
+ "publishConfig": {
27
+ "access": "public"
28
+ },
29
+ "peerDependencies": {
30
+ "cesium": "*"
31
+ },
32
+ "dependencies": {
33
+ "@ino-cesium/common": "0.0.2"
34
+ },
35
+ "scripts": {
36
+ "build": "rimraf dist && rollup -c",
37
+ "clean": "rimraf dist",
38
+ "release": "pnpm publish --no-git-checks --access public ",
39
+ "unpublish": "pnpm unpublish @ino-cesium/analysis --force "
40
+ }
41
+ }