Tukarkan Lintang dan Bujur ke Titik 2D di Jawa

1. Gambaran keseluruhan

Semasa melaksanakan aplikasi yang menggunakan peta, kita biasanya akan menghadapi masalah penukaran koordinat. Sebilangan besar masa, kita perlu menukar garis lintang dan garis bujur ke titik 2D untuk dipaparkan . Nasib baik, untuk menyelesaikan masalah ini, kita dapat menggunakan formula unjuran Mercator.

Dalam tutorial ini, kita akan membahas Mercator Projection dan akan belajar bagaimana melaksanakan dua variannya.

2. Unjuran Mercator

Unjuran Mercator adalah unjuran peta yang diperkenalkan oleh kartografer Flemish Gerardus Mercator pada tahun 1569. Unjuran peta menukar koordinat garis lintang dan garis bujur di Bumi menjadi titik di permukaan rata. Dengan kata lain, ia menerjemahkan titik di permukaan bumi ke titik pada peta rata .

Terdapat dua cara untuk melaksanakan unjuran Mercator. Unjuran Mercator semu memperlakukan Bumi sebagai sfera. Unjuran Mercator yang sebenarnya memodelkan Bumi sebagai elipsoid . Kami akan melaksanakan kedua-dua versi.

Mari kita mulakan dengan kelas asas untuk kedua-dua pelaksanaan unjuran Mercator:

abstract class Mercator { final static double RADIUS_MAJOR = 6378137.0; final static double RADIUS_MINOR = 6356752.3142; abstract double yAxisProjection(double input); abstract double xAxisProjection(double input); }

Kelas ini juga memberikan radius utama dan kecil Bumi yang diukur dalam meter. Telah diketahui bahawa Bumi sebenarnya bukan sfera. Untuk itu, kita memerlukan dua jejari. Pertama, jejari utama adalah jarak dari pusat bumi ke khatulistiwa . Kedua, jejari kecil adalah jarak dari pusat bumi ke kutub utara dan selatan .

2.1. Unjuran Mercator Sfera

Model unjuran pseudo memperlakukan bumi sebagai sfera. Berbeza dengan unjuran elips di mana Bumi akan diproyeksikan pada bentuk yang lebih tepat. Pendekatan ini membolehkan kita membuat anggaran cepat untuk unjuran elips yang lebih tepat tetapi komputasional. Hasilnya, pengukuran jarak langsung dalam unjuran ini akan menjadi hampir.

Selanjutnya, bahagian bentuk pada peta akan sedikit berubah. Akibat lintang dan nisbah bentuk objek di peta seperti negara, tasik, sungai, dan lain-lain tidak dipelihara dengan tepat .

Ini juga disebut unjuran Web Mercator - biasanya digunakan dalam aplikasi web termasuk Peta Google.

Mari kita laksanakan pendekatan ini:

public class SphericalMercator extends Mercator { @Override double xAxisProjection(double input) { return Math.toRadians(input) * RADIUS_MAJOR; } @Override double yAxisProjection(double input) { return Math.log(Math.tan(Math.PI / 4 + Math.toRadians(input) / 2)) * RADIUS_MAJOR; } }

Perkara pertama yang perlu diperhatikan dalam pendekatan ini adalah hakikat bahawa pendekatan ini mewakili jejari bumi oleh satu pemalar dan bukan dua yang sebenarnya. Kedua, kita dapat melihat bahawa kita telah melaksanakan dua fungsi untuk digunakan untuk menukar unjuran paksi-x dan unjuran paksi - y . Di kelas di atas, kami telah menggunakan perpustakaan Matematik yang disediakan oleh java untuk membantu kami membuat kod kami lebih mudah.

Mari kita uji penukaran sederhana:

Assert.assertEquals(2449028.7974520186, sphericalMercator.xAxisProjection(22)); Assert.assertEquals(5465442.183322753, sphericalMercator.yAxisProjection(44));

Perlu diingat bahawa unjuran ini akan memetakan titik ke dalam kotak pengikat (kiri, bawah, kanan, atas) (-20037508.34, -23810769.32, 20037508.34, 23810769.32).

2 .2. Unjuran Mercator Elips

Unjuran sebenar memodelkan bumi sebagai elipsoid. Unjuran ini memberikan nisbah tepat untuk objek di mana sahaja di Bumi . Sudah tentu, ia menghormati objek di peta tetapi tidak 100% tepat . Walau bagaimanapun, pendekatan ini bukanlah kaedah yang paling sering digunakan kerana kompleks secara komputasi.

Mari kita laksanakan pendekatan ini:

class EllipticalMercator extends Mercator { @Override double yAxisProjection(double input) { input = Math.min(Math.max(input, -89.5), 89.5); double earthDimensionalRateNormalized = 1.0 - Math.pow(RADIUS_MINOR / RADIUS_MAJOR, 2); double inputOnEarthProj = Math.sqrt(earthDimensionalRateNormalized) * Math.sin( Math.toRadians(input)); inputOnEarthProj = Math.pow(((1.0 - inputOnEarthProj) / (1.0+inputOnEarthProj)), 0.5 * Math.sqrt(earthDimensionalRateNormalized)); double inputOnEarthProjNormalized = Math.tan(0.5 * ((Math.PI * 0.5) - Math.toRadians(input))) / inputOnEarthProj; return (-1) * RADIUS_MAJOR * Math.log(inputOnEarthProjNormalized); } @Override double xAxisProjection(double input) { return RADIUS_MAJOR * Math.toRadians(input); } }

Di atas kita dapat melihat betapa kompleksnya pendekatan ini mengenai unjuran pada paksi-y. Ini kerana harus mengambil kira bentuk bumi yang tidak bulat. Walaupun pendekatan Mercator yang sebenarnya kelihatan rumit, lebih tepat daripada pendekatan sfera kerana ia digunakan untuk radius untuk mewakili bumi satu minor dan satu utama.

Mari kita uji penukaran sederhana:

Assert.assertEquals(2449028.7974520186, ellipticalMercator.xAxisProjection(22)); Assert.assertEquals(5435749.887511954, ellipticalMercator.yAxisProjection(44));

Unjuran ini akan memetakan titik ke dalam kotak pembatas (-20037508.34, -34619289.37, 20037508.34, 34619289.37).

3 . Kesimpulannya

Sekiranya kita perlu menukar koordinat garis lintang dan garis bujur ke permukaan 2D, kita boleh menggunakan unjuran Mercator. Bergantung pada ketepatan yang kita perlukan untuk pelaksanaan kita, kita dapat menggunakan pendekatan sfera atau elips.

Seperti biasa, kita dapat menemui kod artikel ini di GitHub.