Generalizacija

Kartais gali pasirodyti, kad visos žemėlapių įdomybės yra tik stambiausiame mastelyje, kad smulkesniuose tiesiog rodome mažiau duomenų. Bet ne viskas taip paprasta. Štai kaip atrodo geležinkeliai 11 mastelyje:

Geležinkelio artefaktai 11z

Plika akimi matosi, kad geležinkelis nubraižytas su problemomis. Padidinkime šį piešinį:

Gelžkelio artefaktų 11z fragmentas

Kai kuriose vietose matome netvarkingus geležinkelio „punktyrus“ (apibrėžta raudonai). Kitose vietose matome, kad buvo bandyta braižyti visas esamas geležinkelio linijas, o tokiame mastelyje jos netelpa, todėl gavosi makalynė (apibrėžta mėlynai).

Abi šios problemos atsiranda dėl to, kad kuo smulkesnis mastelis, tuo labiau objektų mastelis neatitinka žemėlapio mastelio: jei mastelis yra 1:50000, tai 3 metrų pločio geležinkelio linija žemėlapyje turėtų būti 0,06mm pločio! Geležinkelį tenka braižyti žymiai platesniu, kad jis apskritai matytųsi žemėlapyje. Realiame gyvenime šalia esančias geležinkelio linijas tenka braižyti vieną ant kitos. Todėl ir gauname košę-makalošę.

Tai taipogi reiškia, kad vektorinėse kaladėlėse yra daugiau informacijos, nei jos realiai reikia: dėl to ilgiau užtrunka kaladėlių kūrimas, daugiau kilobaitų reikia persiųsti internetu ir naršyklės daugiau laiko užtrunka braižydamos informaciją žemėlapyje.

Generalizacija

Tokios problemos sprendžiamos naudojant kartografinę generalizaciją. Generalizacija – tai procesas, kurio metu geoobjektai pašalinami, paryškinami, pastumiami ar pan. tam, kad smulkesnio mastelio žemėlapyje vis tiek būtų įmanoma perduoti norimą informaciją ir žemėlapis neatrodytų kaip košė. Generalizacija daryta nuo senų laikų, bet formaliai ją aprašinėti pradėta XIXa. Šiuo metu, kai išplito GIS naudojimas, automatinė generalizacija yra viena iš įdomiausių sričių, nes reikia matematiškai, algoritmais apibrėžti tai, ką dalis kartografų laiko ne mokslu, o menu. Kas norite daugiau informacijos apie generalizaciją, galite jos rasti internete, kad ir šitoje kiek senstelėjusioje, bet vis dar tinkančioje GITTA medžiagoje.

Sprendimas

Tokios kelių koncentracijos generalizavimo sprendimas yra vienas iš paprastesnių:

Geležinkelio generalizacija

  1. Pradiniai duomenys – geležinkelių keliai (imame tik pagrindinius bėgius, išmetame šalutinius, atsišakojimus ir pan.) – mėlyni vektoriai.
  2. Aplink visus geležinkelius paišome buferį (tarkim 40 metrų) ir visų geležinkelių buferius sujungiame į vieną diiiiiidelį poligoną – žalias poligonas.
  3. Tada randame tokio gauto žalio poligono apytiksles vidurio linijas – juodi vektoriai (piešinyje jie šiek tiek kampuoti, nes matomi duomenys dar ir papildomai supaprastinti tiek, kiek užtenka smulkesniame mastelyje).

Visa ši operacija su visais Lietuvos geležinkeliais neužtrunka nei minutės.

Rezultatas toks:

Generalizuotas geležinkleis

Kiti elementai

Tokios pačios problemos yra su automobilių keliais (tarkime A1, A2 ir kai kurių kitų kelių atkarpos yra dvigubos). Taip pat generalizuoti reikėtų ir plotus. Tikriausiai sudėtingiausias darbas – generalizuoti namus (pradžioje supaprastinti jų geometriją, tada juos praretinti ar sujungti, galiausiai apjungti į didesnius pastatų plotus). Tokiems dalykams vien standartinių PostGIS funkcijų jau neužteks. Bet čia jau užsiėmimas ateičiai.

Share

2 thoughts on “Generalizacija

  1. Puikus postas. Išties automatinė generalizacija – labai aktuali tema ir labai daug ką čia dar galima nuveikti. Iš mažutės patirties šuo klausimu, sudėtingas reikalas – pilnai automatinė generalizacija iš kažkokio vieno konkretaus stambaus mastelio į kažkokį konkretų smulkesnį mastelį. Jei galima kažkiek pridėt ranką o automatizavimą labiau palikt perskaičiuoti geometriją, tada trupučiuką lengviau turėtų būt.
    Su geležinkeliais gera idėja su plotais (jei ne paslaptis – kokiu principu centrin linija apskaičiuota?), paprasta ir efektyvi. Kaip tose vietose, kur stambiame mastelyje daug kelių? Dideliuose kelių plotuose gal galima bandyt kaip nors atskirt tuos kelynų kraštus ir ten kur plotis didelis sugeneruot ne tik centrinę liniją, bet ir palei ploto pakraščius einančių kelių linijas, na, arba dar visaip prigalvot galima 😀
    Su keliais taip, problema apjungt dvigubus, dar nėra paprasta eliminuot mandras sankryžas ir visokius žiedus, nuvažiavimus nuo viadukų ir pan., kurie neišsireiškia mastelyje. ArcGIS’e tam net atskiras Geoprocessing toolsas yra (aišku ne tobulas). Viena didesnių problemų su keliais – išretinimas. Taip, jei stambiausiame mastelyje būtų tvarkingai surašyta atributika su išsamia hierarchija, tai nebūtų ir uždavinio, bet jei retinti reikia remiantis skurdžia atributika, tada yr kas veikt.

  2. Geležinkeliams (ir keliams) centrinė linija paskaičiuota naudojant PostGIS’o funkciją St_ApproximateMedialAxis. Generalizuojant visus Lietuvos geležinkelius yra pakankamai skaičiavimo, net supaprastinus po buferizacijos gautą poligoną. Suvalgo apie 2Gb atminties. Alternatyva – dalinti geležinkelių tinklą į gabalus (tose vietose, kur geležinkelis viengubas), tada užtenka mažiau atminties.
    Tarkim keliai imami atskirai pagal kelio numerį (A1, A2), tai mažesni plotai gaunasi – nereikia daug atminties.
    Ten kur daug lygiagrečių kelių – tiesiog gaunasi „storas“ plotas, tai reikia žaisti (didinti) poligono paprastinimą, nes priešingu atveju nuo pagrindinės linijos susigeneruoja į šonus (stačiu kampu) trumpi „ašies“ gabaliukai. Bet čia padeda ir tai, kad turime OSM, kur geležinkelio linijos gali būti klasifikuojamos, taigi dideliuose geležinkelių spiečiuose galima pažymėti nepagrindines linijas papildoma žyma ir tada jų tiesiog neimti generalizuojant.
    Su keliais vėlgi padeda OSM savybė – visokioms ten dobilo detalėms dėti *_link žymas. Tada užtenka tiesiog jas ignoruoti generalizuojant – labai daug vargo dingsta.
    Su kelių išretinimu kol kas dirbama tik klasifikacijos taisymo keliu (ankstesni tinklaraščio įrašai). Bet anksčiau ar vėliau reikės ir išretinti. Praktiškai nebandžiau, bet tikiuosi, kad užteks standartinių GRASS įrankių: https://grasswiki.osgeo.org/wiki/V.generalize_tutorial

Leave a Reply

Your email address will not be published. Required fields are marked *