为什么用这个圆的公式在Javascript中给我一个椭圆体,而在Python中却给了我一个圆圈?

why is this formula for a circle giving me an ellipsoid in Javascript but a circle in Python?

我为在此页面上找到的python修改了以下代码:
等同于Javascript。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import math

# inputs
radius = 1000.0 # m - the following code is an approximation that stays reasonably accurate for distances < 100km
centerLat = 30.0 # latitude of circle center, decimal degrees
centerLon = -100.0 # Longitude of circle center, decimal degrees

# parameters
N = 10 # number of discrete sample points to be generated along the circle

# generate points
circlePoints = []
for k in xrange(N):
    # compute
    angle = math.pi*2*k/N
    dx = radius*math.cos(angle)
    dy = radius*math.sin(angle)
    point = {}
    point['lat']=centerLat + (180/math.pi)*(dy/6378137)
    point['lon']=centerLon + (180/math.pi)*(dx/6378137)/math.cos(centerLat*math.pi/180)
    # add to list
    circlePoints.append(point)

print circlePoints

这些点之间的距离应该是恒定的。

据我所知,我的JS版本等效:

1
2
3
4
5
6
7
8
9
10
11
  var nodesCount = 8;
  var coords = [];

  for (var i = 0; i <= nodesCount; i++) {
    var radius = 1000;
    var angle = Math.PI*2*i/nodesCount;
    var dx = radius*Math.cos(angle);
    var dy = radius*Math.sin(angle);

    coords.push([(rootLongitude + (180 / Math.PI) * (dx / EARTH_RADIUS) / Math.cos(rootLatitude * Math.PI / 180)),(rootLatitude + (180 / Math.PI) * (dy / EARTH_RADIUS))]);
  }

但是当我输出它时,坐标与中心不是等距的。

这非常令人沮丧-我一直在尝试调试这一天。谁能看到导致JS代码失败的原因吗?


您以某种方式反转了经纬度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
var linkDistance = 10; //$('#linkDistance').val();
var nodesCount = 8;
var bandwidth ="10 GB/s";
var centerLat = 35.088878;
var centerLon = -106.65262;
var EARTH_RADIUS = 6378137;

var mymap = L.map('mapid').setView([centerLat, centerLon], 11);

L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpandmbXliNDBjZWd2M2x6bDk3c2ZtOTkifQ._QA7i5Mpkd_m30IGElHziw', {
  maxZoom: 18,
  attribution: 'Map data &copy; OpenStreetMap contributors, ' +
    'CC-BY-SA, ' +
    'Imagery ? Mapbox',
  id: 'mapbox.streets'
}).addTo(mymap);


function drawNext(centerLat, centerLon) {
  var coords = [];

  for (var i = 0; i < nodesCount; i++) {
    var radius = linkDistance * 1000;
    var angle = Math.PI * 2 * i / nodesCount;
    var dx = radius * Math.cos(angle);
    var dy = radius * Math.sin(angle);

    var lat = centerLon + (180 / Math.PI) * (dy / 6378137);
    var lon = centerLat + (180 / Math.PI) * (dx / 6378137) / Math.cos(centerLon * Math.PI / 180);

    coords.push([lat, lon]);
  }

  for (var i = 0; i < coords.length; i++) {
    new L.Circle(coords[i], 500, {
      color: 'black',
      fillColor: '#f03',
      fillOpacity: 0.1
    }).addTo(mymap);
    console.log("added circle to:" + coords[i]);
  }

}

drawNext(centerLon, centerLat);


var popup = L.popup();

function onMapClick(e) {
  popup
    .setLatLng(e.latlng)
    .setContent("You clicked the map at" + e.latlng.toString())
    .openOn(mymap);
}

mymap.on('click', onMapClick);

1
2
3
#mapid {
  height: 500px;
}
1
2
<script src="https://npmcdn.com/[email protected]/dist/leaflet-src.js">
<link href="https://npmcdn.com/[email protected]/dist/leaflet.css" rel="stylesheet"/>