Žemėlapių spalvinimas

Vienas iš naujesnių suaugusiųjų užsiėmimų yra spalvinti. Taip taip, spalvinti. Panašiai, kaip kad vaikai spalvina piešinukus. Tik suaugę spalvina sudėtingesnius piešinukus (smulkesnius). Šis užsiėmimas daug kam padeda atsipalaiduoti, įjungia kitą smegenų darbo režimą, malšina nugaros skausmus, gerina derlių darže ir t.t. ir pan.

Ir štai Didžiosios Britanijos žemėlapių dievukai Ordnance Survey parašė dienoraščio įrašą apie tai, kad kodėl gi nepanaudojus žemėlapių, kaip spalvinimo pagrindo?

Na o aš pagalvojau, o kodėl gi nepanaudojus Open Street Map duomenų kuriant analogiškus žemėlapius spalvinimui naudojant mums pažįstamas Lietuvos vietas? Juk tokį dalyką sukurti neturėtų būti sunku.

Taigi atsidariau QGIS, pasiėmiau Lietuvos shape failus, įdėjau žemėnaudą, vandens plotus, laisvalaikio plotus, pastatus ir kelius (kelių vektorius, kurie nesispalvoja, bet padaro žemėlapius labiau suprantamus). Tada visų plotų pildymą pakeičiau į permatomą ir prašom – visai neblogi žemėlapių lapai spalvinimui! Ir visa tai per 5 minutes!

spalvojimas

Kas sakė, kad vanduo būtinai turi būti mėlynas, o miškas ar pieva – žalia? 😉 O jūs ką manot? Norite pabandyti? Prašome: kelių pagrindinių miestų spalvinimo lapai:

Share

Kelių numerių ir dangų lyginimas

Anksčiau jau buvo rašyta, kaip lyginami išoriniai duomenų šaltiniai su atviro žemėlapio Open Street Map duomenimis (I dalis, II dalis). Tai taškinių (arba poligono centrų) duomenų lyginimas. Taškiniai duomenys yra paprastesni, todėl jų daugiau, juos paprasčiau rinkti, perduoti, gauti bei lyginti. Bet tai nereiškia, kad negalima lyginti ir kitokių tipų duomenis.

Lietuvos kelių duomenys

2014 metais iš Lietuvos automobilių kelių direkcijos buvo gauti (ir iki dabar gaunami atnaujinti) duomenys apie Lietuvos kelius: jų geometrija, numeriai ir dangos. Tai informacija, kurią galime matyti (ir naudoti pildant OSM žemėlapį) čia.

Bendras tikslas kaip ir aiškus – reikia patikrinti, ar sutampa LAKD ir OSM duomenys, t.y.:

  • Ar nėra kelių LAKD, kurių nėra OSM
  • Ar nėra kelių OSM, kurių nėra LAKD
  • Ar sutampa LAKD ir OSM kelių duomenys – numeriai ir dangos

Pagrindinis tokio sulyginimo skirtumas: lyginame ne taškus ir jų žymas, o kelius ir jų žymas. Jei lyginant taškus rezultatas gali būti „yra/nėra“ arba „nesutampa žymos“, tai lyginant kelius dar gali būti ir „šito gabalo nėra“ arba „šitos dalies danga ar numeris nesutampa“.

Lyginimo techninė realizacija

Tikrinimas vykdomas PostgreSQL duombazėje su PostGIS priedu (standartinė OSM duombazė). Nėra (arba aš nežinau ir neradau) geografinės operacijos, kuri galėtų palyginti kelis vektorių rinkinius ir kažkaip parodyti jų skirtumus su nurodyta paklaida (tarkim 50 metrų paklaida). Taigi vieno rinkinio (tarkim LAKD duomenų) kelius (vektorius) prieš tikrindami keičiame į taškus, naudodami funkciją ST_DumpPoints. Rezultate vietoje kelio gauname rinkinį taškų, išdėstytų ant kelio kas nurodytą atstumą:

vektorius_i_taskus

Tiesiog kuriant taškus iš vektorių gausime labai daug taškų (apie pusę milijono). Tokį taškų kiekį apdoroti reikės labai daug laiko. Taigi duomenis galime kažkiek supaprastinti. Tam pradžiai galime panaudoti funkciją ST_Simplify. Kadangi ST_DumpPoints iš vektoriaus padarys tiek taškų, kiek vektorius turi viršūnių, gali būti situacijų, kai labai ilgo vektoriaus segmento vidury duomenys skirsis, skirtumo mes nepastebėsime, jei tokių ilgų segmentų pradžiai nesuskaidysime į trumpesnius naudodami funkciją ST_Segmentize. Kuo mažiau apvalinsime ir daugiau segmentuosime – tuo gausime daugiau taškų, reiškia skaičiavimas užims daugiau laiko, bet rezultatas bus tikslesnis. Pradžiai imame stiprų apvalinimą ir nedarome jokio segmentavimo, taip skaičiavimus galima atlikti per kelias valandas.

