Topologijos taisyklės

Plotai su „skylėmis“

OpenStreetMap žymėtojai dažnai klausia, ką daryti, kai turime parkelį, sudarytą iš miško ir jo viduryje esančios pievos. Kaip juos teisingai pažymėti?

Tokiu atveju OpenStreetMap tikėtina turėsime du kelius: A – išorinis perimetras, B – vidinės pievos perimetras:

Jei išorinį kelią A pažymėsime tiesiog landuse=forest, o vidinį – landuse=meadow, gausime tokius geografinius objektus:

Kaip matome, miškas neturi iškirpimo. Taigi jei skaičiuosime miško plotą – gausime neteisingą rezultatą. Kuriant žemėlapį reikės pievos plotą (apskritimą) paišyti vėliau (aukščiau) už miško plotą (stačiakampį), jei norėsime, kad pieva matytųsi. Kadangi realiame žemėlapyje bus daug panašių objektų, tai vienoje vietoje „iškirpimas“ bus pieva, kitoje – miškas, trečioje vanduo, ketvirtoje ežero sala. Taigi net teoriškai neegzistuos tokia braižymo tvarka, kuri užtikrintų teisingą objektų vaizdavimą. Vienu atveju nesimatys miškai, kitu – pievos, vienu atveju nesimatys ežero salos, kitu atveju – maži ežeriukai miškuose.

Sprendimas yra sukurti multipoligoną (ryšį), kuriame A kelią nurodytume kaip „outer“ kelią, o B – kaip „inner“. Tokiu atveju gautume trečią geografinį objektą:

Gavome objektą su „išpjova“. Būtent toks ir yra miškas. Turint tokį mišką mums ir ploto skaičiavimai gausis teisingi, ir nereikės rūpintis, ką braižyti pirmą – mišką ar pievą – visada gausime teisingą rezultatą, nes figūros viena su kita nepersidengia.

Galutinis objektų sąrašas turėtų būti toks:

  • C – miško multipoligonas (landuse=forest), sudarytas iš A kaip „outer“ ir B kaip „inner“.
  • B – pievos poligonas (landues=meadow) – kelias B
  • A – parko poligonas (leisure=park) – išorinis kelias. Parkas yra viskas: ir miškas, ir pieva. Braižant žemėlapį parkas yra „virš“ visko. T.y. apačioje braižome miško/medžių ir pievos/žolės plotus, o tada virš jų, jei to reikia žemėlapiui, paišome permatomą „parko“ plotą arba tiesiog parko pavadinimą, dengiantį tiek miško, tiek pievos dalis.

Puiku. Bet ne visi žino, kad taip reikia žymėti. Ką daryti? Sukurti ir naudoti Topologijos taisykles, kurios šiuo konkrečiu atveju nurodytų, kad miško ir pievos poligonai negali persidengti.

Kas yra topologijos taisyklės?

Topologijos taisyklės apibrėžia santykį tarp skirtingų objektų geografinėje informacinėje sistemoje. Tarkime viena taisyklė gali nurodyti, kad miško poligonai negali persidengti vienas su kitu. Kita taisyklė gali nurodyti, kad miško poligonas negali persidengti su vandens poligonu. Dar kita taisyklė – kad miesto X adreso taškai turi būti miesto X administracinėse ribose.

Daugiau principinių topologijos taisyklių pavyzdžių galite rasti ESRI Topologijos taisyklių brošiūroje.

Kam reikalingos topologijos taisyklės

Apibrėžus topologijos taisykles ir jų laikantis, geografinė duomenų bazė tampa tvarkingesne. Kuriant ar keičiant duomenis aiškiau, kaip reikia teisingai braižyti. Prisiminus aukščiau aprašytą parko pavyzdį, apibrėžus taisyklę, kad miškas ir pieva negali persidengti, pasidaro aišku, kad neužteks nupaišyti pievą vidury miško, reikia tokį patį plotą „iškirpti“ iš miško.

Laikantis tokių taisyklių palengvinamas ir kartografų darbas. Jei pagal aukščiau apibrėžtą pavyzdį pievos plotas bus iškirptas iš miško, kartografui nereikės rūpintis, ką paišyti pirmiau/žemiau – mišką ar pievą. Nors šiuo konkrečiu atveju atrodytų, kad paišykime mišką žemiau, tada virš jo pievą ir viskas bus gerai, bet kas bus, jei turėsime analogišką situaciją, tik dabar jau turėsime mažą miškiuką didelėje pievoje? Jei nedarysime pievos iškirpimo pagal miško plotą, galutiniame žemėlapyje miškas nesimatys.

Nepamirškime ir plotų skaičiavimo. Tarkime norime paskaičiuoti bendrą miškų plotą. Jei pievos ar kiti miško viduje esantys plotai nebus „iškirpti“ – mes gausime neteisingą suminį plotą (bus įskaičiuotas ir pievų plotas). Susumavę visus Lietuvos miškus, pievas, gyvenamuosius plotus, vandenį ir t.t. ir pan. mes gausime didesnį skaičių nei bendras Lietuvos plotas!

OpenStreetMap

Atvirame žemėlapyje duomenims yra suteikiama labai didelė laisvė. Žymėtojai patys gali susigalvoti norimas žymas, jų reikšmes. Taip pat nėra apibrėžtos (bent jau kol kas) ir topologijos taisyklės. Taigi kas kaip sugalvoja, tas taip ir braižo. Tokia anarchija nors ir padaro braižymą lengvesniu, bet užtat tokių duomenų naudojimas yra sudėtingesnis.

