Ами това е моят опит да сортирам масив от точки по разстояние до дадена точка. Това е груба сила, доколкото разбирам. След това аз slice
масива, за да ви дам 10-те най-близки точки.
Javascript
function distanceBetweenPoints(p1, p2) {
return Math.abs(Math.sqrt((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1])));
}
function sortByDistance(location, arrayOfPoints) {
arrayOfPoints.sort(function (a, b) {
a.distance = distanceBetweenPoints(location, a);
b.distance = distanceBetweenPoints(location, b);
return a.distance - b.distance;
});
return arrayOfPoints;
}
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var points = [];
for (i = 0; i < 100; i += 1) {
points.push([getRandomInt(-90, 90), getRandomInt(-180, 180)]);
}
console.log(sortByDistance([0, 0], points).slice(0, 10));
На jsFiddle
Това поне ще ви даде нещо, срещу което да тествате алгоритмите. И ето jsPerf за горното, така че можете да добавите други процедури към него и да направите някои реални сравнения на производителността .
Забележка: Това не взема предвид, че Земята е сфера! Това е изчисляване на Euclidean distance
, а не на геодезично разстояние. Това е добре, ако точките са например в един и същи град (или в непосредствена близост), но не и ако са в различни държави/континенти. Предполага се също, че сте преобразували географската си дължина и ширина в десетично представяне.
В противен случай ще трябва да разгледате неща като Great-circle distance
и Haversine formula
Всъщност земята е много леко елипсоидална; използването на сферичен модел дава грешки обикновено до 0,3%
Javascript
function toRadians(degrees) {
return (degrees * Math.PI) / 180;
}
// Haversine formula
function distanceBetweenPoints(p1, p2) {
var R = 6371, // mean earth radius in km
lat1 = toRadians(p1[0]),
lon1 = toRadians(p1[1]),
lat2 = toRadians(p2[0]),
lon2 = toRadians(p2[1]),
dLat = lat2 - lat1,
dLon = lon2 - lon1,
a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2),
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)),
d = R * c;
return d;
}
function sortByDistance(location, arrayOfPoints) {
arrayOfPoints.sort(function (a, b) {
a.distance = distanceBetweenPoints(location, a);
b.distance = distanceBetweenPoints(location, b);
return a.distance - b.distance;
});
return arrayOfPoints;
}
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var points = [];
for (i = 0; i < 100; i += 1) {
points.push([getRandomInt(-90, 90), getRandomInt(-180, 180)]);
}
console.log(sortByDistance([0, 0], points).slice(0, 10));
На jsFiddle
person
Xotic750
schedule
08.03.2014
Опцията
post-data
трябва да бъде поставена в кавички правилно и да съдържа urlencoded данни, т.е.Вижте също тази публикация.
- person Xotic750   schedule 08.03.2014