Kiekvienas taškas turi tokias pat žymas (kelio numerį ir dangą), kaip kad turėjo vektoriai LAKD duomenyse.

Kai turime taškų (LAKD kelių) ir vektorių (OSM kelių) rinkinius, galima „eiti“ per visus turimus LAKD kelių taškus ir žiūrėti, ar per paklaidos (tarkim 100 metrų) atstumą yra OSM vektorius su reikiamomis žymomis, t.y. su tokiu pačiu kelio numeriu ir danga. Tikrindami gauname daugmaž tokį rezultatą:

...
51398 at 54.870567 25.250023 expected asphalt 108
52094 at 56.349779 22.745141 expected asphalt 1023
53819 at 54.871152 25.249397 expected asphalt 108
54990 at 56.173912 23.033801 expected unpaved 1018
...

Čia matome parodytas keturias klaidas, prie kiekvienos parodyta, kurioje vietoje buvo pagal LAKD duomenis tikėtasi kelio ir su kokia danga. Pavyzdžiui pirmoje eilutėje matome, kad taške 54.870567 25.250023 buvo tikėtasi rasti kelią su ref=108 ir danga asphalt.

Kadangi žinomos klaidų pozicijos, netgi nesutampančių vektorių geometrija ir savybės, naudodami QGIS nesunkiai galime padaryti neblogai atrodantį klaidų žemėlapį:

dangu_nesutapimai_201509

Rezultatai

Lyginant duomenis rastos tokios problemos:

  • LAKD duomenyse yra aiškiai atskirti „pagrindiniai“ keliai ir „jungtys“. Pagrindiniai keliai turi numerius A1, A2, 108, 2025 ir pan., o jungtys turi ilgus devynių skaitmenų numerius. Pagrindiniai keliai turėtų OSM būti pažymėti kaip motorway, trunk, primary, secondary, tertiary, o jungiamieji su priesaga „_link“. Daugelyje vietų kol kas pažymėta bet kaip: arba be „_link“, arba pagrindinis kelias su „_link“, arba jungiamasis kelias apskritai pažymėtas kokiu nors „unclassified“ ar „residential“.
  • Dangų nesutapimai dažniausiai aptinkami ten, kur per nedidelio miestelio ar kaimo teritoriją yra nutiesta nedidelė asfalto atkarpa. Bet yra nemažai neteisingai į OSM įvestų dangų.
  • Geometrijos neatitikimų kol kas nerasta.

Greitaveika

Tikrinimas pagal aukščiau aprašytą algoritmą užtrunka ilgokai. Jei pradinių vektorių dalinimas į taškus su st_dumppoints, st_segmentize, st_simplify vyksta akimirksniu, tai va vėlesni milijonai st_distance(point, way) kvietimų jau užima labai daug laiko. Tikriausiai galima būtų procesą pagreitinti į taškus pavertus ne tik LAKD vektorius, bet ir OSM vektorius. Tada būtų galima ir galutinių OSM objektų aibę sumažinti. Na bet šituos bandymus optimizuoti paliksime ateičiai ar kitiems savanoriams 🙂

Apibendrinimas

Šio nedidelio tyrimo rezultatai sakyčiau tokie:

  • OSM ir LAKD duomenys iš principo daugelyje vietų sutampa (nors yra labai daug smulkių neatitikimų). Kadangi duomenys suvesti nepriklausomai, tai galima sakyti, kad abu duomenų rinkiniai tikėtina yra teisingi ir pilni.
  • Su OSM duomenimis galima lyginti išorinius ne tik taškinius, bet ir kitokių geometrijų objektus.
  • Dar kartą parodyta, kad atvėrus duomenis ir leidus juos palyginti su OSM, naudą gauna abi pusės – tiek OSM, tiek duomenis atvėrusi organizacija/įmonė.
Share

Lietuvos adresai

Atvirame žemėlapyje OpenStreetMap įvedama ir adresų informacija. Adreso informaciją matome prie įvestų objektų, taipogi galime ieškoti konkretaus adreso.

