js 已知点位坐标,绘制当前坐标500米范围的圆(重点:得到圆每个角度的经纬度可连成圆形)

已知坐标经纬度为[107.522635, 30.656897];
根据当前坐标计算周边500米范围,并绘制圆形

不使用高德/百度地图api

期望结果

麻烦各位大神解答一下 万分感谢(已解决,感谢评论区大佬
我看到有小可爱收藏了我的问题,这里把我的源码附上供参考

// lng 经度;lat 纬度;dis 距离(千米)
let r = 6371;   //地球半径千米  
let dis = 3;    //3千米距离  
let dlng = 2*Math.asin(Math.sin(dis/(2*r))/Math.cos(lat*Math.PI/180));  
dlng = dlng*180/Math.PI;      // 经度半径  
let dlat = dis/r;  
dlat = dlat*180/Math.PI;    // 纬度半径
// 圆形每一度 都算出一个经纬度
for(let sides = 1; sides <= 360; sides++) {
    var angle = Math.PI * ((1/sides) - (1/2));
    var rotatedAngle, x, y;
    var points = [];
    for(var i=0; i<sides; ++i) {
        rotatedAngle = angle + (i * 2 * Math.PI / sides);
        x = lng + (dlng * Math.cos(rotatedAngle));
        y = lat + (dlat * Math.sin(rotatedAngle));
        points.push([x, y])
    }
}
console.log('points=======',points)
//最后在地图上使用图表连线就可以啦!

得到结果

再次感谢评论区各位大佬的解答!

阅读 6.7k
3 个回答

首先可以看这里的2.9,根据经纬度和距离求范围,https://segmentfault.com/a/11...

这个范围就是半径,然后使用下面的代码,利用半径和经纬度中心点求圆的路径,其中origin是中心点坐标,radius是半径,sides是圆上的点数,可以理解为精度,rotation是起点角度

//创建一个圆
function createCircle2(origin, radius, sides, rotation) {
    var angle = Math.PI * ((1/sides) - (1/2));
    if(rotation) {
        angle += (rotation / 180) * Math.PI;
    }
    var rotatedAngle, x, y;
    var points = [];
    for(var i=0; i<sides; ++i) {
        rotatedAngle = angle + (i * 2 * Math.PI / sides);
        x = origin[0] + (radius * Math.cos(rotatedAngle));
        y = origin[1] + (radius * Math.sin(rotatedAngle));
        points.push([x, y])
    }
    var polygon = new ol.geom.Polygon([points]);
    return polygon;
}

如果不使用已有的API,则这个计算其实还是比较麻烦的。
因为地图是由球面摊平映射到平面的,纬线周长可以认为近似相等,而经线周长是不等的,其长度和纬度有关,当然因为500米的圆在地图上还反映不出太多的差异,不过会影响计算。

大致把地球看做个半径R的正球形,则不同纬度W对应的经线半径Rj是 Rj=R * cosW,
则对圆心P[J0,W0]这样可以确定出同在该经线上需画圆与经线的2个交点坐标P1、P2为[J0±500/Rj,W0],也可以类似求出与纬线的2个交点坐标P3、P4为[J0,W0±500/R]。其实类似可以求出所有圆上的点坐标,把它们连起来形成圆。

你还可以用maptalks,国人写的JavaScript地图引擎,用过的都说香。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题