Konrad Karpieszuk

Konrad Karpieszuk WordPress Plugin
Compatibility
Assurance for WPML

Temat: obliczanie odleglosci na podstawie latlng

witam

w bazie mam zapisane wspolrzedne punktow w formacie, jaki stosuje google maps (np 53.2292829,55.37635367). na tej bazie musze znalezc wszelkie punkty w bazie w odleglosci nie wiekszej niż 20 km od pewnego punktu (tez w tym samym formacie zapisanego).

mniej wiecej algorytm mam w glowie. explode na przecinku, potem z rownania trojkata wyliczanie dlugosci, przeliczanie odleglosci na kilometry...

mam jednak wielkie wrazenie, ze nie jestem pierwszym, ktory czegos takiego potrzebuje :) widzial ktos gotowy gotowiec do tego?
Wojciech Zymonik

Wojciech Zymonik Programista PHP

Temat: obliczanie odleglosci na podstawie latlng

Kiedyś potrzebowałem coś takiego i rozwiązanie działało po stronie bazy, nie pamiętam za wiele ale pierwszy wynik z google-a (dla 'mysql radius latitude longitude') dał coś takiego:

SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance` FROM `members` HAVING `distance`<=’10′ ORDER BY `distance` ASC

(to chyba w milach ;))

Temat: obliczanie odleglosci na podstawie latlng

Na pewno to można załatwić z poziomu bazy danych. Nie wiem, z jakiej bazy korzystasz.
Do MySQL trzeba doinstalować dodatkowe rozszerzenie. Trochę informacji jest tu:
http://spanring.eu/blog/2007/10/30/improved-mysql-gis-...
http://forge.mysql.com/wiki/GIS_Functions
Natomiast PostgreSQL ma do takich rzeczy dodatkowy moduł:
http://www.postgresql.org/docs/9.0/interactive/earthdi...
Możesz też rozwiązać problem z poziomu samego API Google Maps. Np. tak:
http://briancray.com/2009/04/01/how-to-calculate-the-d...
http://briancray.com/wp-content/uploads/2009/04/distan...Piotr Wittchen edytował(a) ten post dnia 22.06.11 o godzinie 19:37

Temat: obliczanie odleglosci na podstawie latlng

Konrad Karpieszuk:
mniej wiecej algorytm mam w glowie. explode na przecinku, potem z rownania trojkata wyliczanie dlugosci, przeliczanie odleglosci na kilometry...

Tia... robiłem kiedyś coś takiego. Gotowego wzoru w necie nie znalazłem więc wyprowadziłem. Generalnie jak będziesz to robił tylko z trójkąta to dostaniesz duże błędy pomiaru (nawet na małych odległościach) i niestety trzeba to liczyć po powierzchni kuli.
mam jednak wielkie wrazenie, ze nie jestem pierwszym, ktory czegos takiego potrzebuje :) widzial ktos gotowy gotowiec do tego?

wzorek w mysqlu:

round(2 * varR * asin(sqrt(pow(cos(tbl1.Latitude * PI() / 180) + cos(tbl2.Latitude * PI() / 180), 2) * pow(sin((tbl1.Longitude * PI() / 180 - tbl2.Longitude * PI() / 180) / 2), 2) / 4 + pow(sin((tbl1.Latitude * PI() / 180 - tbl2.Latitude * PI() / 180) / 2), 2))))

tbl1.Longitude i tbl1.Latitude to długość i szerokość pierwszego punktu
tbl2.Longitude i tbl2.Latitude - drugiego punktu

varR to zmienna zawierająca średni promień ziemi (sory - w uwzględnianie spłaszczenia już się nie bawiłem). Jak podasz w kilometrach to wynik będzie w kilometrach, jak w łokciach to w łokciach ;-).

Nie uwzględniłem tylko jednego przypadku bo u mnie nie ma szans wystąpić (poruszam się tylko po terenie Polski). Jeżeli w wyniku wyjdzie odległość większa niż połowa obwodu Ziemi to trzeba ten wynik odjąć od obwodu Ziemi aby otrzymać wynik ostateczny. Taka sytuacja zajdzie wtedy gdy najkrótsza droga przebiega przez południk 180.

Wyprowadzenia nie będę tutaj podawał bo jest długie. Ważne, że działa.

Wisisz mi piwo bo pamiętam, że wyprowadzenie tego wzorku zajęło mi ze dwie godziny... przypominanie sobie geometrii po studiach bolało.

Temat: obliczanie odleglosci na podstawie latlng

Wojtek Zymonik:
SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance` FROM `members` HAVING `distance`<=’10′ ORDER BY `distance`
> ASC

