Vandens telkinių etiketės

Prieš daugiau nei pusmetį buvo rašyta apie vieną iš variantų, kaip skaičiuoti vandens telkinių etikečių pozicijas. Tąkart aprašytas metodas gan paprastas, bet yra dvi problemos, kurių centro linijos sprendimas nesprendžia: etikečių šrifto dydis ir tarpai tarp raidžių. Centro linija gali puikiai praeiti pro siauriausią ežero vietą ir parinkti ją etiketei, kai kur nors toliau nuo centro yra platesnė ežero dalis, tinkama etiketei su didesniu šriftu.

Gerą mintį davė pagal OpenStreetMap duomenis kuriamo OpenTopoMap kūrėjai. Jie ežerų etiketėms sugalvojo naudoti „stačiakampių metodą“. Jie irgi pradėjo nuo centro linijų skaičiavimų, bet visgi pasirinko kvadratų metodą. Tai puikus variantas ir, nors OpenTopoMap jį panaudojo tik etiketės pozicijos paieškai, jį galima pritaikyti ir šrifto dydžio bei tarpo tarp raidžių nustatymui.

Pradinį principą naudojame tokį patį, kaip ir OpenTopoMap – ant vandens telkinio sudėliojame vienodo dydžio kvadratų matricą ir tada pašaliname tuos kvadratus, kurie nėra pilnai vandens telkinyje (šiek tiek pažaidę su buferiais, galime valdyti, kokio dydžio salos ir iškyšuliai daro/nedaro įtakos etiketei, taip pat kiek etiketė gali išsikišti už vandens telkinio ribų):

Kvadratai vandens telkinyje

Iš pradžių randame vidurinį kvadratą, tada randame toliausiai nuo jo esantį kvadratą K1, o tada toliausiai nuo K1 esantį kvadratą K2. Kelias per kvadratus, einantis nuo K1 iki K2 ir bus linija etiketei. Pastebėtina, kad tinkamiausias bus kelias nuo K1 iki K2, „einantis“ per labiausiai nuo kranto nutolusius kvadratus (pavaizduotus tamsesniu fonu). Panaudoję modifikuotą bangos principą paskaičiuojame tokį kelią.

Tai būtų daugmaž tai, ką padarė OpenTopoMap. Bet mes norime daugiau. Galime daryti prielaidą, kad kvadrato dydis kažkiek koreliuoja su raidžių dydžiu. Sakykime, kad jei norime nupaišyti 10 raidžių ilgio ežero pavadinimą, mums reikia, kad kelią nuo K1 iki K2 sudarytų bent 10 kvadratų. Taigi pradedame skaičiavimu su gan dideliu kvadratų dydžiu, jei kelias per trumpas (arba kvadratai netelpa į ežerą) – mažiname kvadratus ir kartojame skaičiavimą. Anksčiau ar vėliau rasime didžiausią kvadrato dydį, kai kelias jau yra pakankamo ilgio. Tada priklausomai nuo kvadrato dydžio galėsime paskaičiuoti, kokį šrifto dydį galima naudoti žemėlapyje. Jei kvadratų gavosi daugiau, nei reikia – galima bus ir tarpus tarp raidžių padidinti.

Gausime žemėlapį, kur etikečių šriftų dydžiai bus parinkti pagal realią vandens telkinio geometriją (žemiau pateikta bandymų nuotrauka, kur skaičiuotos tik dviejų ežerų etiketės):

Skirtingi etikečių dydžiai

Matome, kad Luodžio ežero etiketė yra mažesnė, nei Dysnų ežero, o Dysnų ežeras dar ir turi didesnius tarpus tarp raidžių (po etikete matosi pilka paskaičiuota etiketės pozicijos linija).

Toks yra esminis principas. Žinoma, galutiniam sprendimui reikia dar daug paprastų dalykų padaryti: paskaičiuoti, kuriuose masteliuose tokios etiketės apskritai gali atsirasti, kaip šrifto dydis keičiasi keičiantis masteliui, kvadratus tiesiogiai tapatinti su etiketės ilgiu irgi nėra teisinga, nes tarkim „M“ raidė gerokai platesnė už „i“. Bet tai jau techninės detalės, neįtakojančios bendro principo.

Ir visa tai padaroma atviromis priemonėmis (PostgreSQL+PostGIS), taigi puikiai tinka tokiems taikymams kaip OpenStreetMap, kur žemėlapis turi „pats“ (be žmogaus įsikišimo) gan dažnai persiskaičiuoti ir persibraižyti.

2 atsakymai į “Vandens telkinių etiketės”

    1. Gal ne žingsnis po žingsnio, bet visas kodas bus sudėtas į openmap.lt githubą, kai bus baigti visi vandens etikečių darbai. Dar trūksta etikečių dėliojimo stambiuose masteliuose (kur vienas vandens telkinys gauna daug etikečių).

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *