Näytetään tekstit, joissa on tunniste paikkatieto. Näytä kaikki tekstit
Näytetään tekstit, joissa on tunniste paikkatieto. Näytä kaikki tekstit

keskiviikko 10. kesäkuuta 2015

Geodeettiset koordinaatistoformaatit

Törmäsin eilen Poliisiammattikorkeakoulun toimittamaan aineistoon, jossa oli mukana paikkatietoa.

Koordinaatit esitettiin aineistossa seuraavasti:

KOORDINAATTI_N,KOORDINAATTI_E
5927140,1909800
5949646,2256613
5950522,2303040
5955028,2316795
5956577,2320602
6002411,2402822


Koordinaatit olivat kuvauksen mukaan WGS84-koordinaatistossa ja niiden piti osua maanteiden varsille. Emme kuitenkaan saaneet aluksi selvää missä muodossa koordinaatit ovat, koska sellaisenaan ne eivät olleet ainakaan suoraan asteita eivätkä ne tuntuneet olevan myöskään maantieteellisiä koordinaatteja.

Sitten huomasin, että koordinaattien kolmas ja neljäs numero juoksee niin, että se ei saanut ikinä arvoja yli 60, josta mieleeni tuli, että koordinaattejahan voi esittää myös minuutteina ja sekunteina. Minuuteissa ja sekunneissa suurin arvo on tuo 60.

KOORDINAATTI_N,KOORDINAATTI_E
6059804,2537278
6059975,2540441
6100120,2348604
6100178,2426829
6100207,2422961


Ensinsiksi oletin, että koordinaatit olivat muotoa
Eli, kaksi ensimmäistä numeroa kuvaavat asteita, kaksi seuraavaa minuutteja ja loput sekunteja ja sekuntien desimaaleja. Pian huomasin kuitenkin, että sekunnit juoksivat arvoihin yli 60. Eli esimerkiksi tässä itä-koordinaatissa:
  • 2426829 → 24° 26' 82.9''
joka ei voinut ollut oikein, koska sekunnit eivät voi saada arvoa yli 60. Eli täytyi olla niin, että koordinaatit olivat muotoa:
Eli edellä mainittu koordinaattipiste on muotoa:
  • 2426829 → 24° 26.829'

Muunnos


Halusin muuntaa koordinaatit muotoon:
koska tämä on Google Mapsin suoraan tukema formaatti. Tein konvertoinnin Excelissä seuraavalla kaavalla:
  • =REGEXEXTRACT(A2, "^([0-9]{2})") & "." & TEXT(ROUND(REGEXEXTRACT(A2, "^[0-9]{2}([0-9]{5})")/1000/60*100000), "00000")
Kaava ottaa koordinaatin ensimmäiset kaksi numeroa sellaisenaan. Viisi viimeistä numeroa muunnetaan minuuteista desimaaleiksi jakamalla 60:llä, jonka jälkeen luku kerrotaan tarvittavan suurella luvulla, jotta saadaan mukaan riittävästi tarkkuutta. Lopputulos pyöristetään kokonaisluvuksi ja lisätään mahdolliset tarvittavat etunollat text()-funktiolla. Lopuksi asteet ja asteiden desimaalit yhdistetään erottamalla ne pisteellä.


Opittua


Usein kun saan käyttööni paikkatietoa ovat koordinaatistot ja formaatit jonkinmoinen murheenkryyni, joka useimmin juontaa siihen, että aineistoa ei ole kuvattu riittävällä tarkkuudella. Välillä aineistosta ei käy edes ilmi missä koordinaatistossa koordinaatit ovat. Ja kun yhdessä koordinaatistossa koordinaatit voidaan esittää useammassa formaatissa (maantieteellisesti, metrejä ja geodeettisesti, asteita), niin on ongelma vielä monimuotoisempi. Ja tosiaan, geodeettiset koordinaatit voidaan esittää myös käyttäen minuutteja ja sekunteja.

perjantai 8. maaliskuuta 2013

Suomen kuntien koordinaattitiedot

Olemme tekemässä PlusDesk:ssä juttua, johon tarvitsemme Suomen kuntien sijaintien koordinaattitiedot. Sijaintitiedot ilmaisevat kaupungin sijainnin maapallolla korkeus- ja leveyskoordinaattien avulla. Nämä tiedot ovat saatavilla Wikipedia:n artikkelista: Luettelo Suomen kuntien koordinaateista. Kiitos Teemu:lle vinkistä.

