Atribusi peta ganda di MapLibre: duplikat saya, bukan pemasok
Atribusi peta muncul dua kali di pojok. Yang satu duplikat buatan sendiri; TileJSON pemasok sudah lama mengirim atribusi bawaan.
Ringkasan
Atribusi dobel di pojok peta ternyata gara-gara customAttribution yang diketik manual, padahal MapLibre udah otomatis ambil dari TileJSON. Solusinya hapus string itu, ganti compact: false biar atribusi selalu kebaca tanpa perlu diklik. Ingat, atribusi itu kewajiban lisensi ODbL, bukan hiasan UI, jadi jangan sampai hilang.
Pas pertama buka halaman lokasi kantor setelah deploy, saya langsung curiga ada yang nggak beres. Di pojok kanan bawah peta yang ukurannya mungil itu, ada dua baris teks numpuk. Tulisan © OpenMapTiles © OpenStreetMap contributors muncul dua kali di tempat yang sama. Kelihatannya amatir banget untuk halaman depan perusahaan.
Tebakan pertama saya: string atribusi itu harus diketik manual ke komponen, jadi yang satu baris pasti duplikat buatan saya sendiri dari waktu pertama bikin komponen. Hapus aja, pikir saya waktu itu. Aman, tinggal ilangin satu baris.
Ternyata pemasok tile yang mengirim atribusinya
Tebakan itu meleset. MapLibre mengumpulkan atribusi otomatis langsung dari TileJSON milik sumber tile. Jadi teks OpenFreeMap © OpenMapTiles Data from OpenStreetMap itu udah dibawa oleh metadata planet OpenFreeMap sejak awal [6]. Saya nggak pernah perlu mengetiknya, dan pemasoknya juga udah bilang begini: pakai MapLibre, atribusi ditambahkan otomatis, nggak ada yang perlu dilakukan [5].
Ini masuk akal begitu dipikir lagi: kepatuhan lisensi hidup di lapisan data, bukan di lapisan UI. Kontrol di layar cuma merender apa yang dideklarasikan data. Dan kewajibannya nyata. Lisensi ODbL mewajibkan kredit dan pemberitahuan lisensi begitu data OSM dipakai secara publik [1]. Kalau atribusi hilang dari peta, yang langsung rugi bukan vendor, tapi komunitas pemeta yang datanya kita pakai gratis.
customAttribution itu tambahan, bukan pengganti
Salahnya ada di file office-map.tsx. Kode lamanya begini:
new maplibregl.AttributionControl({
compact: true,
customAttribution: "© OpenMapTiles © OpenStreetMap contributors"
})
Dua kesalahan sekaligus di lima baris itu. Yang pertama soal customAttribution: dokumentasi MapLibre menyebut opsi ini tampil selain atribusi lain yang sudah ada [3]. Sifatnya aditif. Baris manual itu bukan menimpa teks bawaan, tapi numpuk di atasnya. Kredit ganda buat OpenMapTiles juga nggak perlu: TileJSON udah mengakunya, dan kalau nanti string resminya berubah, versi ketikan tangan saya jadi peninggalan yang melenceng tanpa sadar.
Kesalahan kedua: compact: true. Mode ini melipat atribusi jadi ikon kecil yang harus diklik dulu. Secara default kontrol ini terbuka apa pun lebar petanya [4], dan atribusi dari semua sumber digabung jadi satu baris mungil. Perancangnya jelas sudah kepikiran kasus ini lebih dulu dari saya.
compact: false dan aturan mainnya
Kode barunya jadi pendek:
new maplibregl.AttributionControl({
compact: false
})
compact: false memaksa atribusi selalu terbuka. Dokumentasinya sendiri bilang mode compact dipakai cuma kalau atribusi benar-benar nggak muat di peta [3]. Peta kantor ini cukup lebar, teksnya muat. Paksa compact berarti pengguna harus klik ekstra cuma buat baca hak cipta data. Ikon kecil itu juga gampang sekali diabaikan: nggak ada kata "lisensi" atau "hak cipta" yang muncul, cuma simbol yang maknanya nggak semua orang tahu.
Aturan mainnya dari pemberi lisensi juga jelas. Peta interaktif boleh menaruh kredit di pojok, dan kalau mau dilipat, pengguna tetap harus bisa menemukan info lisensinya, misalnya lewat tombol info di pojok peta [2]. Default responsif MapLibre pun cuma melipat sementara saat peta digeser di layar sempit [3], bukan menghapusnya.
Pola ini berlaku bukan cuma buat OpenFreeMap. Provider tile vektor pada umumnya menaruh atribusi di TileJSON mereka, dan justru di situlah tempatnya: string lisensi dikelola pihak yang paham isi datanya, bukan diketik ulang di tiap komponen. Kalau kamu self-host tile, isi properti attribution di TileJSON kamu dengan benar, dan semua klien MapLibre otomatis ikut patuh. Dengan begitu aturan mainnya konsisten buat web, aplikasi mobile, sampai QGIS, tanpa satu pun string lisensi diketik di kode aplikasi.
Pendapat saya di sini keras: atribusi itu kewajiban lisensi, bukan hiasan UI. Kalau pojok peta terasa penuh, yang dibuang adalah duplikat dari kode kita sendiri, bukan notice sah dari pemasok data. Setelah perubahan ini pojok peta jadi bersih, satu baris, dan satu kebiasaan buruk ikut hilang: mengetik string lisensi dengan tangan.
Sources: [1] https://www.openstreetmap.org/copyright [2] https://osmfoundation.org/wiki/Licence/Attribution_Guidelines [3] https://maplibre.org/maplibre-gl-js/docs/API/type-aliases/AttributionControlOptions [4] https://maplibre.org/maplibre-gl-js/docs/API/classes/AttributionControl [5] https://openfreemap.org [6] https://tiles.openfreemap.org/planet