算法 之 地理坐标抽稀

问题

  • 一组点 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;
        }
            
    }
})


效果展示

posted @ 2021-08-06 17:16  辣椒鱼儿酱  阅读(286)  评论(0)    收藏  举报