Sivu 1/1

Koordinaattien välisen etäisyyden laskeminen

Lähetetty: Ma 08.01.2018 22:37
Kirjoittaja porakone
Yhden säikeen aiheesta löysinkin, mutta se oli vanha eikä mitkään sen linkit toimineet. Niin kysyn nyt sitten täällä.

Mulla on tiedosto jossa on paljon pisteitä desimaalikoordinaateilla, ja haluaisin vääntää ohjelman joka lukisi sen ja järjestelisi niitä sitten haluamani mukaan. Ongelma vaan on etten tunnin tahkoamisellakaan löytänyt ratkaisua miten lasken niiden etäisyyden. Löysin kyllä kaavoja joissa oli neliöjuurta ja potenssia, ja tulipa ensi kerran peruskouluaikojen törmättyä sellaiseenkin asiaan kuin Pythagoraan lause mutta en saanut millään noista sellaisia tuloksia kuin netin valmiilla laskureilla jotka todennäköisesti ovat oikeassa.

Otetaan nyt esimerkiksi pisteet 61.571389 25.896111 ja 62.008611 28.794444 joiden etäisyys on nettipalvelujen mukaan 159.9km

Minkälaisella kaavalla tuohon päädytään?

Mainitut koordinaatit ovat ihan hatusta repäistyt, eikä koko asia liity mitenkään kätköilyyn mutta arvelin täältä löytyvän koordinaattiasiantuntemusta.

EDIT: Sen verran vielä että tässä e haeta nyt pilkuntarkkaa suoritusta, 10% heitto on ihan ok. Tuli vaan mieleen kun tutkin asiaa vielä lisää niin pilkuntarkka tulos näyttää vaativan vielä enemmän koodia.

Re: Koordinaattien välisen etäisyyden laskeminen

Lähetetty: Ma 08.01.2018 23:55
Kirjoittaja porakone
No eihän se nyt niin vaikeeta ollukaan. Tunti lisää ja valmista tuli. Siltä varalta että jotakuta muutakin joskus kiinnostaa niin esimerkkikoordinaateilla laskenta menee seuraavasti:

lon1 = 0.017453293 * 25.896111
lat1 = 0.017453293 * 61.571389
lon2 = 0.017453293 * 28.794444
lat2 = 0.017453293 * 62.008611
a = SIN(lat1) * SIN(lat2)
b = COS(lat1) * COS(lat2) * COS(lon2 - lon1)
c = ARCCOS(a + b) :::(Quickbasic64:ssä funktio on _ACOS)
Pisteiden välinen etäisyys = 6367 * c

Tämä löytyi ohjeesta jossa oli noottina "An UNRELIABLE way to calculate distance on a spherical Earth is the Law of Cosines for Spherical Trigonometry
** NOT RECOMMENDED **" ja "it is unreliable for small distances because the inverse cosine is ill-conditioned"

Ilmeisesti tuosta johtuen tulos heittää todellisesta reilulla sadalla metrillä.

Re: Koordinaattien välisen etäisyyden laskeminen

Lähetetty: Ti 09.01.2018 9:27
Kirjoittaja Pek47ka
Sijoittaa vaan tähän: http://gc.pitko.net/gccalc.html

nuo arvot 61.571389 25.896111 ja 62.008611 28.794444

saadaan 160.47111760850044 km etäisyydeksi ja suunniksi vielä 71.0521233506856 ja 253.60633562717808 astetta.

:D :D :D

Re: Koordinaattien välisen etäisyyden laskeminen

Lähetetty: Ti 09.01.2018 13:23
Kirjoittaja porakone
Sijoittaminen ei nyt oikein tullu kysymykseen kun teen Basicilla ohjelmaa joka pullaa sen koordinaatit sisältävän tiedoston kanssa ja laskee niiden välisiä etäisyyksiä.

Mut kiitti kuitenkin!

Re: Koordinaattien välisen etäisyyden laskeminen

Lähetetty: Ti 09.01.2018 19:36
Kirjoittaja Bow more
Tulosten erot johtunevat ainakin joskus siitä mitä arvoa käytetään maapallon säteenä (edellä 6367 km joka on eräiden lähteiden mukaisen ellipsoidin minimi- ja maksimisäteiden keskiarvo).
Usein säteen arvoksi katsotaan 6371 km
Esim. https://en.wikipedia.org/wiki/Earth_radius antaa aiheesta paljonkin lisätietoa.

Re: Koordinaattien välisen etäisyyden laskeminen

Lähetetty: To 11.01.2018 8:17
Kirjoittaja koodi
porakone kirjoitti:No eihän se nyt niin vaikeeta ollukaan. Tunti lisää ja valmista tuli. Siltä varalta että jotakuta muutakin joskus kiinnostaa niin esimerkkikoordinaateilla laskenta menee seuraavasti:

lon1 = 0.017453293 * 25.896111
lat1 = 0.017453293 * 61.571389
lon2 = 0.017453293 * 28.794444
lat2 = 0.017453293 * 62.008611
a = SIN(lat1) * SIN(lat2)
b = COS(lat1) * COS(lat2) * COS(lon2 - lon1)
c = ARCCOS(a + b) :::(Quickbasic64:ssä funktio on _ACOS)
Pisteiden välinen etäisyys = 6367 * c

Tämä löytyi ohjeesta jossa oli noottina "An UNRELIABLE way to calculate distance on a spherical Earth is the Law of Cosines for Spherical Trigonometry
** NOT RECOMMENDED **" ja "it is unreliable for small distances because the inverse cosine is ill-conditioned"

Ilmeisesti tuosta johtuen tulos heittää todellisesta reilulla sadalla metrillä.
Tuosta tarkasta Pek47ka Ed Williamsin javascript koodista olen portannut Javalle, PHP:lle ja Excelin vba-makroiksi.
Vba-koodista (Visual Basic for Application) lienee kohtuudella siirrettävissä tuolle QB64:lle.
Excel-lomake http://koodi.890m.com/Great%20Circle%20Calculator.xlsm.
t.koodi

Re: Koordinaattien välisen etäisyyden laskeminen

Lähetetty: To 11.01.2018 17:35
Kirjoittaja stebu
Simppeli ja nopea tapa, muttei niin tarkka (varsinkaan yli 1000km etäisyyksillä) on (Python esimerkki):
def rdist(la1,lo1,la2,lo2): # Spherical Earth projected to a plane, good for short distances < 1000km
dn = la1 - la2
de = (lo1 - lo2) * math.cos((la1+la2)*math.pi/360)
return 111120.0*math.sqrt(dn*dn + de*de)

Eli lasketaan etäisyys suorakulmaisen kolmion hypotenuusasta. N-suunnassa kateetti on N-koordinaattien erotus, E-suunnassa erotusta pitää korjata keskilatitudin cosinilla. Ja astehan (N-suunnassa) on 111.120 km