Javascript 为什么在北半球画一个圆圈会产生一个椭圆形?
我知道可能有一些地理/数学/投影的原因,但为什么我的圆会变成椭圆形多边形?我试着从一个点画一个圆 当我的点有坐标[0,0]或在南半球时,我得到一个完美的圆。我不知道发生了什么事 var map=新ol.map{ 目标:“地图”, 图层:[ 新ol.layer.Tile{ 来源:new ol.source.OSM } ], 视图:新ol.view{ 中心:Lonlat[-71.076056,42.388399],“EPSG:3857”, 缩放:9 } }; var layer=新ol.layer.Vector{ 来源:新ol.source.Vector{ 投影:‘EPSG:4326’, 特色:[] }, }; map.addLayerlayer; var vectorSource=layer.getSource; 函数createCircleCenter、CircleCenter、circleRadius、pointsToEnd{ 让角度ToAdd=360/点ToEnd; 设coords=[]; 设角度=0; 对于设i=0;iJavascript 为什么在北半球画一个圆圈会产生一个椭圆形?,javascript,openlayers,Javascript,Openlayers,我知道可能有一些地理/数学/投影的原因,但为什么我的圆会变成椭圆形多边形?我试着从一个点画一个圆 当我的点有坐标[0,0]或在南半球时,我得到一个完美的圆。我不知道发生了什么事 var map=新ol.map{ 目标:“地图”, 图层:[ 新ol.layer.Tile{ 来源:new ol.source.OSM } ], 视图:新ol.view{ 中心:Lonlat[-71.076056,42.388399],“EPSG:3857”, 缩放:9 } }; var layer=新ol.layer
function drawCircle(point, radius, dir) {
var d2r = Math.PI / 180; // degrees to radians
var r2d = 180 / Math.PI; // radians to degrees
var earthsradius = 6378137.0; // 6378137.0 is the radius of the earth in meters
var points = 32;
// find the raidus in lat/lon
var rlat = (radius / earthsradius) * r2d;
var rlng = rlat / Math.cos(point[1] * d2r);
var extp = new Array();
if (dir == 1) {
var start = 0;
var end = points + 1
} // one extra here makes sure we connect the
else {
var start = points + 1;
var end = 0
}
for (var i = start;
(dir == 1 ? i < end : i > end); i = i + dir) {
var theta = Math.PI * (i / (points / 2));
ey = point[0] + (rlng * Math.cos(theta)); // center a + radius x * cos(theta)
ex = point[1] + (rlat * Math.sin(theta)); // center b + radius y * sin(theta)
extp.push([ey, ex]);
}
return extp;
}
如果你想要一些看起来是圆形的东西,你可以使用一个drawCircle函数来计算地球的曲率,但是它在地面上并不是一个圆
function drawCircle(point, radius, dir) {
var d2r = Math.PI / 180; // degrees to radians
var r2d = 180 / Math.PI; // radians to degrees
var earthsradius = 6378137.0; // 6378137.0 is the radius of the earth in meters
var points = 32;
// find the raidus in lat/lon
var rlat = (radius / earthsradius) * r2d;
var rlng = rlat / Math.cos(point[1] * d2r);
var extp = new Array();
if (dir == 1) {
var start = 0;
var end = points + 1
} // one extra here makes sure we connect the
else {
var start = points + 1;
var end = 0
}
for (var i = start;
(dir == 1 ? i < end : i > end); i = i + dir) {
var theta = Math.PI * (i / (points / 2));
ey = point[0] + (rlng * Math.cos(theta)); // center a + radius x * cos(theta)
ex = point[1] + (rlat * Math.sin(theta)); // center b + radius y * sin(theta)
extp.push([ey, ex]);
}
return extp;
}
所以这是没有办法的?在两极@s.khetchosine,情况变得更糟。如果您使用EPSG 3857,这是一种预期行为,因为您位于赤道中心。这就是为什么在[0,0]上有一个圆,并且从北向南移动会变得更糟。使用此选项有助于将解决方案形象化。是否没有办法解决此问题?在两极@s.khetchosine,情况变得更糟。如果您使用EPSG 3857,这是一种预期行为,因为您位于赤道中心。这就是为什么在[0,0]上有一个圆,并且从北向南移动会变得更糟。这有助于将解决方案形象化。南半球应该有同样的问题。南半球也应该有同样的问题。