ciekawi mnie ten magic number 60 * 1.1515 :P
Tomasz Zadora

Tomasz Zadora programuję

Temat: obliczanie odleglosci na podstawie latlng

Powiązane z tematem:
http://www.movable-type.co.uk/scripts/latlong.htmlTomasz Zadora edytował(a) ten post dnia 22.06.11 o godzinie 20:29
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: obliczanie odleglosci na podstawie latlng

kula nie jest chyba najdokladniejszym rozwiazaniem, ale jezeli wyniki sa wystarczajace to sie nie odzywam :)
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: obliczanie odleglosci na podstawie latlng

Tak na przyszłość może się przyda słowo klucz: ortodroma
http://pl.wikipedia.org/wiki/OrtodromaBartosz Ratajczyk edytował(a) ten post dnia 22.06.11 o godzinie 20:42
Konrad Karpieszuk

Konrad Karpieszuk WordPress Plugin
Compatibility
Assurance for WPML

Temat: obliczanie odleglosci na podstawie latlng

zapomnialem zaznaczyc ze dane latlng zawsze beda trzymane w bazie w jednej komorce w formacie jak podalem (czyli "lat.n,lng.n") wiec wyliczanie w bazie bedzie co najmniej trudne jesli nie niemozliwe :) szukam czegos w php.

wplyw na format zapisu w bazie nie mam, wiec zapomnijmy ze tu jest sql :) tu sa dwie zmienne $a = "53.1213141,55.2425226" i $b = "53.8227281,51.3839392" i trzeba obliczyc odleglosc miedzy nimi

Temat: obliczanie odleglosci na podstawie latlng

Konrad Karpieszuk:
zapomnialem zaznaczyc ze dane latlng zawsze beda trzymane w bazie w jednej komorce w formacie jak podalem (czyli "lat.n,lng.n") wiec wyliczanie w bazie bedzie co najmniej trudne jesli nie niemozliwe :) szukam czegos w php.

No jak masz gotowy wzorek to chyba już dasz rade go sobie zapisać w obojętnie jakim języku programowania, nie? Z wyjątkiem funkcji MySQlowej PI(), którą musisz zastąpić stałą to pozostałe funkcje w php nawet nazywają się tak samo.

Temat: obliczanie odleglosci na podstawie latlng

Bartosz Ratajczyk:
Tak na przyszłość może się przyda słowo klucz: ortodroma
http://pl.wikipedia.org/wiki/Ortodroma

Ten wzorek jakiś taki prosty w tej Wiki

konto usunięte

Temat: obliczanie odleglosci na podstawie latlng

Konrad Karpieszuk:
zapomnialem zaznaczyc ze dane latlng zawsze beda trzymane w bazie w jednej komorce w formacie jak podalem (czyli "lat.n,lng.n") wiec wyliczanie w bazie bedzie co najmniej trudne jesli nie niemozliwe :) szukam czegos w php.

wplyw na format zapisu w bazie nie mam, wiec zapomnijmy ze tu jest sql :) tu sa dwie zmienne $a = "53.1213141,55.2425226" i $b = "53.8227281,51.3839392" i trzeba obliczyc odleglosc miedzy nimi

zrobienie split ciągu tekstowego na poziomie MySQL + convert stringa do jakiegoś float to kaszka z mleczkiem