Taigi kol kas yra apibrėžiamos tik regioninės topologijos taisyklės. Pavyzdžiui Lietuvoje yra apibrėžtos kelios topologijos taisyklės. Bendras jų veikimo procesas yra toks:

  1. Topologijos taisyklė yra suformuluojama, pasiūloma ir aptariama.
  2. Topologijos taisyklė patvirtinama, vykdoma taisyklės neatitinkančių objektų paieška, taisomos problemos ir tuo pačiu tikrinama, ar visur taisyklės taikymas yra logiškas. Jei kažkur taikymas nelogiškas – taisyklė arba taisoma, arba jos atsisakoma apskritai.
  3. Jei pavyksta ištaisyti visas topologijos taisyklės klaidas, taisyklė įjungiama į „stebėjimo režimą“. Tai reiškia, kad periodiškai (kasdien) yra patikrinama, ar naujai įvesti ar pakeisti objektai atitinka taisyklės reikalavimus.

Tai tiek bendros informacijos apie topologijos taisykles. Žinokite, kad toks dalykas yra, rašykite į sąrašyną (talk-lt) naujų taisyklių kūrimo ar esamų keitimo pasiūlymus!

Share

Kelių ilgiu susilyginome su komerciniu žemėlapiu

Šiomis dienomis Lietuvos atviras žemėlapis pasiekė svarbią ribą – kelių ilgiu susilyginome su komerciniu Garmin žemėlapiu!

Kasdien atnaujinamo Open street map Garmin žemėlapio svetainėje galite rasti pagrindiniu kiekybinių žemėlapių parametrų palyginimą:

osm_garmin_palyginimas

Kaip matome, atvirame žemėlapyje kelių jau yra truputį daugiau (ir kiekvieną dieną kelių vis daugėja), gyvenviečių skaičius irgi jau lygus (atvirame žemėlapyje suvestos visos Lietuvos gyvenvietės: miestai, miesteliai, kaimai ir viensėdžiai). Vis dar stipriai atsiliekame adresų skaičiumi (taip tikriausiai bus tol, kol Lietuva neįgyvendins ES direktyvų ir neatvers adresų registro) ir lankytinų vietų skaičiumi.

Sekdami ankstesniu įrašu apie komercinio ir atviro žemėlapio kelių ilgio palyginimą, ir šį kartą žvilgterėkime į skirtingų kelių tipų kitimą laike:

kelių_ilgiai_pagal_tipus_2016

(Ši palyginimo diagrama paimta iš Lietuvos OSM statistikos puslapio)

Kaip matome, visi pagrindiniai/didieji keliai jau yra suvesti (tokią išvadą galime daryt iš to, kad jų ilgis jau praktiškai nesikeičia paskutinius metus). Taigi dabar daugėja miško/lauko keliukų, įvairių pėsčiųjų/dviračių takų ir pan.

Miško kelius/takus dažniausiai yra neįmanoma braižyti pagal ortofoto, kad ir kokios geros kokybės ji būtų. Taigi šiais laikais, kai dauguma turime išmaniuosius telefonus su GPSR įranga, norėčiau paprašyti visų galinčių rinkti miško kelių pėdsakus, kelti juos į OpenStreetMap ir tada registruoti pastabą, kad žymėtojai galėtų jūsų įkeltą pėdsaką paversti OSM keliu.

Taigi „į begalybę ir dar toliau!“ 🙂

Share

Klaidos Baltijos jūros regione

Yra eilė priemonių, ieškančių žymėjimo klaidų OpenStreetMap žemėlapyje. Kai kurios klaidos yra kritinės – tarkim transporto vektorių susikirtime nėra taško, dėl ko neveikia arba neteisingai veikia maršrutizavimas. Kitos klaidos ne tokios rimtos – tarkim reikalavimas, kad visi kelių vektoriai turėtų įvestą maksimalų greitį (net jei maksimalus greitis toje atkarpoje „standartinis“).

Gerą taisyklių rinkinį turi rimtesnysis OSM redaktorius JOSM. Klaidų ieško ir tokie projektai kaip Osmosis, Keepright ir eilė kitų. Kai kurių Lietuvai specifinių klaidų mes ieškome patys. Žodžiu klaidų aibių yra daug. Kadangi Keepright yra seniausias iš šiuo metu vis dar aktyvių klaidų aptikimo projektų, tai apsistokime ties juo.

Paimkime Keepright klaidų rinkinį ir pažiūrėkime, kaip jis atrodo vizualiai. Keepright klaidas teikia stačiakampiais gabalais. Imkime tiek gabalų, kad būtų pilnai uždengtas Lietuvos plotas. Išimkime klaidas, kurios nėra kritinės, bet kurių prisiskaičiuoja labai daug – maksimalaus greičio reikalavimą ir reikalavimą, kad kiekvienas „track“ tipo keliukas turėtų dar ir kokybės žymą (tracktype). Taigi imame visas klaidas išskyrus minėtų dviejų tipų. Kiekviena klaida vaizduojama tašku. Ką gauname? Štai ką:

klaidos_aplink_baltija

Iš pradžių galvojau ant šio vaizdelio uždėti ir Lietuvos plotą orientacijai, bet… panašu, kad nelabai reikia…? 😉

P.S. Apatiniame kairiame kampe balta, nes tiesiog nebuvo imtas Keepright stačiakampis su Vakarinės Lenkijos ploto klaidomis.

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