背景:
由於entity實體過多,而又要一次性加載,所以用聚合(後臺聚合),前端cesium也可以聚合,但是由於請求後臺時數據量太大,光請求時間都很長。不能忍受,所以改爲後臺聚合。後臺聚合用的是pg的空間函數。前端去後臺請求時 需要要攜帶當前屏幕所在地理範圍參數
獲取當前屏幕所在地理範圍:
getViewExtend() {
let params = {};
let extend = viewer.camera.computeViewRectangle();
if (typeof extend === "undefined") {
//2D下會可能拾取不到座標,extend返回undefined,所以做以下轉換
let canvas = viewer.scene.canvas;
let upperLeft = new Cesium.Cartesian2(0, 0);//canvas左上角座標轉2d座標
let lowerRight = new Cesium.Cartesian2(
canvas.clientWidth,
canvas.clientHeight
);//canvas右下角座標轉2d座標
let ellipsoid = viewer.scene.globe.ellipsoid;
let upperLeft3 = viewer.camera.pickEllipsoid(
upperLeft,
ellipsoid
);//2D轉3D世界座標
let lowerRight3 = viewer.camera.pickEllipsoid(
lowerRight,
ellipsoid
);//2D轉3D世界座標
var upperLeftCartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(
upperLeft3
);//3D世界座標轉弧度
var lowerRightCartographic= viewer.scene.globe.ellipsoid.cartesianToCartographic(
lowerRight3
);//3D世界座標轉弧度
let minx = Cesium.Math.toDegrees(upperLeftCartographic.longitude);//弧度轉經緯度
let maxx = Cesium.Math.toDegrees(lowerRightCartographic.longitude);//弧度轉經緯度
let miny = Cesium.Math.toDegrees(lowerRightCartographic.latitude);//弧度轉經緯度
let maxy = Cesium.Math.toDegrees(upperLeftCartographic.latitude);//弧度轉經緯度
console.log("經度:" + minx + "----" + maxx);
console.log("緯度:" + miny + "----" + maxy);
params.minx = minx;
params.maxx = maxx;
params.miny = miny;
params.maxy = maxy;
} else {
//3D獲取方式
params.maxx = Cesium.Math.toDegrees(extend.east);
params.maxy = Cesium.Math.toDegrees(extend.north);
params.minx = Cesium.Math.toDegrees(extend.west);
params.miny = Cesium.Math.toDegrees(extend.south);
}
return params;//返回屏幕所在經緯度範圍
}