Fitur penskalaan peta WebGL

Kami telah merilis editor gaya . Pelajari lebih lanjut tentang cara menggunakannya, Anda dapat mengkonfigurasi kartu di tugas pelayanan dapat dibaca pada vc.ru . Di Habré, kami ingin berbicara tentang konsep StyleZoom, yang juga kami gunakan di editor gaya.



Di bawah potongan - cerita pendek tentang tingkat zoom: mengapa dalam bentuk standar mereka tidak cocok untuk area yang luas dan bagaimana skala mempengaruhi pemuatan ubin dan tampilan peta.









Tingkat zoom



Untuk menunjukkan skala di peta 2GIS WebGL, seperti di banyak peta lainnya, angka digunakan - tingkat zoom atau hanya zoom. Zoom nol menunjukkan skala peta yang menyesuaikan seluruh dunia menjadi persegi 256 × 256 piksel.





Peta dunia di zoom = 0



Memperbesar satu unit sama dengan meregangkan peta dua kali. Pada zoom pertama, seluruh dunia akan menjadi 256 × 2 = 512 px. Yang keempat, kami mendapatkan ukuran 256 × 2 × 2 × 2 × 2 = 4096 px.



Sistem ini memungkinkan Anda untuk menentukan rentang skala dengan angka yang mudah dipahami. Misalnya, zoom = 11 adalah tentang satu kota besar di layar, zoom = 19 memungkinkan Anda untuk melihat bangunan dan lorong di antara mereka secara detail.



Proyeksi Mercator



Peta 2GIS menggunakan proyeksi kartografi Mercator. Proyeksi peta adalah cara untuk menampilkan permukaan bumi yang bulat pada peta datar.



Karena bidang dan bola bukanlah hal yang sama, setiap proyeksi peta mendistorsi bentuk atau ukuran benda. Dalam proyeksi Mercator, objek di lintang tinggi di peta tampak lebih besar daripada objek di ekuator. Oleh karena itu, pada peta-peta tersebut, Greenland terlihat seukuran Afrika, meski sebenarnya luasnya 14 kali lebih kecil dari luas Afrika. Di sini Anda dapat melihat bagaimana proyeksi mendistorsi ukuran negara.





Jika Rusia dibawa lebih dekat ke khatulistiwa, ukurannya di peta berkurang secara signifikan



Bentangan benda sebanding dengan 1 / cos (lat), di mana lat adalah garis lintang benda. Dari rumus ini dapat disimpulkan bahwa objek pada garis lintang St. Petersburg (lintang = 60 °) pada peta akan direntangkan dua kali. Dan objek di Kutub Utara atau Selatan (lintang = 90 °) akan membentang tanpa batas. Itulah mengapa kutub tidak pernah digambar pada peta dalam proyeksi Mercator - semua yang ada di utara dan selatan pada garis lintang ≈85 ° terpotong.



Anda dapat membaca lebih lanjut tentang proyeksi Mercator dalam materi visual dan menarik ini .



Masalah dengan zoom dan proyeksi Mercator



Masalah utama dengan zoom mengikuti dari properti proyeksi Mercator: tingkat zoom yang sama pada garis lintang yang berbeda sesuai dengan skala peta aktual yang berbeda.



Mari kita bandingkan tangkapan layar peta pada zoom ke-14 di Murmansk (lintang 69 °) dan Tashkent (lintang 41 °).





Zoom ke-15 di Murmansk





zoom ke-15 di Tashkent Anda



dapat melihat seberapa besar perbedaan ukuran rumah. Di Murmansk, mereka besar, di Tashkent, petanya dangkal.



Saat menata peta, kami ingin memberikan tampilan dan nuansa tertentu. Untuk melakukan ini, atur lebar jalan dalam piksel, tergantung pada zoom atau zoom, dari mana kita mulai menampilkan rumah. Gaya yang ditulis untuk satu garis lintang akan terlihat sangat berbeda di garis lintang lainnya. Arti yang melekat di dalamnya akan terdistorsi, karena zoom berarti skala sebenarnya yang berbeda.



Keputusan



Untuk mengatasi masalah ini, kami memperkenalkan konsep styleZoom, yang mungkin berbeda dari zoom biasa.

Zoom normal StyleZoom
Mendefinisikan skala objek Menentukan ubin mana yang akan dimuat
Ditulis di url Menentukan skala untuk menerapkan gaya
Digunakan dalam metode getZoom / setZoom yang sudah dikenal Digunakan dalam metode getStyleZoom / setStyleZoom
Cocok dengan ubin bitmap


styleZoom dihitung dari zoom dan latitude menggunakan rumus berikut: styleZoom = zoom + log2 (1 / (2 * cos (lat)).



Properti styleZoom berikut mengikuti rumus:

  • Pada lintang 60 ° styleZoom = zoom. Karena gaya aslinya ditulis di Novosibirsk dan Moskow, kami memutuskan untuk menggunakan garis lintang ini sebagai basis.
  • Pada lintang <60 ° styleZoom <zoom. Di ekuator, styleZoom = zoom - 1.
  • Pada garis lintang> 60 ° styleZoom> zoom.


Sekarang mari kita lihat bagaimana Tashkent dan Murmansk akan terlihat dengan styleZoom = 15.





Tashkent, styleZoom = 15 (zoom ≈ 15.59)





Murmansk, styleZoom = 15 (zoom ≈ 14.53)



Terlihat jelas bahwa styleZoom sesuai dengan skala sebenarnya dari peta terlepas dari garis lintang: di rumah secara visual tidak berbeda ukurannya, peta terlihat sama di dua kota yang berbeda.



Batasan



Mekanisme koreksi memiliki kekurangan yang muncul dalam dua skenario untuk bekerja dengan peta.



zoom <9

Pada zoom kecil, saat seluruh dunia atau sebagian besar terlihat di layar, menyeret peta ke atas dan ke bawah akan menyebabkan perubahan besar dalam lintang dan, karenanya, styleZoom.



Saat menyeret dan melepaskan, ini dapat menyebabkan memuat ubin baru, beralih gaya, objek muncul atau menghilang, dll. Untuk menghindari efek ini, pada zoom <9 koreksi dinonaktifkan dan styleZoom diatur ke zoom.



lat> 60 °

Pada garis lintang yang sangat tinggi, styleZoom menjadi zoom yang jauh lebih besar. Karena styleZoom bertanggung jawab atas petak mana yang akan dimuat, mungkin ternyata, pada zoom ke-14 kita akan memuat dan menampilkan ubin dari zoom ke-16. Ubin zoom ke-16 berukuran 16 kali lebih kecil daripada ubin zoom ke-14. Dan jika biasanya 30 ubin jatuh di layar, maka dalam hal ini akan ada 480. Dan jumlah ubin sangat mempengaruhi kinerja. Agar tidak memuat kartu video pada garis lintang ini, pada lintang> 60 ° koreksi dinonaktifkan, dan styleZoom juga disamakan dengan zoom.



Bukan keluaran



Hubungkan API peta WebGL kami dan peta  desain untuk tugas layanan Anda, tanpa mengkhawatirkan tampilannya di berbagai kota.



Terima kasih khusus kepada Lesha Fedosov untuk posnya. Lyokha, halo!



All Articles