Koordinaattien välisen etäisyyden laskeminen

Laskukaavasta kompassin käyttöön ja paljon muuta

Valvojat: geocache.fi, oh3mbc, Harjus, Fisherman77, taaru, haksu10

Koordinaattien välisen etäisyyden laskeminen

ViestiKirjoittaja 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 [gc.com]
 
Viestit: 99
Liittynyt: Ti 06.05.2008 0:29
Löytänyt: 184
Piilottanut: 0
Aloitti: 04.05.08 [10 v 4 kk 21 pv]

Re: Koordinaattien välisen etäisyyden laskeminen

ViestiKirjoittaja 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ä.
porakone [gc.com]
 
Viestit: 99
Liittynyt: Ti 06.05.2008 0:29
Löytänyt: 184
Piilottanut: 0
Aloitti: 04.05.08 [10 v 4 kk 21 pv]

Re: Koordinaattien välisen etäisyyden laskeminen

ViestiKirjoittaja 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
Avatar
Pek47ka [gc.com]
 
Viestit: 334
Liittynyt: Su 06.04.2008 17:34
Löytänyt: 2023
Piilottanut: 137
Aloitti: 04.10.07 [10 v 11 kk 21 pv]
Paikkakunta: Nummela (maalaiskunnan sivukylä)

Re: Koordinaattien välisen etäisyyden laskeminen

ViestiKirjoittaja 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!
porakone [gc.com]
 
Viestit: 99
Liittynyt: Ti 06.05.2008 0:29
Löytänyt: 184
Piilottanut: 0
Aloitti: 04.05.08 [10 v 4 kk 21 pv]

Re: Koordinaattien välisen etäisyyden laskeminen

ViestiKirjoittaja 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.
Bow more [gc.com]
 
Viestit: 55
Liittynyt: Pe 10.08.2012 18:01
Löytänyt: 5495
Piilottanut: 0
Aloitti: 04.07.12 [6 v 2 kk 21 pv]

Re: Koordinaattien välisen etäisyyden laskeminen

ViestiKirjoittaja 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
koodi [gc.com]
 
Viestit: 107
Liittynyt: To 30.06.2011 19:08
Löytänyt: 852
Piilottanut: 34
Aloitti: 30.06.11 [7 v 2 kk 25 pv]

Re: Koordinaattien välisen etäisyyden laskeminen

ViestiKirjoittaja 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
Avatar
stebu [gc.com]
 
Viestit: 609
Liittynyt: Pe 02.11.2007 0:25
Löytänyt: 4809
Piilottanut: 29
Aloitti: 03.10.07 [10 v 11 kk 22 pv]
Paikkakunta: Vantaa


Paluu Muuta apua

Paikallaolijat

Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 0 vierailijaa