adreso_paieska_openmap

Adresas gali būti įvestas keliais būdais:

  • Atskiras taškas
  • Poligonas (pvz. pastatas) gali turėti nurodytą savo adresą
  • Prie lankytinos vietos informacijos gali būti pridėta ir adreso informacija. Čia pastebėtina, kad net jei adresas nurodytas pastatui, o jo viduje yra daug lankytinų vietų, pažymėtų taškais, visiems jiems vis tiek nurodome adresus. Informacija kartojasi, bet taip bent jau šiuo metu yra paprasčiau, nes kaip nors automatiškai nustatyti adresą lankytinoms vietoms pagal kituose objektuose esančią informaciją toli gražu nėra paprasta iš techninės pusės.

Adresų informacijos pildymas

Jei tikėsime komerciniais žemėlapių tiekėjais, tai Lietuvoje yra daugiau nei 830000 adresų. Atvirame žemėlapyje šiuo metu įvesta beveik 140000 adresų. Pagrindinė tokio mažo adresų skaičiaus atvirame žemėlapyje priežastis – teisiniai apribojimai, kurie neleidžia masiškai importuoti adresų iš Registrų Centro. Kad iš principo tai įmanoma, matome Vilniuje, kur Vilniaus savivaldybei atvėrus adresų duomenis jie buvo greitai suimportuoti.

Iki bus atverta Registrų centro turima adresų informacija, už Vilniaus ribų adresus pildyti galima tik rankiniu būdu. T.y. reikia prisiregistruoti atvirame žemėlapyje, dėti naują tašką neįvesto adreso vietoje (tarkim pastato viduryje) ir nurodyti adreso informaciją – miestą, gatvę ir namo numerį.

adreso_taskas_id

Čia dar kartą verta priminti, kad adresus reikia suvedinėti pagal vietos žinias, o ne kopijuoti iš Registrų centro ar kitų žemėlapių svetainių, kurios naudoja tuos pačius Registro centro duomenis, t.y. adresų negalima kopijuoti iš maps.lt, maps.google.com ar regia.

Adresų informacijos tikrinimas

Kol neturime atviro išorinio adresų šaltinio, negalime pilnai patikrinti į OSM įvestų adresų informacijos korektiškumo, bet kai kurias klaidas rasti visgi galime. Pavyzdžiui:

  • Adreso numeris turi būti sudarytas tik iš skaitmenų ir raidžių – taip galima rasti adresų numerius, kur bandoma įvesti seniai neegzistuojančius „kampinius“ adresus, butų/kambarių informaciją ir pan.
  • Adreso gatvė turi tiksliai sutapti su pavadinimu netoliese esančioje gatvėje, t.y. adrese gatvės pavadinimas turi būti įrašytas su tokiais pačiais tarpais, didžiosiomis mažosiomis raidėmis ir galūnę „g.“ ar pan.
  • Adreso miestas turi patekti į to miesto administracines ribas (beje būtent dėl šios taisyklės prie adreso reikia įvesti ir miestą – žymą „addr:city“, adresų paieškoje ši žyma nenaudojama (miestas nustatomas pagal administracines ribas), jos reikia išimtinai adresų ar administracinių ribų klaidoms aptikti)

Aukščiau išvardintos taisyklės tikrinamos kiekvieną dieną ir adresai atitinkamai taisomi.

Adresų informacijos atsisiuntimas

OpenStreetMap duomenys yra atviri, taigi bet kas gali atsisiųsti Lietuvos (ar viso pasaulio) duomenis ir iš ten išsitraukti adresų informaciją. Deja jei reikia tik adresų informacijos, toks variantas nėra labai patogus, nes:

  • Tenka atsisiųsti žymiai daugiau informacijos, nei kad reikia adresų informacijai ištraukti
  • Adresų informacija gaunama įvairiais geometrijos tipais: taškais arba poligonais
  • Kai kurie adresai kartojasi (pavyzdžiui kai turime pastatą ir jo viduje esančius objektus su adresais)

Kad būtų paprasčiau, Lietuvos adresų informacija išimama iš Lietuvos duomenų, apdorojama ir platinama atskirai. Apdorojimas gan paprastas:

  • Jei adresas yra poligone, kaip adreso koordinatės ištraukiamas poligono centras
  • Jei tokių pačių adresų yra daugiau nei vienas, tai galutiniame faile pateikiamas visų adreso koordinačių geometrinis vidurkis

Tokį apdorotą adresų failą galite atsisiųsti kaip ESRI shape failą iš http://shapes.openmap.lt.

