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 © 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"/> |