美文网首页开源GIS相关
Openlayers + Turf.js 实现云朵标注

Openlayers + Turf.js 实现云朵标注

作者: ssxbxk | 来源:发表于2019-02-12 16:58 被阅读1次

    Turf.js官网地址: http://turfjs.org/

    项目中有个需求, 要在openlayers中, 手动绘制一个类似云朵的标注, 由于openlayers中并没有提供这样的方法, 所以就结合Turf.js实现了下面的效果:

    这里用Turf.js 只是为了用union方法, 将多个圆拼凑起来. 

    大致思路如下:

    a. 便利每个点击的点

    b. 当前点与下一个点距离的一半作为半径, 当前点作为圆心, 获取到圆上所有的点坐标

    c. 使用turf.polygon方法, 将b步骤获得的点坐标转换成polygon

    d. 每获取到一个polygon, 就跟前一个polygon通过turf.union方法联合起来, 然后作为前一个polygon

    e. 调用Openlayers绘制区域的方法, 将d步骤中得到的所有区域的联合体进行区域绘制, 就得到想要的效果.

    代码如下:

    var allP = null;

    var cnt = points.length; // points 就是上面动态中鼠标点击的点的集合

    var areaCenter  = [0,0];

    for (var i = 0; i < cnt; i++)

    {

    var cPoint = points[i];

    areaCenter[0] += cPoint[0];

    areaCenter[1] += cPoint[1];

    var nPoint;

    if (i + 1 < cnt)

    nPoint = points[i+1];

    else

    nPoint = points[0];

    var r = this.GetDistance(cPoint, nPoint) / 2; // 这里需要自己实现, 获取两点的距离

    var pcenter = [(cPoint[0] + nPoint[0])/2, (cPoint[1] + nPoint[1])/2];

    var degree = 360;

    var p = [];

    for(var t = 0; t < degree; t++){

    var hudu = 2 * Math.PI / 360 * t;

    var x = pcenter[0] + Math.sin(hudu)*r;

    var y = pcenter[1] - Math.cos(hudu)*r;

    p.push([x, y]);

    }

    p.push(p[0]);

    var poly = turf.polygon([p]);

    if (!allP)

    allP = poly;

    else

    allP = turf.union(allP, poly);

    }

    this.DrawAreaByPos([allP.geometry.coordinates[0]], name); // 这里需要自己实现openlayers的绘制矩形方法

    相关文章

      网友评论

        本文标题:Openlayers + Turf.js 实现云朵标注

        本文链接:https://www.haomeiwen.com/subject/ypukeqtx.html