问题
- 一组点 points [point(x1,y1),point(x2,y2),point(x3,y3),……],每个点在屏幕上显示tag
- 随着比例尺变化,tag会收缩到一起,显示效果很差
- 寻找一种方法,随着比例尺变化,points中的点动态 隐藏与显示
| 比例尺1 |
比例尺2 |
 |
 |
思路
- 动态计算分辨率 1(px) = ?(m) geoRES
- 构建格网 单位:xGES = xLimit * geoRES , yGES = yLimit * geoRES
- 遍历点,若点所在格网单元内没有任何点,该点显示且添加记录,反之则隐藏
- 缺点: 部分点有可能相距很近
/* xGES (xmax,ymax)
+ + + + + + + + + + + + +
yGES + + p5 + + p4 +
+ + + + +
+ + + + + + + + + + + + +
+ p9 + + p2 + +
+ + + p7(out)+ +
+ + + + + + + + + + + + +
+ + p1 + + p3 +
+ +p10(out)+ + +
+ + + + + + + + + + + + +
+ p6 + + p8 + +
+ + + + +
+ + + + + + + + + + + + +
(xmin,ymin)
*/
js 部分代码
// 获取抽稀点
let points = this.getPoints(this.viewer);
// 获取空间屏幕分辨率
let geoRES = this.calGeoRES();
if(geoRES === null) return;
//获取点范围
let extent = this.calExtent(points);
if(extent === null) return;
// 抽稀参数:this.x this.y 这个可以控制抽稀力度
let xGES = geoRES * this.x;
let yGES = geoRES * this.y;
const {xMin, yMin, xMax, yMax}= extent;
// 定义命中实体记录
let hitMap = new Array<Array<Entity>>();
points.forEach(point => {
if(point.position){
let xy = point.position.getValue(JulianDate.now());
let i = Math.round((xy.x - xMin)/xGES);
let j = Math.round((xy.y - yMin)/yGES);
if(hitMap[i] == undefined)
hitMap[i] = new Array<Entity>();
if(hitMap[i][j])
point.show = false;
else{
hitMap[i][j] = point;
point.show = true;
}
}
})
效果展示
