2016-08-04 5 views
0

Ich passte den folgenden Code für Python auf diesem page: für ein Javascript-Äquivalent.Warum ist diese Formel für einen Kreis ein Ellipsoid in Javascript, aber ein Kreis in Python?

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 

Der Abstand zwischen diesen Punkten ist konstant, wie es sein sollte.

Meine JS-Version ist, soweit ich weiß, das entspricht:

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))]); 
    } 

Aber wenn ich Ausgang dieses, sind die Koordinaten von der Mitte nicht gleich weit entfernt.

Das ist enorm frustrierend - ich habe versucht, dies für einen Tag zu debuggen. Kann jemand sehen, was den JS-Code versagt?

Antwort

1

Sie haben irgendwie lat/lon umgekehrt.

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; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' + 
 
    '<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' + 
 
    'Imagery © <a href="http://mapbox.com">Mapbox</a>', 
 
    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);
#mapid { 
 
    height: 500px; 
 
}
<script src="https://npmcdn.com/[email protected]/dist/leaflet-src.js"></script> 
 
<link href="https://npmcdn.com/[email protected]/dist/leaflet.css" rel="stylesheet"/> 
 
<div id="mapid"></div>