Javascript 绘制圆时如何将米精确转换为经度或纬度

Javascript 绘制圆时如何将米精确转换为经度或纬度,javascript,geometry,gis,latitude-longitude,Javascript,Geometry,Gis,Latitude Longitude,注:该问题并非针对传单,而是一般性问题 我想在地图上画一条弧。我有一个生成多边形点的函数,它可以在画布上工作,但不能在Lng、Lat地图上工作 问题是,我不知道如何将内/外半径从米转换为度(如在lng/lat中),到目前为止,我尝试的是椭圆形而不是圆形 如何准确地将米转换为地球上任何一点(两极除外)的经度或纬度? 以下是我在画布上尝试的内容 $(文档).ready(函数(){ var d_canvas=document.getElementById('canvas'); var c2=d_ca

注:该问题并非针对传单,而是一般性问题

我想在地图上画一条弧。我有一个生成多边形点的函数,它可以在画布上工作,但不能在Lng、Lat地图上工作

问题是,我不知道如何将内/外半径从米转换为度(如在lng/lat中),到目前为止,我尝试的是椭圆形而不是圆形

如何准确地将米转换为地球上任何一点(两极除外)的经度或纬度?

以下是我在画布上尝试的内容

$(文档).ready(函数(){
var d_canvas=document.getElementById('canvas');
var c2=d_canvas.getContext('2d');
c2.fillStyle='#f00';
c2.beginPath();
var fromDeg=0;
var toDeg=90;
var fromRad=getAngle(fromDeg);
var toRad=getAngle(toDeg);
var段=100;
var step=getAngle(toDeg fromDeg)/段;
var x=250;
变量y=250;
var-outR=250;
var-inR=230;
c2.移动到(x+(数学sin(fromRad)*inR),y-(数学cos(fromRad)*inR));
//c2.移动到(x,y);
for(变量i=fromRad;i=fromRad;i=i-step){
c2.lineTo(x+(数学sin(i)*outR),y-(数学cos(i)*outR));
}
c2.lineTo(x+(数学sin(fromRad)*inR),y-(数学cos(fromRad)*inR));
//c2.closePath();
c2.笔划();
});
功能角度(度){
var val=2*(度/360);
返回Math.PI*val;
}

那么你原来的问题是

如何准确地将米转换为地球上任何一点的经度或纬度(两极除外)

但我的大脑认为

给定一个
[lat,lng]
点和距离
d
米,如何计算距离第一点
d
米的第二个
[lat2,lng2]

如果你知道一些地理信息系统的行话,这和问问题是一样的

我如何解决这个问题

答案涉及椭球体和大圆等数学概念

但考虑到您使用的是Javascript和传单,我将跳转到实际实现

如果你需要一个超精确的答案,你想看看,和它的方法来解决直接测地问题

如果你真的不关心精度(特别是不关心极点的精度),你想看看,特别是它的
目的地(p,dist,方位)
方法

还有更多的解决方案,比如使用以点为中心的等距地图投影,或者其他一些测地线问题的实现,或者一些诡计,或者使用类似的方法在JS之外创建几何体,等等


这个问题已经解决了,所以我建议使用任何现有的解决方案。

这就解决了问题

var osmUrl='http://{s}.tile.osm.org/{z}/{x}/{y}.png',
osmAttrib='&复制;投稿人,,
osm=L.tileLayer(osmUrl{
maxZoom:18,
署名:奥斯马特里布
});
//使用给定的中心和缩放在“map”div上初始化贴图
var map=L.map('map').setView([59.56667150.80000],12).addLayer(osm);
//用于在地图上添加标记的脚本单击
L.polygon(getPolygon()).addTo(map);
函数getPolygon(){
var fromDeg=0;
var toDeg=120;
var lat=59.56667;
var-lon=150.80000;
var-outR=200;
var-inR=180;
var多边形=[];
对于(变量i=fromDeg;i=fromDeg;i--){
push(getPoint(lat,lon,outR,i));
}
多边形推(获取点(纬度、经度、inR、fromDeg));
返回多边形;
}
/*************************
*解决方案
*************************/
功能获取点(横向、纵向、纵向、纵向){
lat2=(r/111230)*数学系数(deg2rad(deg));
lat2+=lat;
lon2=(r/111230)*数学sin(deg2rad(deg));
lon2=lon2*(1/Math.cos(deg2rad(lat2));
lon2+=lon;
返回[lat2,lon2];
}
功能deg2rad(度){
返回度*(数学PI/180);
}
#地图{
高度:500px;
宽度:80%;
}


请看我下面的解决方案,看看这对于100公里以下的圆/弧半径是否准确?它看起来足够准确。不幸的是,我不是测地线专家,所以我无法计算您的算法与其他算法之间的误差。谢谢,非常好的参考资料。