SUBSTRING_INDEX
CONVERT

konto usunięte

Temat: obliczanie odleglosci na podstawie latlng

Wojciech Małota:
Bartosz Ratajczyk:
Tak na przyszłość może się przyda słowo klucz: ortodroma
http://pl.wikipedia.org/wiki/Ortodroma

Ten wzorek jakiś taki prosty w tej Wiki

bo w wiki masz obliczenia w stopniach a w w twoim przeliczasz na radiany w których liczy MySQL

Temat: obliczanie odleglosci na podstawie latlng

Przemysław R.:
bo w wiki masz obliczenia w stopniach a w w twoim przeliczasz na radiany w których liczy MySQL

Nie chodzi o to... na wiki strukturalnie jest prostszy, bez potęg, pierwiastków itp. Zapewne znowu wymyśliłem najbardziej skomplikowany sposób rozwiązania jakiegoś problemu ;-)
Bartosz Ratajczyk

Bartosz Ratajczyk MS SQL Developer

Temat: obliczanie odleglosci na podstawie latlng

Wojciech Małota:
ciekawi mnie ten magic number 60 * 1.1515 :P

http://stackoverflow.com/questions/389211/geospatial-c...

"60 is the number of minutes in a degree; (...) and 1.1515 is the number of statute miles in a nautical mile (thanks, DanM). One nautical mile is the length of one minute of latitude at the equator."

Na wiki wzór jest prosty i odwzorowuje go przykład Wojtka Z.

Skąd wyprowadzałeś swój wzór?

konto usunięte

Temat: obliczanie odleglosci na podstawie latlng

Wojciech Małota:
Przemysław R.:
bo w wiki masz obliczenia w stopniach a w w twoim przeliczasz na radiany w których liczy MySQL

Nie chodzi o to... na wiki strukturalnie jest prostszy, bez potęg, pierwiastków itp. Zapewne znowu wymyśliłem najbardziej skomplikowany sposób rozwiązania jakiegoś problemu ;-)

sqrt(pow(2,2)) = ?

hmm wartość bezwzględna ;)

Temat: obliczanie odleglosci na podstawie latlng

Bartosz Ratajczyk:
Skąd wyprowadzałeś swój wzór?

Łopatologicznie z geometrii. Sowami tego nie wytłumaczę, musiałbym rysunki robić, a przyznam że trochę mi się nie chce. Generalnie jest sprawdzony w działaniu więc działa. Pewnie wzór z wiki był wyprowadzany z innych zależności w kuli. Ja sobie narysowałem trapez równoramienny, którego dwa przeciwległe (po przekątnej) rogi odpowiadały dwóm punktom, których mamy położenie. Potem wyliczałem sobie ze współrzędnych długości podstaw tego trapezu i różne kąty. Potem długość przekątnej trapezu (czyli odległość po prostej pomiędzy punktami) i na końcu długość części koła wielkiego opartej na tej przekątnej. Pewnie jest prostszy sposób, z którego wychodzi łatwiejszy wzorek. Ale jak go szukałem parę lat temu to jakoś w necie nie znalazłem.Wojciech Małota edytował(a) ten post dnia 22.06.11 o godzinie 22:36

Temat: obliczanie odleglosci na podstawie latlng

Przemysław R.:
sqrt(pow(2,2)) = ?

hmm wartość bezwzględna ;)

no ale w tym sqrt jest trochę więcej rzeczy ;-)
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: obliczanie odleglosci na podstawie latlng

a pani na gejografii mowila ze ziemia nie jest kula tylko geoida, i ze promien jest wiekszy na rowniku a mniejszy na biegunach ;p

Temat: obliczanie odleglosci na podstawie latlng

Łukasz C.:
a pani na gejografii mowila ze ziemia nie jest kula tylko geoida, i ze promien jest wiekszy na rowniku a mniejszy na biegunach ;p

kłamała :P



Wyślij zaproszenie do