我正在创建一个脚本,我在json文件中有大约2000个城市地址,包含longitutde和latitude。
脚本必须用经度和纬度计算从提供的纬度/经度到每个条目的距离和
按最近的顺序排序。
我需要大约10个“最近”的结果。
我可以计算距离,但我不能按最近的位置排序。
JSON文件:
{
"City A": {
"Position": {
"Longitude": 9.96233,
"Latitude": 49.80404
}
},
"City B": {
"Position": {
"Longitude": 6.11499,
"Latitude": 50.76891
}
},
"City C": {
"Position": {
"Longitude": 6.80592,
"Latitude": 51.53548
}
},
"City D": {
"Position": {
"Longitude": 9.50523,
"Latitude": 51.31991
}
},
"City E": {
"Position": {
"Longitude": 9.66089,
"Latitude": 48.70158
}
},
"City F": {
"Position": {
"Longitude": 9.93368,
"Latitude": 53.55608
}
},
"City G": {
"Position": {
"Longitude": 11.56122,
"Latitude": 48.14496
}
},
"City H": {
"Position": {
"Longitude": 13.34253,
"Latitude": 52.5319
}
},
"City I": {
"Position": {
"Longitude": 6.11327,
"Latitude": 50.77715
}
},
"City J": {
"Position": {
"Longitude": 13.36671,
"Latitude": 52.54344
}
}
}
jQuery:
var jsonString =
'{"City A":{"Position":{"Longitude":9.96233,"Latitude":49.80404}},"City B":{"Position":{"Longitude":6.11499,"Latitude":50.76891}},"City C":{"Position":{"Longitude":6.80592,"Latitude":51.53548}},"City D":{"Position":{"Longitude":9.50523,"Latitude":51.31991}},"City E":{"Position":{"Longitude":9.66089,"Latitude":48.70158}},"City F":{"Position":{"Longitude":9.93368,"Latitude":53.55608}},"City G":{"Position":{"Longitude":11.56122,"Latitude":48.14496}},"City H":{"Position":{"Longitude":13.34253,"Latitude":52.5319}},"City I":{"Position":{"Longitude":6.11327,"Latitude":50.77715}},"City J":{"Position":{"Longitude":13.36671,"Latitude":52.54344}}}';
var myData = JSON.parse(jsonString);
$(document).ready(function () {
$.each(myData, function (a, b) {
//$("#groups").append("<li>"+b.Position.Longitude+"</li>");
$("#groups").append('<li><h2>' + a + '</h2><p>' + hesapla(9.9608999, 49.7222842, b.Position.Longitude, b.Position.Latitude) + '</p></a></li>');
});
function hesapla(meineLongitude, meineLatitude, long1, lat1) {
erdRadius = 6371;
meineLongitude = meineLongitude * (Math.PI / 180);
meineLatitude = meineLatitude * (Math.PI / 180);
long1 = long1 * (Math.PI / 180);
lat1 = lat1 * (Math.PI / 180);
x0 = meineLongitude * erdRadius * Math.cos(meineLatitude);
y0 = meineLatitude * erdRadius;
x1 = long1 * erdRadius * Math.cos(lat1);
y1 = lat1 * erdRadius;
dx = x0 - x1;
dy = y0 - y1;
d = Math.sqrt((dx * dx) + (dy * dy));
if (d < 1) {
return Math.round(d * 1000) +" m"
;
} else {
return Math.round(d * 10) / 10 +" km"
;
}
};
});
答案 0 :(得分:1)
考虑到您提供的用于计算两个坐标之间距离的函数是正确的,您可以使用以下例程根据城市到给定位置的距离对城市进行排序:
// user supplied lat/long
var origin = JSON.parse('{"Longitude":9.96233,"Latitude":49.80404}');
// cities to sort
var cities = JSON.parse('{"City A":{"Position":{"Longitude":9.96233,"Latitude":49.80404}},"City B":{"Position":{"Longitude":6.11499,"Latitude":50.76891}},"City C":{"Position":{"Longitude":6.80592,"Latitude":51.53548}},"City D":{"Position":{"Longitude":9.50523,"Latitude":51.31991}},"City E":{"Position":{"Longitude":9.66089,"Latitude":48.70158}},"City F":{"Position":{"Longitude":9.93368,"Latitude":53.55608}},"City G":{"Position":{"Longitude":11.56122,"Latitude":48.14496}},"City H":{"Position":{"Longitude":13.34253,"Latitude":52.5319}},"City I":{"Position":{"Longitude":6.11327,"Latitude":50.77715}},"City J":{"Position":{"Longitude":13.36671,"Latitude":52.54344}}}');
// loop through each city and calculate its distance
var array = [];
for (var name in cities) {
var city = cities[name];
array.push({
cityName: name,
distance: calculateDistance(origin, city.Position)
});
}
// this is the function you provided (slightly modified)
function calculateDistance(p1, p2) {
var erdRadius = 6371;
p1.Longitude = p1.Longitude * (Math.PI / 180);
p1.Latitude = p1.Latitude * (Math.PI / 180);
p2.Longitude = p2.Longitude * (Math.PI / 180);
p2.Latitude = p2.Latitude * (Math.PI / 180);
var x0 = p1.Longitude * erdRadius * Math.cos(p1.Latitude);
var y0 = p1.Latitude * erdRadius;
var x1 = p2.Longitude * erdRadius * Math.cos(p2.Latitude);
var y1 = p2.Latitude * erdRadius;
var dx = x0 - x1;
var dy = y0 - y1;
return Math.sqrt((dx * dx) + (dy * dy));
}
// finaly, sort the cities according to their distance
array.sort(function (a, b) {
return a.distance - b.distance;
});
Here是一个工作小提琴。
答案 1 :(得分:1)
我的解决方案只是在位置和距离之外创建一个对象数组,对它们进行排序,然后将它们吐出来。我把所有东西都保持为米而不是千米,但它很容易调整。享受!
循环时:
distanceObj[i] = {
distance: hesapla(9.9608999, 49.7222842, b.Position.Longitude, b.Position.Latitude),
location: a
};
++i;
然后排序:
distanceObj.sort(function(a,b) {
return parseInt(a.distance) - parseInt(b.distance)
});
答案 2 :(得分:0)
我建议使用更像这样的JSON结构:
[
{
"City": "City A",
"Position": {
"Longitude": 9.96233,
"Latitude": 49.80404
}
},
{
"City": "City B",
"Position": {
"Longitude": 6.11499,
"Latitude": 50.76891
}
}
]
每个城市都是一个对象,所有对象都在数组中。这将使其更易于访问和使用。
然后使用以下内容替换$.each()
循环:
$.each(myData, function (a, b)
{
b.Distance = hesapla(9.9608999, 49.7222842, b.Position.Longitude, b.Position.Latitude);
});
myData.sort(function(a, b)
{
var distanceA = parseFloat(a.Distance);
var distanceB = parseFloat(b.Distance);
if(distanceA > distanceB)
{
return 1;
}
else if(distanceA < distanceB)
{
return -1;
}
return 0;
});
for(var i = 0, iMax = 10; i < iMax; i++)
{
$("#groups").append('<li><h2>' + myData[i].City + '</h2><p>' + myData[i].Distance + '</p></a></li>');
}
这将计算每个距离并将其存储在城市的对象中,按距离排序,然后输出前10个条目。
答案 3 :(得分:0)
您的对象应该是一个列表。您可以动态转换它而不是改变您的输入。
将距离计算保持为实数而不是将其转换为字符串也很重要。
function schoneStrecke(d){
if (d < 1) {
return Math.round(d * 1000) +" m";
} else {
return Math.round(d * 10) / 10 +" km";
}
};
然后仅在创建输出时调用它:
$("#groups").append('<li><h2>' + myList[i].name + '</h2><p>' + schoneStrecke(myList[i].distance) + '</p></a></li>');