Koordinaattien välisen etäisyyden laskeminen

Laskukaavasta kompassin käyttöön ja paljon muuta
porakone
Viestit: 99
Liittynyt: Ti 06.05.2008 1:29

Koordinaattien välisen etäisyyden laskeminen

Viesti Kirjoittaja porakone » Ma 08.01.2018 22:37

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.

porakone
Viestit: 99
Liittynyt: Ti 06.05.2008 1:29

Re: Koordinaattien välisen etäisyyden laskeminen

Viesti Kirjoittaja porakone » Ma 08.01.2018 23:55

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ä.

Avatar
Pek47ka
Viestit: 340
Liittynyt: Su 06.04.2008 18:34
Paikkakunta: Nummela (maalaiskunnan sivukylä)

Re: Koordinaattien välisen etäisyyden laskeminen

Viesti Kirjoittaja Pek47ka » Ti 09.01.2018 9:27

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

porakone
Viestit: 99
Liittynyt: Ti 06.05.2008 1:29

Re: Koordinaattien välisen etäisyyden laskeminen

Viesti Kirjoittaja porakone » Ti 09.01.2018 13:23

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!

Bow more
Viestit: 64
Liittynyt: Pe 10.08.2012 19:01

Re: Koordinaattien välisen etäisyyden laskeminen

Viesti Kirjoittaja Bow more » Ti 09.01.2018 19:36

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.

Avatar
koodi
Viestit: 107
Liittynyt: To 30.06.2011 20:08

Re: Koordinaattien välisen etäisyyden laskeminen

Viesti Kirjoittaja koodi » To 11.01.2018 8:17

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

Avatar
stebu
Viestit: 611
Liittynyt: Pe 02.11.2007 0:25
Paikkakunta: Vantaa

Re: Koordinaattien välisen etäisyyden laskeminen

Viesti Kirjoittaja stebu » To 11.01.2018 17:35

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
-stebu

Vastaa Viestiin