Wikipedia-artikkelin data ei ole kuitenkaan nykyisen kuntatilanteen mukaista ja tarvitsimme nimenomaan vuoden 2013 kuntatilanteen mukaiset koordinaattitiedot (vuonna 2013 Suomessa on 320 kuntaa).

Olisin voinut rajata Wikipedia:sta löytyneen koordinaattisisällön vastaamaan nykytilannetta, mutta päädyin sen sijaan ottamaan Google Chrome:n Scraper-lisäosalla nykyisen kuntalistauksen toisesta Wikipedia-artikkelista nimeltä Luettelo Suomen kunnista ja syöttämään tiedot GPS Visualizer -palveluun. Palvelu geokoodaa annetut osoitetiedot WGS84-muodossa oleviksi korkeus- ja leveyskoordinaateiksi valitun rajapinnan avulla (Yahoo tai Google). Syötin kuntien nimet palveluun muodossa "{Kuntanimi}, Finland", jotta välttyisin sekaannuksilta mahdollisesti muualta maailmasta löytyviin vastaavan nimisiin paikkoihin. (Kuva 1)

GPS Visualizer -palvelu hyödyntää avoimia rajapintoja osoitetietojen geokoodauksessa. (Kuva 1)
Keräämäni data, jonka oikeellisuuteen kannattaa suhtautua varauksella, on saatavilla täältä:
Tulen tarkistamaan datan oikeellisuuden vielä myöhemmässä vaiheessa, mutta yksittäiskokeilujen osalta koordinaattitiedot näyttäisivät pitävän paikkansa. Keräämäni datan avulla loin sitten pudotusvalikon, josta käyttäjän on mahdollista valita haluamansa kunta, jonka jälkeen ohessa oleva kartta tarkentuu kyseisen kunnan kohdalle. (Kuva 2)

Käyttäjän on pudotusvalikosta mahdollista tarkentaa haluamaansa kuntaan. (Kuva 2)
Pudotusvalikon HTML-koodi näyttää siis yksinkertaisuudessaan seuraavalta:

<select id="selector">
   <option value="">Valitse kunta</option>
   <option value="">- - - - </option>
   <option data-lat="61.167408" data-lon="23.867642">Akaa</option>
   <option data-lat="63.00285" data-lon="23.803185">Alajärvi</option>

   <option data-lat="64.158003" data-lon="24.299759">Alavieska</option>
   <option value="...">...</option>
</select>


Kyseistä HTML-koodia en tallenna sellaisenaan sivun lähdekoodiin vaan luon valikon lennossa oheisella JavaScript-koodilla.

$.ajax({
  url: jsonUrl + '/data/kunnat.json',
  method: "GET",
  dataType: "json",
  success: function(data) {
    $.each(data, function(index, municipality) {
      $('#selector').append('<option data-lat="' + municipality.lat + '" data-lon="' + municipality.lon + '">' + municipality.m + '</option>');
    });
  }
});


Tämä pienentää sivun kokoa eli painoa ja pienentää siten latausaikaa, mutta toisaalta toki lisää selaimelle aiheutuvaa prosessointi kuormaa. Sivun pieni paino on kuitenkin tärkeämpää etenkin mobiilikäytössä. Nykyisille selaimille ja laitteille kyseisenkaltainen prosessointi on hyvin kevyttä.

(Muokkaus klo 8:26: JSON-muodossa data on ~16 kilotavua kun vastaava HTML-muotoinen data olisi ollut ~21 kilotavua. Ero on siis etenkin prosentuaalisesta näkökulmasta merkittävä. Toki myös pyyntöjen määrä olisi hyvä minimoida kuten @Duukkis osuvasti huomioi.)

Koodissa näkyvä kunnat.json on luotu aiemmin mainitusta Google-dokumentista lataamalla se .csv-muodossa koneelle ja syöttämällä tämä .csv-muotoinen data Mr. Data Converter -palveluun. JSON on yleisesti verkossa tiedon välitykseen käytetty tiedostomuoto. Kuntien koordinaattitiedot sisältävä .json-tiedosto näyttää seuraavalta:

{"m":"Akaa","lat":61.167408,"lon":23.867642},
{"m":"Alajärvi","lat":63.00285,"lon":23.803185},
{"m":"Alavieska","lat":64.158003,"lon":24.299759},
{"m":"Alavus","lat":62.586607,"lon":23.617282},
...


Tässä hieman valoa siihen miten käsittelen ja hyödynnän dataa. Julkaisemme itse toteutuksen, jossa käytämme tätä pudotusvalikkoa toivottavasti ensi viikon aikana, joten siitä kuulette vasta sitten.