Пресмятане на разстояние между координати

mvmrik

Well-Known Member
Знаете ли как може да се пресметне разстоянието между дадени координати?

Например, ако имаме 3 адреса с координати:
42.5462 23.4568
43.4268 23.4896
43.5438 27.5498

И да речем, искаме да знаем разстоянието до тях от този адрес: 43.2548 24.4567

Как може да се разбере колко е разстоянието между тях. На мен ми трябва, за да изчислявам най-близкия обект до текущите координати, не е толкова важно да се знае точното разстояние, а просто кой адрес е най-близък. Не става въпрос за отчитане по картата и по пътищата, а по въздушен път. Все едно теглим една черта от точка A до точка B и да се знае колко е разстоянието. Може да има някаква формула, но не можах да намеря.
 
От: Пресмятане на разстояние между координати

Оправих се, първоначално помислих, че ще е по-просто, но се оказа малко по-трудно. Трябваше ми за PHP и с това се получава добре, като резултата е в мили:

PHP:
$lat1 = ;
$lon1 = ;

$lat2 = ;
$lon2 = ;

$theta = $lon1 - $lon2;
  $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
  $dist = acos($dist);
  $dist = rad2deg($dist);
  $miles = $dist * 60 * 1.1515;
 
От: Пресмятане на разстояние между координати

И това може да ти свърши работа. Ползвах го за един ел. магазин да показва в зададен радиус какви физически. магазини има.
$lat1 = ;
$lon1 = ;

$lat2 = ;
$lon2 = ;

3959 * acos(
cos(radians($lat1)) * cos(radians($lat2))
* cos(radians($lon2) - radians($lon1))
+ sin(radians($lat1)) * sin(radians($lat2))
)
 
От: Пресмятане на разстояние между координати

Направих го на PHP и работи, но сега пък имам проблем с javascript, понеже не му разбирам. Никога не съм го харесвал, но почнах да го уча, защото без него май нищо не може да работи и само с PHP не става работата. Намерих един javascript код, който определя локацията. Целта е, като се натисне на него да излязат най-близките обекти, които са въведени предварително в базата данни. Това не ми е проблем, а връзката между javascript и PHP.

Код:
<button onclick="getLocation()">Try It</button>

<p id="demo"></p>

<script>
var x = document.getElementById("demo");

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else { 
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

function showPosition(position) {
    x.innerHTML = "Latitude: " + position.coords.latitude + 
    "<br>Longitude: " + position.coords.longitude;	
}
</script>

Този код ми вади локацията, но как да я вкарам в PHP променливи? Имате ли представа как да създам $lat1 и $lon1 в PHP, като се ползват стойностите от position.coords.latitude и position.coords.longitude ?
 
От: Пресмятане на разстояние между координати

Трябва с ajax да го направил или сходно.
JS се изпълнява в браузъра, а PHP на сървъра. Трябва с AJAX заявка да му подадеш това, което е на браузъра, за да ти го сметне и върне като резултат.
 
От: Пресмятане на разстояние между координати

Това което ти пратих ще ти свърши префектна работи директно в заявката към дб-то;
 
От: Пресмятане на разстояние между координати

Трябва с ajax да го направил или сходно.
JS се изпълнява в браузъра, а PHP на сървъра. Трябва с AJAX заявка да му подадеш това, което е на браузъра, за да ти го сметне и върне като резултат.

Да, ясно, но като не знам как да го направя :)
 
От: Пресмятане на разстояние между координати

Това което ти пратих ще ти свърши префектна работи директно в заявката към дб-то;

Да, аз това съм го направил. Проблема ми е как да взема текущите координати. Не искам да са по IP, защото са много неточни. С този js код, който дадох горе става добре, но не знам как да го вкарам после в PHP.
 
От: Пресмятане на разстояние между координати

Ами както каза по-горе krisopk ще ти трябва ajax. И да се надяваш посетителя да си сподели местоположението.
 
От: Пресмятане на разстояние между координати

Знаете ли как може да се пресметне разстоянието между дадени координати?

Например, ако имаме 3 адреса с координати:
42.5462 23.4568
43.4268 23.4896
43.5438 27.5498

И да речем, искаме да знаем разстоянието до тях от този адрес: 43.2548 24.4567

Как може да се разбере колко е разстоянието между тях. На мен ми трябва, за да изчислявам най-близкия обект до текущите координати, не е толкова важно да се знае точното разстояние, а просто кой адрес е най-близък. Не става въпрос за отчитане по картата и по пътищата, а по въздушен път. Все едно теглим една черта от точка A до точка B и да се знае колко е разстоянието. Може да има някаква формула, но не можах да намеря.

Това е втора основна геодезична задача - от дадени координати на 2 точки да се изчислят разстоянието между точките и посочния ъгъл между тях.

Със сигурност има доста програми за решаването на подобни задачи. Ето тук една, която не съм проверявала дали работи, но в таблицата са дадени формулите, по които се изчислява.
http://chilyashev.com/2009/12/програма-за-решаване-на-втора-основна/

При теб обаче не са правоъгълни координати Х и У, а са дадени точките с тяхната географска дължина и ширина - 42 и нещо, 43 и нещо градуса ти е ширината, 23-27 и нещо е дължината, Ако сам ще правиш програма, трябва да направиш трансформация от географски в правоъгълни координати, като използваш дадения елипсоид, ето тук е дадено:
http://stackoverflow.com/questions/...m-longitude-latitude-to-cartesian-coordinates

