Simo K. Kivelä / 14.05.2003

Kaarietäisyys ja suunta maapallon pinnalla

Remove["Global`*"]

Lyhin tie maapallon pinnalla pisteestä toiseen kulkee ns. isoympyrän kaarta pitkin. Isoympyrä on pallon pinnalla sijaitseva ympyrä, jonka säde on sama kuin pallon säde. Jos halutaan tietää isoympyrä, joka kulkee kahden annetun pallon pinnalla sijaitsevan pisteen kautta, se voidaan määrätä asettamalla taso, joka kulkee mainittujen pisteiden ja pallon keskipisteen kautta. Tämä taso leikkaa pallopintaa pitkin haluttua isoympyrää.

Kolme pistettä määrää tason yksikäsitteisesti, mikäli ne eivät ole samalla suoralla. Edellä olevassa tason asettamisessa voi siis esiintyä ongelmia vain, jos annetut pallopinnan pisteet ovat täsmälleen vastakkaisia pisteitä. Tällöin niitä yhdistävä isoympyrän kaari ei ole yksikäsitteinen, mutta etäisyys mitattuna pitkin mitä tahansa kyseeseen tulevaa isoympyrän kaarta on aina sama: puolet pallon ympärysmitasta.

Tavoitteena on muodostaa funktio, jolla voidaan laskea kahden maapallon paikkakunnan lyhin etäisyys pitkin pallon pintaa ja suunta, johon edellisestä paikasta on lähdettävä jälkimmäiseen kuljettaessa.

Funktiolla on kaksi muuttujaa, joista kumpikin on kaksialkioinen lista. Alkiot ovat paikkakunnan maantieteellinen leveysaste ja pituusaste. Nämä ilmoitetaan asteissa väleiltä -90 ° ... 90  ° ja -180 ° ... 180  °. Funktion arvona on kaksialkioinen lista: kaarietäisyys kilometreissä ja lähtösuunta asteissa väliltä -180 ° ... 180  °. Pohjoissuunta on 0  ° ja lukema kasvaa itäänpäin käännyttäessä.

Määritellään ensin funktio, joka antaa kaarietäisyyden:

kaariet[pk1_List, pk2_List] := 
      Module[{r = 6370, lev1, pit1, lev2, pit2, p1, 
          p2}, 
lev1 = N[pk1[[1]] Degree]; 
        pit1 = N[pk1[[2]] Degree]; 
lev2 = 
          N[pk2[[1]] Degree]; 
        pit2 = N[
            pk2[[2]] Degree]; 
p1 = {Cos[
                lev1] Cos[pit1], Cos[lev1] Sin[pit1], 
            Sin[lev1]}; 
p2 = {Cos[lev2] Cos[
                pit2], Cos[lev2] Sin[pit2], 
            Sin[lev2]}; 
r ArcCos[
            p1 . p2]]

Module on Mathematican rakenne, jonka sisään voidaan sijoittaa useita suoritettavia käskyjä. Sen ensimmäinen argumentti on lista, jossa luetellaan rakenteen sisäiset muuttujat. Tämän jälkeen tulevat suoritettavat käskyt puolipisteillä erotettuina. Modulen arvoksi ja siis myös funktion arvoksi tulee viimeisen käskyn tulos.

Käyttö tapahtuu kuten minkä tahansa funktion käyttö. Esimerkiksi pohjois- ja etelänavan etäisyys on

kaariet[{90, 0}, {-90, 0}]

tai Helsingin ja Tokion etäisyys

helsinki = {60 + 8/60, 25} // N

tokio = {35 + 40/60, 139 + 45/60} // N

kaariet[helsinki, tokio]

Lähtösuunta voidaan laskea kolmiulotteisen vektorialgebran avulla. Seuraava koodi ei ehkä ole aivan helposti ymmärrettävissä, mutta funktion määrittelyn periaatteellisen rakenteen kannalta se ei ole oleellista.

suunta[pk1_List, pk2_List] := 
      Module[{r = 6370, lev1, pit1, lev2, pit2, p1, p2, 
          k = {0, 0, 1}, itaan, e1, e2, 
          snta}, 
lev1 = N[pk1[[1]] Degree]; 
        pit1 = N[pk1[[2]] Degree]; 
lev2 = 
          N[pk2[[1]] Degree]; 
        pit2 = N[
            pk2[[2]] Degree]; 
p1 = {Cos[
                lev1] Cos[pit1], Cos[lev1] Sin[pit1], 
            Sin[lev1]}; 
p2 = {Cos[lev2] Cos[
                pit2], Cos[lev2] Sin[pit2], 
            Sin[lev2]}; 
itaan = 
          Cross[k, p1]; 
e1 = 
          itaan/Sqrt[itaan . itaan]; 
e2 = 
          Cross[p1, e1]; 
snta = 
          Cross[Cross[p1, p2], 
            p1]; 
(Pi/2 - 
              ArcTan[snta . e1, snta . e2])/Degree]

suunta[helsinki, tokio]

Lähtösuunta on siis lähellä koillista (45  °).

Lopuksi määritellään funktio, joka laskee molemmat:

suuntaJaEtaisyys[pk1_List, pk2_List] := {kaariet[pk1, pk2], 
        suunta[pk1, pk2]}

suuntaJaEtaisyys[helsinki, tokio]

Mathematica tarjoaa monipuolisen ohjelmointiympäristön. Edellä oleva on myös esimerkki siitä, miten käyttäjä voi ohjelmoimalla laajentaa Mathematicaa.