Atau bagaimana cara menyesuaikan ubin peta Yandex dengan proyeksi OpenStreetMaps?
Entri
Setiap kali Anda membuka semacam peta online, Anda tidak mengunduhnya secara keseluruhan. Untuk mempercepat pemuatan peta, peta dibagi menjadi beberapa bagian kecil (ubin) sehingga hanya area yang diinginkan yang dapat diunduh. Masalahnya adalah Anda bisa memotong kotak ini dengan beberapa cara.

Sebagian besar kartu online “berpikir” bahwa Bumi berbentuk bola. Diantaranya, misalnya, Google maps dan OpenStreetMaps. Beberapa, lebih teliti, memperhitungkan fakta bahwa planet ini bukan bola yang tepat: setidaknya, itu diratakan di kutub. Proyeksi ellipsoid seperti itu digunakan, misalnya, dalam peta Yandex.

Akibatnya, sel dengan jumlah yang sama dalam proyeksi yang berbeda akan menunjukkan tempat yang sama sekali berbeda. Misalnya, di sini adalah ubin dengan angka 10427 pada sumbu X, 5119 pada sumbu Y. Skala level 14. Di sebelah kiri - OSM, di Yandex kanan. Alih-alih sebuah kota - semacam hutan.

Meskipun sebagian besar mesin peta dapat secara otomatis menyesuaikan petak dengan proyeksi yang diinginkan, terkadang Anda mungkin perlu melakukan ini secara manual. Tapi bagaimana caranya? Cara termudah adalah dengan hanya menggeser ubin dengan jumlah piksel tertentu. Hasilnya, kita akan melihat area yang diinginkan di peta. Tentu saja, jika Anda melihat lebih dekat, Anda dapat melihat beberapa distorsi. Tapi saya pikir, semua sama, bahwa tugas sehari-hari dengan akurasi yang sama akan lebih dari cukup. Jadi sudah waktunya untuk menyelesaikan dengan pendahuluan dan mulai membuat konverter.

Metodologi
Agar berfungsi, kita membutuhkan formula konversi. Sejauh yang saya mengerti, itu ditarik langsung dari kode halaman Peta Yandex, pada masa itu, ketika masih sangat mungkin untuk melakukan ini. Saya tidak akan menemukan tautan ke sumber sekarang, tetapi rumus
ini telah dipublikasikan di hub. Saya praktis tidak menyentuhnya: Saya hanya menulis ulang di Swift dan memberikan variabel satu huruf yang tidak bisa dimengerti lebih banyak nama "berbicara". Setidaknya mereka yang mampu mengidentifikasi. (Terima kasih kepada Erelen untuk bantuan)
Nah, tugasnya adalah sebagai berikut. Kita perlu melakukan konverter yang mengambil nomor petak dalam proyeksi standar sebagai input, dan nomor petak dalam proyeksi ellipsoid dan jumlah piksel yang harus digeser ke output.
Jadi Misalnya, ambil
ubin dengan nomor X 10427, Y 5119, Z 14.
Kami akan bertindak dalam dua langkah. Pertama, Anda perlu menemukan koordinat (lintang dan bujur) dari ubin ini. Misalnya, koordinat sudut kiri atasnya.
func tileNumberToCoordinates(tileX: Int, tileY: Int, mapZoom: Int) -> (lat_deg: Double, lon_deg: Double) { let n : Double = pow(2.0, Double(mapZoom)) let lon = (Double(tileX) / n) * 360.0 - 180.0 let lat = atan( sinh (.pi - (Double(tileY) / n) * 2 * Double.pi)) * (180.0 / .pi) return (lat, lon) }
Kami mendapatkan output (55.7889 49.1088). Sekarang kami mengganti nilai yang diperoleh dalam rumus kami. Level zoom masih sama: 14.
func getWGS84Position(latitude: Double, longitude: Double, zoom: Int) -> (x:Int, y:Int, offsetX:Int, offsetY:Int) {
Kami mendapatkan (10427, 5133, 0, 117). Ini berarti bahwa kita memerlukan
ubin Yandex dengan angka X 10427, Y 5133, Z 14. Dan jika Anda menggesernya dengan 0 piksel ke kiri dan 117 piksel ke atas, maka itu akan mengambil tempat yang tepat.

Dan apa yang harus dilakukan?
Jika Anda menulis navigator dan memiliki kesempatan untuk memengaruhi tampilan peta, maka semuanya relatif sederhana. Hitung offset untuk setiap ubin di layar. Dan pindahkan elemen dengan peta dengan jumlah piksel ini dengan cara apa pun yang nyaman.
Tetapi jika Anda tidak memiliki akses ke kode, Anda harus memasukkan tautan perantara antara server peta dan navigator. Sebagai contoh, saya membuat server sederhana untuk ini. Dibutuhkan input dari jumlah ubin yang diinginkan, menghitung jumlah ubin dalam proyeksi ellipsoid. Itu juga mengunduh tiga ubin tetangga. Rekatkan keempat ubin ini menjadi satu ubin besar, lalu gunting bagian yang diinginkan darinya dan kembalikan ke navigator pengguna.

Hasil dan Asli:

Tentu saja, semua operasi ini memerlukan biaya waktu tambahan. Dengan menggunakan tautan ini Anda dapat mengevaluasi kecepatan server “photoshop” kartu secara real time:
https://anygis.ru/api/v1/Yandex_map/{xasket/{y}/{z}https://anygis.ru/api/v1/Yandex_sat_clean/{xasket/{y}/{z}Saya harap informasi yang disajikan di sini bermanfaat bagi seseorang. Semoga berhasil dengan eksperimen Anda.