tsg-web/src/views/Home/MapCtrl/Map3D/demo.js

743 lines
26 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

const { Cesium } = window;
export default class LayerMgr {
constructor() {
// this.viewer = viewer
}
//加载模型
getGltf(viewer) {
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(114.97, 31.47,250),
model: {
uri: `${process.env.PUBLIC_URL}/models/dam/scene.gltf` ,
scale: 10,
runAnimations: false
},
});
}
getWater(viewer) {
const positions = [
114.96554141845703, 31.487516479492188,
114.993221862792957, 31.487516479492188,
114.993221862792957, 31.4622646484375,
114.96554141845703, 31.4622646484375,
]
let initialHeight = 120
const geometry = new Cesium.PolygonGeometry({
polygonHierarchy: new Cesium.PolygonHierarchy(
Cesium.Cartesian3.fromDegreesArray(positions)
),
extrudedHeight: initialHeight,
perPositionHeight:false,
});
const waterPrimitive = new Cesium.Primitive({
geometryInstances: new Cesium.GeometryInstance({ geometry }),
appearance: new Cesium.EllipsoidSurfaceAppearance({
aboveGround: true,
material: new Cesium.Material({
fabric: {
type: 'Water',
uniforms: {
normalMap: Cesium.buildModuleUrl(
`${process.env.PUBLIC_URL}/models/waternormals.jpg`
),
frequency: 1000.0,
animationSpeed: 0.01,
amplitude: 10,
},
},
}),
}),
show: true,
// releaseGeometryInstances: false
});
viewer.scene.primitives.add(waterPrimitive);
// 自动抬升
let height = 0;
setInterval(() => {
if (height < 0.4) {
height += 0.001;
// height += 0.02;
// waterPrimitive.extrudedHeight = height; // 触发setter
var currentModelMatrix = Cesium.Matrix4.clone(waterPrimitive.modelMatrix);
// 定义平移向量例如沿x轴平移100单位
var translation = new Cesium.Cartesian3(-height*0.7, height, height*0.8);
// 创建一个平移矩阵
var translationMatrix = Cesium.Matrix4.fromTranslation(translation);
// 计算新的modelMatrix将平移矩阵应用到当前模型矩阵上
var newModelMatrix = Cesium.Matrix4.multiply(translationMatrix, currentModelMatrix, new Cesium.Matrix4());
waterPrimitive.modelMatrix = newModelMatrix;
}
}, 100);
}
getWater2(viewer) {
// const waterSurface = viewer.entities.add({
// rectangle: {
// coordinates: Cesium.Rectangle.fromDegrees(114.9, 31.4, 115.9, 32.4),
// material: new Cesium.WaterMaterial({
// normalMapUrl: `${process.env.PUBLIC_URL}/models/waternormals.jpg`, // 水波纹法线贴图
// frequency: 1000.0, // 波纹密度
// animationSpeed: 0.05, // 波动速度
// amplitude: 5.0 // 波高
// }),
// height: 130.0 // 水面高度(可动态调整)
// }
// });
}
async getQxsy(viewer) {
try {
let tileset = await Cesium.Cesium3DTileset.fromUrl(
// 'http://res3d.oss-cn-shenzhen.aliyuncs.com/macheng/xiaoyutan/Scene/3DTILE.json',
'https://map1.oss-cn-shenzhen.aliyuncs.com/tsg/tiles/tileset.json',
{
maximumScreenSpaceError: 20, //精细程度越小越精细
maximumMemoryUsage: 1000, //不可设置太高,目标机子空闲内存值以内,防止浏览器过于卡
}
);
viewer.scene.primitives.add(tileset);
const offsetHeight = 10
const boundingSphere = tileset.boundingSphere
const cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center)
const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0)
const offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, offsetHeight)
const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3())
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation)
// viewer.flyTo(tileset)
} catch (error) {
console.error(`Error creating tileset: ${error}`);
}
// fetch(`${process.env.PUBLIC_URL}/data/geojson/macheng/boua.geojson`)
// .then(resp => resp.json())
// .then(data => {
// let features = data.features;
// let positionArray = [];
// // 获取区域的经纬度坐标
// for (let i = 0; i < features[0].geometry.coordinates[0].length; i++) {
// let coor = features[0].geometry.coordinates[0][i];
// positionArray.push(coor[0]);
// positionArray.push(coor[1]);
// }
// // 遮罩
// let polygonEntity = new Cesium.Entity({
// polygon: {
// hierarchy: {
// // 添加外部区域为1/4半圆设置为180会报错 [0, 0, 0, 90, 179, 90, 179, 0]
// positions: Cesium.Cartesian3.fromDegreesArray([100, 0, 100, 89, 150, 89, 150, 0]),
// // 中心挖空的“洞”
// holes: [{
// positions: Cesium.Cartesian3.fromDegreesArray(positionArray)
// }]
// },
// material: Cesium.Color.BLACK.withAlpha(0.7) //new Cesium.Color(236,242,249, 1)
// }
// });
// // 边界线
// let lineEntity = new Cesium.Entity({
// polyline: {
// positions: Cesium.Cartesian3.fromDegreesArray(positionArray),
// width: 7,
// material: Cesium.Color.fromCssColorString('#7AE3C8'),//边界线颜色//Cesium.Color.YELLOW //new Cesium.Color(122,227,200, 1)
// clampToGround: true,
// zIndex: 10
// }
// });
// viewer.entities.add(polygonEntity);
// viewer.entities.add(lineEntity);
// //viewer.flyTo(lineEntity);
// });
// tileset.readyPromise.then(function () {
// viewer.zoomTo(
// tileset,
// new Cesium.HeadingPitchRange(
// 0,
// -0.7,
// 2500
// // tileset.boundingSphere.radius * 10
// )
// );
// });
//设置倾斜摄影Z轴高度
// tileset.readyPromise.then(function (tileset) {
// const offsetHeight = 15
// const boundingSphere = tileset.boundingSphere
// const cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center)
// const surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0)
// const offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, offsetHeight)
// const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3())
// tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation)
// // viewer.flyTo(tileset)
// })
}
async getDem(viewer) {
const terrainProvider = await Cesium.CesiumTerrainProvider.fromUrl(
// "/shzh/mapres/terrain",
// `${process.env.PUBLIC_URL}/terrain`,
// "http://192.168.66.51:42225/distribution/terrain/5vjnbauc3frn",
"https://map1.oss-cn-shenzhen.aliyuncs.com/tsg/terrain2",
{
requestVertexNormals: true
})
viewer.terrainProvider = terrainProvider
}
async getWxyx(viewer) {
const tiandiKey = "efc861f25f96dc6e5f884f0403ebfefd"; //天地图key官网申请
const baseUrl = "https://{s}.tianditu.gov.cn";//'https://t{0-7}.tianditu.gov.cn';
const imageryProvider = new Cesium.UrlTemplateImageryProvider({
//url: `http://res3dstatic{s}.cloudowr.cn/${localStorage.getItem('address')}/dom2/{z}/{x}/{y}.png`,
url: baseUrl + '/DataServer?T=img_w&x={x}&y={y}&l={z}&tk='+tiandiKey,
subdomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
//minimumLevel:10,
maximumLevel: 17,
})
viewer.imageryLayers.addImageryProvider(imageryProvider);
}
getRlt(viewer) {
function getColorRamp() {
const ramp = document.createElement("canvas");
ramp.width = 100;
ramp.height = 1;
const ctx = ramp.getContext("2d");
let values;
values = [0.0, 0.045, 0.1, 0.15, 0.37, 0.54, 1.0];
const grd = ctx.createLinearGradient(0, 0, 100, 0);
grd.addColorStop(values[0], "#000000"); //black
grd.addColorStop(values[1], "#2747E0"); //blue
grd.addColorStop(values[2], "#D33B7D"); //pink
grd.addColorStop(values[3], "#D33038"); //red
grd.addColorStop(values[4], "#FF9742"); //orange
grd.addColorStop(values[5], "#ffd700"); //yellow
grd.addColorStop(values[6], "#ffffff"); //white
ctx.fillStyle = grd;
ctx.fillRect(0, 0, 100, 1);
return ramp;
}
const minHeight = -414.0; // approximate dead sea elevation
const maxHeight = 8777.0; // approximate everest elevation
let shadingUniforms = {};
function updateMaterial() {
// const globe = viewer.scene.globe;
// let material;
// material = Cesium.Material.fromType("ElevationRamp");
// shadingUniforms = material.uniforms;
// shadingUniforms.minimumHeight = minHeight;
// shadingUniforms.maximumHeight = maxHeight;
// shadingUniforms.image = getColorRamp();
// globe.material = material;
const material = Cesium.Material.fromType("ElevationRamp")
material.uniforms.image = getColorRamp()
viewer.scene.globe.material = material
}
updateMaterial();
}
getRlt2(viewer) {
const gridData = {
minLon: 110.0, // 最小经度
minLat: 30.0, // 最小纬度
deltaLon: 0.1, // 经度间隔
deltaLat: 0.1, // 纬度间隔
rows: 10, // 行数(纬度方向)
cols: 10, // 列数(经度方向)
heights: [ // 高度值数组(行优先存储)
/* 10x10 网格高度值 */
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
100, 120, 140, 140,135,130,120,110,100,90,
// ... 共 100 个值
]
};
// 2. 创建颜色映射函数(根据高度返回颜色)
function heightToColor(height) {
// 示例:根据高度值返回渐变色
const minH = 100, maxH = 500;
const ratio = Math.min(1, Math.max(0, (height - minH) / (maxH - minH)));
// 蓝 -> 绿 -> 红 渐变
const r = Math.floor(255 * ratio);
const g = Math.floor(255 * (1 - ratio));
const b = 128;
return new Cesium.Color(r / 255, g / 255, b / 255, 1.0);
}
// 3. 生成网格几何数据
function createGridGeometry(grid) {
const positions = [];
const colors = [];
const indices = [];
let vertexIndex = 0;
for (let row = 0; row < grid.rows; row++) {
for (let col = 0; col < grid.cols; col++) {
// 计算当前网格点经纬度
const lon = grid.minLon + col * grid.deltaLon;
const lat = grid.minLat + row * grid.deltaLat;
const height = grid.heights[row * grid.cols + col];
// 将经纬度转换为笛卡尔坐标
const position = Cesium.Cartesian3.fromDegrees(lon, lat, height);
positions.push(position);
// 计算颜色
const color = heightToColor(height);
colors.push(color.red, color.green, color.blue, color.alpha);
// 生成三角形索引(跳过边界)
if (row < grid.rows - 1 && col < grid.cols - 1) {
const topLeft = vertexIndex;
const topRight = topLeft + 1;
const bottomLeft = topLeft + grid.cols;
const bottomRight = bottomLeft + 1;
// 两个三角形组成一个网格单元
indices.push(topLeft, bottomLeft, topRight);
indices.push(topRight, bottomLeft, bottomRight);
}
vertexIndex++;
}
}
return { positions, colors, indices };
}
// 4. 创建Primitive并添加到场景
function createGridPrimitive(geometry) {
const appearance = new Cesium.PerInstanceColorAppearance({
flat: true, // 平面着色
renderState: {
depthTest: { enabled: true } // 启用深度测试
}
});
const primitive = new Cesium.Primitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: new Cesium.PolygonGeometry({
polygonHierarchy: new Cesium.PolygonHierarchy(geometry.positions),
vertexFormat: appearance.vertexFormat
}),
attributes: {
color: new Cesium.ColorGeometryInstanceAttribute.fromColor(
new Cesium.Color(1.0, 1.0, 1.0, 1.0)
)
}
}),
appearance: appearance
});
viewer.scene.primitives.add(primitive);
return primitive;
}
const geometryData = createGridGeometry(gridData);
const gridPrimitive = createGridPrimitive(geometryData);
}
async getRlt3(viewer) {
// const gridData = {
// minLon: 110.0, // 最小经度
// minLat: 30.0, // 最小纬度
// deltaLon: 0.1, // 经度间隔
// deltaLat: 0.1, // 纬度间隔
// maxLon: 110.0 + 10 * 0.1, // minLon + cols * deltaLon
// maxLat: 30.0 + 10 * 0.1, // minLat + rows * deltaLat
// rows: 10, // 行数(纬度方向)
// cols: 10, // 列数(经度方向)
// // heights: [ // 高度值数组(行优先存储)
// // /* 10x10 网格高度值 */
// // 100, 120, 140, ...,
// // 110, 130, 150, ...,
// // // ... 共 100 个值
// // ]
// };
// // 2. 创建颜色映射函数(根据高度返回颜色)
// function heightToColor(height) {
// // 示例:根据高度值返回渐变色
// const minH = 1, maxH = 300;
// const ratio = Math.min(1, Math.max(0, (height - minH) / (maxH - minH)));
// // 蓝 -> 绿 -> 红 渐变
// const r = Math.floor(255 * ratio);
// const g = Math.floor(255 * (1 - ratio));
// const b = 128;
// // return new Cesium.Color(r / 255, g / 255, b / 255, 1.0);
// return [r,g,b,100]
// }
const gridData = {
minLon: 110.0, // 最小经度
minLat: 30.0, // 最小纬度
deltaLon: 0.01, // 经度间隔
deltaLat: 0.01, // 纬度间隔
maxLon: 110.0 + 100 * 0.01, // minLon + cols * deltaLon
maxLat: 30.0 + 100 * 0.01, // minLat + rows * deltaLat
rows: 100, // 行数(纬度方向)
cols: 100, // 列数(经度方向)
cccc:[
[10,10,10,10,10,10,10,10,10,10],
[10,10,10,10,10,10,10,10,10,10],
[10,10,10,10,10,10,10,10,10,10],
[10,10,10,10,10,10,10,10,10,10],
[10,10,10,10,200,10,10,10,10,10],
[10,10,10,10,10,10,10,10,10,10],
[10,10,10,10,10,10,10,10,10,10],
[10,10,10,10,10,10,10,10,10,10],
[10,10,10,10,10,10,10,10,10,10],
[10,10,10,10,10,10,10,10,10,10],
]
};
// 2. 创建颜色映射函数(根据高度返回颜色)
function heightToColor(height) {
// 示例:根据高度值返回渐变色
const minH = 1, maxH = 300;
const ratio = Math.min(1, Math.max(0, (height - minH) / (maxH - minH)));
// 蓝 -> 绿 -> 红 渐变
const r = Math.floor(255 * ratio);
const g = Math.floor(255 * (1 - ratio));
const b = 128;
// return new Cesium.Color(r / 255, g / 255, b / 255, 1.0);
return [r,g,b,100]
}
for (let index = 0; index<10; index++){
const canvas = document.createElement('canvas');
canvas.width = gridData.cols; // 每个网格一个像素
canvas.height = gridData.rows;
const context = canvas.getContext('2d');
for (let row = 0; row < gridData.rows; row++) {
for (let col = 0; col < gridData.cols; col++) {
const color = heightToColor(col*index*0.5);
// const color = heightToColor(gridData.cccc[row][col]);
const style = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${50})`;
context.fillStyle = style;
context.fillRect(col, row, 1, 1); // 每个像素一个网格点
}
}
const imageUrl = canvas.toDataURL('image/png');
// 5. 创建矩形范围(覆盖整个网格)
const rectangle = Cesium.Rectangle.fromDegrees(
gridData.minLon, gridData.minLat,
gridData.maxLon, gridData.maxLat
);
// 6. 创建SingleTileImageryProvider
const imageryProvider = new Cesium.SingleTileImageryProvider({
url: imageUrl,
rectangle: rectangle
});
// 7. 添加到影像层集合
viewer.imageryLayers.addImageryProvider(imageryProvider);
await this.sleep(1000)
}
}
async sleep(time) {
await new Promise(resolve => setTimeout(resolve, time));
}
getCzmlData(){
const gridData = {
minLon: 110.0, // 最小经度
minLat: 30.0, // 最小纬度
deltaLon: 0.1, // 经度间隔
deltaLat: 0.1, // 纬度间隔
rows: 10, // 行数(纬度方向)
cols: 10, // 列数(经度方向)
// heights: [ // 高度值数组(行优先存储)
// /* 10x10 网格高度值 */
// 100, 120, 140, ...,
// 110, 130, 150, ...,
// // ... 共 100 个值
// ]
};
// 2. 创建颜色映射函数(根据高度返回颜色)
function heightToColor(height) {
// 示例:根据高度值返回渐变色
const minH = 1, maxH = 300;
const ratio = Math.min(1, Math.max(0, (height - minH) / (maxH - minH)));
// 蓝 -> 绿 -> 红 渐变
const r = Math.floor(255 * ratio);
const g = Math.floor(255 * (1 - ratio));
const b = 128;
// return new Cesium.Color(r / 255, g / 255, b / 255, 1.0);
return [r,g,b,100]
}
// 3. 生成网格几何数据1帧
function createGridGeometry(grid,ccc) {
const positions = [];
const colors = [];
const indices = [];
let vertexIndex = 0;
for (let row = 0; row < grid.rows; row++) {
for (let col = 0; col < grid.cols; col++) {
// 计算当前网格点经纬度
const lon = grid.minLon + col * grid.deltaLon;
const lat = grid.minLat + row * grid.deltaLat;
const height = row+col+2;
const color = heightToColor(height*ccc*2);
// const color = heightToColor(height*ccc*0.1);
positions.push([
[lon-grid.deltaLon/2,lat,ccc===row?4000:3000],//左上
[lon+grid.deltaLon/2,lat,ccc===row?4000:3000],//右上
[lon,lat+grid.deltaLat,(ccc===(row+1))?4000:3000],//左下
color,//颜色
])
positions.push([
[lon+grid.deltaLon,lat+grid.deltaLat,(ccc===(row+1))?4000:3000],//左下
[lon,lat+grid.deltaLat,(ccc===(row+1))?4000:3000],//右下
[lon+grid.deltaLon/2,lat,ccc===row?4000:3000],//右上
color,//颜色
])
// 将经纬度转换为笛卡尔坐标
// const position = Cesium.Cartesian3.fromDegrees(lon, lat, height);
// 计算颜色
// const color = heightToColor(height);
colors.push(color.red, color.green, color.blue, color.alpha);
// positions.push([lon,lat,height,[color.red,color.green,color.blue,color.alpha]]);
// 生成三角形索引(跳过边界)
if (row < grid.rows - 1 && col < grid.cols - 1) {
const topLeft = vertexIndex;
const topRight = topLeft + 1;
const bottomLeft = topLeft + grid.cols;
const bottomRight = bottomLeft + 1;
// 两个三角形组成一个网格单元
indices.push(topLeft, bottomLeft, topRight);
indices.push(topRight, bottomLeft, bottomRight);
}
vertexIndex++;
}
}
return positions;
}
const alllist = []
for (let index = 0; index<10; index++){
alllist.push(createGridGeometry(gridData,index+1))
}
return alllist
}
async getCzml(viewer) {
const gridData = {
minLon: 110.0, // 最小经度
minLat: 30.0, // 最小纬度
deltaLon: 0.1, // 经度间隔
deltaLat: 0.1, // 纬度间隔
rows: 10, // 行数(纬度方向)
cols: 10, // 列数(经度方向)
// heights: [ // 高度值数组(行优先存储)
// /* 10x10 网格高度值 */
// 100, 120, 140, ...,
// 110, 130, 150, ...,
// // ... 共 100 个值
// ]
};
// 2. 创建颜色映射函数(根据高度返回颜色)
function heightToColor(height) {
// 示例:根据高度值返回渐变色
const minH = 1, maxH = 300;
const ratio = Math.min(1, Math.max(0, (height - minH) / (maxH - minH)));
// 蓝 -> 绿 -> 红 渐变
const r = Math.floor(255 * ratio);
const g = Math.floor(255 * (1 - ratio));
const b = 128;
// return new Cesium.Color(r / 255, g / 255, b / 255, 1.0);
return [r,g,b,100]
}
// 3. 生成网格几何数据1帧
function createGridGeometry(grid,ccc) {
const positions = [];
const colors = [];
const indices = [];
let vertexIndex = 0;
for (let row = 0; row < grid.rows; row++) {
for (let col = 0; col < grid.cols; col++) {
// 计算当前网格点经纬度
const lon = grid.minLon + col * grid.deltaLon;
const lat = grid.minLat + row * grid.deltaLat;
const height = row+col+2;
const color = heightToColor(height*ccc*2);
// const color = heightToColor(height*ccc*0.1);
positions.push([
[lon-grid.deltaLon/2,lat,ccc===row?7000:3000],//左上
[lon+grid.deltaLon/2,lat,ccc===row?7000:3000],//右上
[lon,lat+grid.deltaLat,(ccc===(row+1))?7000:3000],//左下
color,//颜色
])
positions.push([
[lon+grid.deltaLon,lat+grid.deltaLat,(ccc===(row+1))?7000:3000],//左下
[lon,lat+grid.deltaLat,(ccc===(row+1))?7000:3000],//右下
[lon+grid.deltaLon/2,lat,ccc===row?7000:3000],//右上
color,//颜色
])
// 将经纬度转换为笛卡尔坐标
// const position = Cesium.Cartesian3.fromDegrees(lon, lat, height);
// 计算颜色
// const color = heightToColor(height);
colors.push(color.red, color.green, color.blue, color.alpha);
// positions.push([lon,lat,height,[color.red,color.green,color.blue,color.alpha]]);
// 生成三角形索引(跳过边界)
if (row < grid.rows - 1 && col < grid.cols - 1) {
const topLeft = vertexIndex;
const topRight = topLeft + 1;
const bottomLeft = topLeft + grid.cols;
const bottomRight = bottomLeft + 1;
// 两个三角形组成一个网格单元
indices.push(topLeft, bottomLeft, topRight);
indices.push(topRight, bottomLeft, bottomRight);
}
vertexIndex++;
}
}
return positions;
}
// const geometryData = createGridGeometry(gridData,1);
const alllist = []
for (let index = 0; index<1; index++){
alllist.push(createGridGeometry(gridData,index+1))
}
const czmls = []
alllist.map((item,index)=>{
//时间维度
const czml = [{
id: "document",
name: "CZML Colors",
version: "1.0",
}]
item.map((item2,index2)=>{
czml.push({
id: "rgba"+index2,
name: "Rectangle with outline using RGBA Colors",
polygon: {
positions: {
cartographicDegrees: [
...item2[0],
...item2[1],
...item2[2],
],
},
// material: {
// solidColor: {
// color: {
// rgba: item2[3],
// },
// },
// },
material: {
image: {
image: {
uri: Cesium.buildModuleUrl(
`${process.env.PUBLIC_URL}/models/waternormals.jpg`
)
},
// color: {
// rgba: [255, 255, 255, 128],
// },
},
},
extrudedHeight: 0,
perPositionHeight: true,
},
})
})
czmls.push(czml)
})
// let dataSourcePromise = null;
for (const item of czmls) {
// if(dataSourcePromise){
// viewer.dataSources.remove(dataSourcePromise);
// dataSourcePromise = null
// }
const dataSourcePromise = await Cesium.CzmlDataSource.load(item)
viewer.dataSources.add(dataSourcePromise);
// setTimeout(() => {
// viewer.dataSources.remove(dataSourcePromise);
// }, 1000);
await this.sleep(1000)
}
}
}