Share

JOSM lietuviškai

Pagaliau JOSM – atviro žemėlapio OpenStreetMap redaktorius – tinkamas bet kokių duomenų bet kokiam kiekiui keisti, dėl ko jį naudoja beveik visi ilgą laiką redaguojantys žymėtojai, prakalbo lietuviškai!

josm_lietuviskai

Ačiū visiems prisidėjusiems. Šiandien išversta 60% JOSM tekstų, taigi dar laukia daug darbo, bet vis tiek džiugu!

Priminsiu, kad JOSM verčiamas launchpade.

Share

Lankytinų vietų sinchronizavimas (II dalis)

Ankstesniame įraše buvo išdėstytos mintys, kodėl reikalinga lankytinų vietų (toliau – LV) sinchronizavimo sistema. Šiame įraše papasakosiu, kaip ši sinchronizavimo sistema realizuota Lietuvoje, kas ir kaip ja gali pasinaudoti.

Išoriniai duomenys

Visų pirma reikia gauti išorinius duomenis. Juos galima gauti įvairiais formatais: skaičiuoklės, csv, shape, geojson failai ir pan. Šiuo metu veikianti LV sincrhonizavimo sistema duomenis tikisi gauti xml formatu, taigi bet kokius kitus formatus reikia konvertuoti į xml.

Xml faile mažų mažiausia, ko reikia, tai platumos ir ilgumos laukų (vietoje šių laukų galima naudoti adreso lauką, bet tai susiję su eile kitų problemų, todėl šiame straipsnyje kalbėsime tik apie variantą, kai gauname konkrečias koordinates). Prie koordinačių atskiruose laukuose dėliojame visą informaciją, kokią tik gauname ir kokia gali būti įdomi atvirame žemėlapyje.

Štai pavyzdinis (apkarpytas) muziejų duomenų failo gabalas:

<limis>
<museum>
  <lat>54.900281</lat>
  <lon>23.911986</lon>
  <url>www.ciurlionis.lt</url>
  <type>national</type>
  <name>Nacionalinis M. K. Čiurlionio dailės muziejus</name>
</museum>
<museum>
  <lat>54.487559</lat>
  <lon>22.997380</lon>
  <url>http://muziejai.lt/Vilkaviskis/basanaviciaus_sodyba.htm</url>
  <type>national</type>
  <name>Jono Basanavičiaus gimtinė</name>
</museum>
...

Kiekvienas objektas atskirtas žymomis <museum></museum> ir jo viduje turime konkretaus muziejaus savybes.

Susiejimas su OSM

Kaip matome, išorinių duomenų xml’e žymos gali būti bet kokios: jos nebūtinai turi atitikti OSM naudojamas žymas. Išoriniame šaltinyje žymos gali būti kad ir lietuviškos, tarkim <pavadinimas>. Kad būtų galima lyginti/pildyti duomenis, mums reikės susieti šio išorinio xml žymas su OSM žymomis. Pavyzdžiui aukščiau pateikto muziejų xml susiejimas būtų:

  • urlwebsite (t.y. xml laukas „url“ atitinka OSM lauką „website“)
  • typemuseum_type
  • namename

Kiekvienam lauko susiejimui nurodome požymius:

  • naudoti bendroje paieškoje – lauko reikšmė įrašoma į bendrą užklausą ieškant objekto. Jei nustatyta reikšmė „taip“ – objektas atvirame žemėlapyje privalo turėti atitinkamą reikšmę, kad sinchronizacijos rezultatas būtų ne „nerasta“, o bent jau „beveik“ („beveik“ reiškia, kad objektas rastas, bet jo informaciją reikėtų patikslinti)
  • naudoti detalioje paieškoje – lauko reikšmė įrašoma į detalią užklausą ieškant objekto. Jei nustatyta reikšmė „taip“ – objektas atvirame žemėlapyje privalo turėti atitinkamą reikšmę, kad sinchronizacijos rezultatas būtų „yra“.

Taip pat nurodysime, kad atvirame žemėlapyje visi muziejų duomenys būtinai turi turėti žymą „tourism“ su reikšme „museum“.

