показва най-близките места с радиус от 1 км от ширината и дължината на потребителя

Наскоро казах, че работя върху gps карти. Имам база данни със списък на ширина и дължина. когато потребител получи достъп до моето уеб приложение, искам да показвам места с 1 км или определен радиус от точката на потребителя. Опитах да използвам mysql заявка

ИЗБЕРЕТЕ * ОТ Местоположения
WHERE (географска ширина между MINLATITUDE и MAXLATITUDE )
и (географска дължина между MINLONGITUDE и MAXLONGITUDE)

но показва ширина и дължина между min и max, може ли някой да ми каже как да показва ширина и дължина, които са само в радиус от 1 km от потребителската точка.
Благодаря.


person user1677685    schedule 15.01.2013    source източник
comment
Този въпрос изглежда подобно на тази дискусия в stackoverflow: stackoverflow.com/questions/3168904/   -  person jeffmurphy    schedule 15.01.2013
comment
@jeffmurphy Благодаря за публикацията. Чудя се как мога да изчисля близостта, когато в моята база данни цялата ширина и дължина са предварително съхранени. Изглежда, че трябва да стартирам заявка, така че да изчислява близостта чрез проверка с всеки запис и в db имам повече от 10 000 записа. Бихте ли предложили най-добрия възможен начин?   -  person user1677685    schedule 15.01.2013
comment
@jeffmurphy Разбрах да изчисля разстоянието между ширина/дължина, използвайки формулата на Haversine. Все пак не можах да намеря начин да изчисля разстоянието по-бърз начин, сега изпълнявам моя алгоритъм за извикване на всеки запис в моята DB, което отнема много време. Можете ли да ми предложите някакво решение за това?   -  person user1677685    schedule 15.01.2013
comment
къде правиш изчислението? Във вашата база данни или във вашето уеб приложение каква база данни използвате и с какво е изградено вашето уеб приложение? т.е. C#, Vb и т.н.   -  person 03Usr    schedule 15.01.2013
comment
Използвам C# с MySQL, мисля, че би било по-добре да направя изчислението в база данни и да съхраня резултата в колона за близост и да извлека записите въз основа на близостта. Бихте ли ми казали това ли е по-добрият начин за бързо стартиране на програмата?   -  person user1677685    schedule 16.01.2013


Отговори (1)


За разстояния около 1 км, Haversine е пресилен. Използвайте много по-простата равноъгълна проекция, за да се запознаете с x и y. Не забравяйте, че формулата под ширината и дължината са В РАДИАНИ. Разстоянието d е в km, тъй като радиусът на земята (R) е в km. И lat/long са в радиани (да, казах го отново). Това елиминира няколко тригонометрични функции в сравнение с Haversine, което трябва да направи вашите заявки по-бързи.

var R = 6371; // radius of the earth in km
var x = (lon2-lon1) * Math.cos((lat1+lat2)/2);
var y = (lat2-lat1);
var d = Math.sqrt(x*x + y*y) * R;  // distance in km

Сега, това е уеб приложение, така че ще предположа, че Дядо Коледа (северен полюс) и хората от станцията на Антарктика няма да използват вашето приложение. С това предположение можете да организирате вашите точки за ширина/дължина във вашата база данни за географска дължина. Така че, ако някой има дължина от -76,1, вие знаете, че географските дължини във вашата база данни, които са по-малки от -78 градуса, са по-далеч от 1 км. Знаете също, че географски дължини, по-големи от -74 градуса, също са далеч. Това ще намали броя на точките, които трябва да проверите във вашата база данни.

person TreyA    schedule 15.01.2013
comment
резултатът, който получих, е грешен, когато използвах вашата формула. С помощта на формулата за хаверсинус изходът е правилен и благодаря за обяснението ви относно търсенето на координати. - person user1677685; 16.01.2013
comment
Правят ли Haversine по всяка точка? Първо трябва да сортирате данните си, след което да приложите горната формула към останалите точки. Няма нужда да използвате Haversine за изчисляване на разстоянието от Ню Йорк до Китай. Знаете, че вече е повече от 1 км. Формулата по-горе е валидна (movable-type.co.uk/scripts/latlong. html). Трудно е да се каже, без да се види част от вашия код. - person TreyA; 16.01.2013
comment
Прав си, не е необходимо да използвам хаверсинус за по-далечно разстояние, но трябва да намеря разстоянието на един регион (напр. точка 1 -34.9281, 138.60132 и точка 2 -34.9281, 138.61932) в моята база данни ще има повече подобни. Трябва да покажа само кои са в рамките на 1 км - person user1677685; 16.01.2013