После изчисляваш делта Хаб и делта Уаб (разликите в Х на точка А и т.Б, съответно разликите в У). В общия случай четирите точки не ти лежат на една права. Да речем, че последната (до адреса) ти е т. А, първите три са ти т. Б, С, Д. Трябва да намериш делта Хаб, делта Хас, делта Хад, после делта У. После изчисляваш посочния ъгъл делта алфа аб и т.н., после вече разстоянието Sab, Sac, Sad.
 
От: Пресмятане на разстояние между координати

Това е права задача геодезична или навигационна зависи за сушата ли говорим или за морето. Имам всичките формули за изчисление на тази задача, както и на обратната, но са на хартиен носител в учебници и мои записки. Ако нещо сметките не излизат кажи ми ще ти ги наснимам и пратя.
 
От: Пресмятане на разстояние между координати

Колеги, не разбрахте ли, че човека си е намерил най-доброто решение - вече откритата топка вода.
Маверик, драсни едно ЛС ако не успееш за 5-10 минути да ти пусна example с връзката и да свършиш работа. ;)
 
От: Пресмятане на разстояние между координати

Направих го, но не ми хареса как става отчитането на разстоянието по права линия, затова намерих решение с google maps api - така се отчита разстоянието с автомобил и се определя предполагаемото време за пътуване.

Между другото, интересно ми е как въобще работи това отчитане на местоположение през браузъра с този javascript? Пробвах как ще го отчете с прокси и пак засича моето местоположение, явно не е по IP. Местоположението не се детектва с абсолютна точност, но в задоволителен периметър.
 
От: Пресмятане на разстояние между координати

Направих го, но не ми хареса как става отчитането на разстоянието по права линия, затова намерих решение с google maps api - така се отчита разстоянието с автомобил и се определя предполагаемото време за пътуване.

Между другото, интересно ми е как въобще работи това отчитане на местоположение през браузъра с този javascript? Пробвах как ще го отчете с прокси и пак засича моето местоположение, явно не е по IP. Местоположението не се детектва с абсолютна точност, но в задоволителен периметър.

Зависи от браузъра, но обикновено работи на ниво MAC адрес, т.е. не можеш да си скриеш ИП-то с прокси.
Други работоят с технология на google. Вече съм забравил, погледни html5 geolocation how it works
 
От: Пресмятане на разстояние между координати

Е нали за това обикаля колата на гугъла из бг. Събира данните от мрежови устройства и локацията им. Имат база данни с всеки маршрутизатор къде е позициониран.
 
От: Пресмятане на разстояние между координати

Всичко стана добре и работи както трябва, докато не разбрах, че този javascript май работи само през chrome :) Поне с Firefox не иска да тръгне. Знаете ли къде може да е проблема или направо да търся нещо друго, защото вече направих цялото PHP и всичко работи без проблем, но все пак не е лошо и с другите браузъри да е ОК. Да не говорим, че през Iphone също не иска да работи, но доколкото прочетох май там няма как да стане.

Този код ползвам и на chrome си работи без проблем:

Код:
<script>
var x = document.getElementById("demo");

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else { 
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

function showPosition(position) {
	lat = position.coords.latitude;
	lon = position.coords.longitude;
	window.location = "?from=" + lat + "," + lon;
}
</script>

Тествам го с пренасочване - като се натисне бутона и се сподели локацията, в url адреса се зарежда ?from=XXXXX . Когато го пробвам през firefox ми излиза съобщението за споделяне на локация, но като потвърдя не се случва нищо.
 
От: Пресмятане на разстояние между координати

Бях го направил и си работеше екстра, докато не забелязах, че вече не работи с chrome javascript кода.
<button onclick="getLocation()">Try It</button>

<p id="demo"></p>

<script>
var x = document.getElementById("demo");

function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
x.innerHTML = "Geolocation is not supported by this browser.";
}
}

function showPosition(position) {
x.innerHTML = "Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude;
}
</script>
С мозилата няма ядове, но почнах да ровя, за да видя какъв е проблема и ето какво се изписва в конзолата:
"getCurrentPosition() and watchPosition() are deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See https://goo.gl/rStTGz for more details."

Явно са го направили само за сайтове със сертификат. Има ли начин да се подкара както си работеше преди или явно вече за всяка екстра ще искат HTTPS?
 
От: Пресмятане на разстояние между координати

Здравей,
като втори параметър на getCurrentPosition може да сложиш error callback функция, която да ти покаже каква е грешката. При мене даваше "Network location provider at 'https://www.googleapis.com/' : Returned error code 403." Добавих параметър за таймаут (третият параметър с опциите) и се получи.
Поздрави,
Константин.

Код:
<button onclick="getLocation()">Try It</button>

<p id="demo"></p>

<script>
var x = document.getElementById("demo");

function getLocation() {
if (navigator.geolocation) {
	navigator.geolocation.getCurrentPosition(showPosition, error,  {timeout: 30000, enableHighAccuracy: true, maximumAge: 75000});
} else {
x.innerHTML = "Geolocation is not supported by this browser.";
}
}

function showPosition(position) {
x.innerHTML = "Latitude: " + position.coords.latitude +
"<br>Longitude: " + position.coords.longitude;
}
function error(err) {
  alert(err.message);
};
</script>
 

Горе