Na ir pabaigai nurodysime keletą bendrų nustatymų:

  • Paklaida – Kokia leidžiama koordinačių neatitikimo paklaida (metrais). T.y. jei objektas yra įvestas į atvirą žemėlapį, bet jo koordinatės nutolusios labiau nei nurodyta paklaida – bus interpretauojama, kad išorinis objektas neįvestas ir kad atvirame žemėlapyje yra vienas perteklinis objektas.
  • Užklausa – Bendra užklausos „where“ sąlyga, randanti visus objektus Lietuvoje. Pavyzdžiui muziejams tiks sąlyga „tourism = ‘museum’“, sudetingesnis atvejis galėtų būti „shop in (‘convenience’, ‘supermarket’) and name like ‘Woolworths%’“.

Tikrinimas

Tikrinimas vyksta dviem etapais. Visų pirma vykdome užklausą su bendromis sąlygomis:

  • Visiems objektams taikoma sąlyga (pvz. aukščiau nurodyta sąlyga „tourism=’museum’“)
  • Laukai, kurių „bendros paieškos“ požymis lygus „taip“
  • Atstumas tarp objekto atvirame žemėlapyje ir išoriniuose duomenyse turi būti ne didesnis už nurodytą paklaidą

Jei ši užklausa negrąžina jokių rezultatų, tai objekto sinchronizacijos rezultatas yra „NĖRA“ – t.y. objektas nerastas, jį reikia įvesti.

Jei užklausa grąžina vieną ar daugiau rezultatų, vykdoma antra užklausa, kurioje prie bendrų (aukščiau aprašytų) sąlygų pridedamos ir laukų, kurių „detalios paieškos“ požymis lygus „taip“ sąlygos.

Jei ši užklausa randa rezultatą – sinchronizacijos rezultatas – „YRA“ (t.y. objektas rastas ir jis jau yra su teisingomis atributų reikšmėmis).

Jei ši detali užklausa objekto neberanda – rezultatas bus „BEVEIK“, kas reiškia, kad objektas yra, bet reikia patikslinti jo informaciją.

Taigi įvykdžius šias užklausas visiems išorinio šaltinio duomenims gauname sąrašą objektu, kurie pažymėti vienu iš trijų variantų: YRA, BEVEIK arba NĖRA.

poi_list

Ant kiekvieno objekto galima spausti ir gauti detalią informaciją.

poi_detail

Šiame lange galima spausti nuorodą [Atidaryti vietą], kuri JOSM redaktoriuje atidaro sritį, kurioje pažymėtas objektas (tai paprastai naudojama, kai objektas yra, bet jo informaciją reikia papildyti).

Taip pat galima spausti kitą nuorodą [Pridėti objektą (tašką)], kuri JOSM redaktoriuje prideda tašką su visais objektui išoriniame šaltinyje nurodytais atributais (ši nuoroda paprastai naudojama, kai objekto apskritai dar nėra atvirame žemėlapyje).

Na ir paskutinis dalykas – parodomi objektai, kurie atitiko bendrą sąlygą (kaip kad mūsų pavyzdyje „tourism=’museum’“), bet kurie nebuvo „rasti/susieti“ nė su vienu išoriniame šaltinyje minimu objektu. T.y. randami pertekliniai objektai, kurie yra atvirame žemėlapyje, bet kurių nebuvo išoriniame šaltinyje.

Kaip panaudoti/pasinaudoti?

Išorinius LV duomenis gali teikti tiek kompanijos (duomenų savininkės), suinteresuotos savo informacijos skleidimu (kaip antai Palink teikia IKI parduotuvių informaciją), tiek ir atviro žemėlapio entuziastai, radę išorinį duomenų šaltinį, suderinę su duomenų savininkų ir konvertavę duomenis į aukščiau nurodytą xml formatą.

Duomenų teikimas gali būti statinis: xml failas kartas nuo karto pateikiamas rankiniu būdu. Gali būti ir dinaminis, kaip antai Palink atveju: yra duotas url, iš kur galima atsisiųsti pastoviai atsinaujinančius IKI parduotuvių duomenis.

Svarbiausia nepamiršti, kad išoriniai duomenys turi būti atviri: įkėlus duomenis į OpenStreetMap juos galės žiūrėti, pasiimti ir be jokio paklausimo/suderinimo bet kaip naudoti (net ir komerciniais tikslais) bet kas – tiek ne pelno, tiek ir pelno siekiančios organizacijos.

Taigi jei turite tokių išorinių duomenų – susisiekite su Lietuvos OSM bendruomene – geriausia tą padaryti per sąrašyną. Jei dalis apie išorinių duomenų susiejimą su OSM žymomis ar apie bendras/detalias užklausas pasirodė per sudėtinga – nesijaudinkite, svarbiausia yra turėti duomenis, susiejimą ir užklausas tikrai bus kam parašyti.

Share