Javascript 为什么在北半球画一个圆圈会产生一个椭圆形?

Javascript 为什么在北半球画一个圆圈会产生一个椭圆形?,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

我知道可能有一些地理/数学/投影的原因,但为什么我的圆会变成椭圆形多边形?我试着从一个点画一个圆

当我的点有坐标[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;i这是因为地球是一个球体。就是这样。它仍然是一个圆,但在z轴上弯曲,这是因为地球是一个球体。就是这样。它仍然是一个圆,但在z轴上弯曲

您的代码在EPSG:3857视图中显示了屏幕上EPSG:4326投影中的圆,但在地球上,随着您向两极移动,经度越来越近。对于屏幕上的圆,请使用ol.geom.circle。但是在真实的地球上这两个都不是圆,因为你需要ol.geom.Polygon.circular

你的代码在EPSG:3857视图中显示了屏幕上EPSG:4326投影中的圆,但是在地球上,随着你向两极移动,经度会越来越近。对于屏幕上的圆,请使用ol.geom.circle。但是在真实的地球上两者都不是圆,因此你需要ol.geom.Polygon.circular

如果你想要看起来是圆形的东西,你可以使用一个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;
}


如果你想要一些看起来是圆形的东西,你可以使用一个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]上有一个圆,并且从北向南移动会变得更糟。这有助于将解决方案形象化。南半球应该有同样的问题。南半球也应该有同样的问题。