Yra daug pastatų generalizavimo operacijų, daug operacijų parametrų parinkimo variantų, daug operacijų atlikimo sekų variantų. Kol kas nepastebėjau, kad kas nors būtų radęs vieną teisingą variantą, tinkantį visoms situacijoms: skirtingiems masteliams ir skirtingo tankio ir/ar geometrijos pastatams (pvz. tankiai užstatytiems senamiesčiams, retai užstatytiems sodams ir dar rečiau užstatytoms laukų sodyboms).
Aprašysiu bandymus parinkti tinkamus parametrus generalizuojant pastatus 12 masteliui (kur 1 taško plotis yra ~40m). Tikiuosi, kad radus parametrų reikšmes (o tikriausiai ir patvarkius pačią generalizavimo seką), bus galima atitinkamai išdėlioti generalizaciją ir stambesniems masteliams.
Generalizavimo seka tokia:
- Į spiečius (multigeometrijas) sugrupuojami pastatai, esantys arčiau vienas kito nei N1 metrų (PostGIS funkcija St_ClusterWithin).
- Sugrupuotos geometrijos, kurių plotas didesnis už N2 m2, yra paprastinamos, pašalinant geometrijos elementus (briaunas), kurių dydis mažesnis už N3 metrus.
- Atrenkami pastatai, kurių plotas yra mažesnis už N2 m2. Apdorojami ploto mažėjimo tvarka. Su jais atliekami tokie veiksmai:
- paskaičiuojamas mažiausias apgaubiantis orientuotas stačiakampis (PostGIS funkcija St_OrientedEnvelope)
- jei gautas apgaubiantis stačiakampis yra mažesnis už N2 m2, tai jis padidinamas (nekeičiant orientacijos, į visas puses) iki N2 m2
- jei taip gautas stačiakampis su buferiu N4 nesikerta nei su vienu didesniu už jį pastatu – tokia geometrija ir naudojama. Jei kertasi – pastatas išimamas.
Retesnių pastatų vietoje rezultatas toks:
Šiame piešinyje:
- geltonas pastatas – kurio plotas yra didesnis už N2 m2, jo geometrija supaprastinta (PostGIS metodu, kuris geometriją paprastina agresyviau nei ArcGIS’as).
- žali pastatai – už N2m2 mažesni pastatai, kurių plotas buvo padidintas iki minimalaus – N2m2. Žalio ploto viduje matomas pradinis pastato ar pastatų dydis.
- raudoni pastatai – išmesti iš mastelio rinkinio pastatai, nes padidinti iki minimalaus dydžio jie kirtosi su kitais pastatais.
Žemėlapyje vaizdas toks:
Konkrečiai šiam bandymui buvo naudotos tokios parametrų reikšmės:
- N1 (grupavimo atstumas) – 10m
- N2 (minimalus plotas) – 2000m2
- N3 (pastatų geometrijos minimalus detalės dydis) – 40m
- N4 (minimalus plotas) – 2000m2 (šiame bandyme sutampa su N2, bet tai nėra privaloma)
Gauname gerokai supaprastintas pastatų geometrijas (kas svarbu vektorinėse kaladėlėse, smulkiuose masteliuose). Pastatų sankaupos vizualiai apvalytos, mažiau makalynės.
Bet yra ir neišspręstų problemų:
- Tipifikuojant pastatus jie nėra orientuojami pagal artimiausią/gretimą kelią.
- Nesprendžiama problema, kad padidintas pastatas nesikirstų su kitais (ne pastatų) objektais – keliais, vandeniu, mišku ir pan.
Stambesnių pastatų zonoje galima pastebėti nelabai teisingų rezultatų:
Čia apibrėžta pastatų juosta, kuri taip generalizuojant buvo padalinta į mažesnius gabalus. Juosta būtų išlikusi, jei būtų naudota didesnė N1 reikšmė – tada visi juostos pastatai būtų patekę į vieną geometriją. Deja, didinant N1, mažų bet tankiai pristatytų pastatų zonoje susigrupuoja maži pastatai ir rezultate sudaro visokias neaiškias konstrukcijas (rezultatas N1 padidinus iki 20m):
Galbūt, tokį per didelį sugrupavimą galima spręsti apribojant, kiek pastatų galima sudėti į vieną spiečių…
Tokie pradiniai rezultatai. Parametrų reikšmės buvo parinktos empiriškai, norėtųsi labiau matematinio paskaičiavimo. Pradinė mintis, kad turint rezoliuciją 40 metrų taškui N1 ir N3 turėtų būti 40, o N2 ir N4 – 402 -> 1600, nepasiteisino. Kažką praleidau 🙂
Pabaigai šiek techninių skaičių (bandymai daryti su OpenStreetMap duomenimis):
- Pastatų (geometrijų) skaičius sumažintas nuo 65898 iki 15941, 76% sumažėjimas.
- Viršūnių skaičius sumažintas nuo 442295 iki 84536, 81% sumažėjimas.
Šitie parametrai svarbūs, nes tarkim GRPK duomenų Vilniaus kaladėlės 12 mastelyje siekia beveik 1Mb (supakuotos!). Taipogi visas šias geometrijas klientas turi apdoroti tiek pradinio paišymo, tiek ir pasukimo, pavertimo metu.