Ubah Garis Lintang dan Bujur menjadi Titik 2D di Jawa

1. Ikhtisar

Saat mengimplementasikan aplikasi yang menggunakan peta, kami biasanya akan mengalami masalah konversi koordinat. Seringkali, kita perlu mengubah garis lintang dan garis bujur menjadi titik 2D untuk ditampilkan . Untungnya, untuk mengatasi masalah ini, kita dapat memanfaatkan rumus proyeksi Mercator.

Dalam tutorial ini, kita akan membahas Proyeksi Mercator dan akan belajar bagaimana mengimplementasikan dua variannya.

2. Proyeksi Mercator

Proyeksi Mercator adalah proyeksi peta yang diperkenalkan oleh kartografer Flemish Gerardus Mercator pada tahun 1569. Proyeksi peta mengubah koordinat lintang dan bujur di bumi menjadi titik pada permukaan datar. Dengan kata lain, ini menerjemahkan suatu titik di permukaan bumi menjadi titik di peta datar .

Ada dua cara untuk mengimplementasikan proyeksi Mercator. Proyeksi Mercator semu memperlakukan Bumi sebagai bola. Proyeksi Mercator yang sebenarnya memodelkan Bumi sebagai elipsoid . Kami akan menerapkan kedua versi.

Mari kita mulai dengan kelas dasar untuk kedua implementasi proyeksi 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 mayor dan minor Bumi yang diukur dalam meter. Diketahui dengan baik bahwa Bumi sebenarnya tidak bulat. Oleh karena itu, kami membutuhkan dua jari-jari. Pertama, jari-jari utama adalah jarak dari pusat bumi ke ekuator . Kedua, jari-jari minor adalah jarak dari pusat bumi ke kutub utara dan kutub selatan .

2.1. Proyeksi Spherical Mercator

Model proyeksi semu memperlakukan bumi sebagai bola. Berbeda dengan proyeksi elips dimana bumi akan diproyeksikan pada bentuk yang lebih akurat. Pendekatan ini memungkinkan kita melakukan estimasi cepat ke proyeksi elips yang lebih tepat, tetapi komputasi lebih berat. Akibatnya, pengukuran jarak langsung dalam proyeksi ini akan menjadi perkiraan.

Selanjutnya, proporsi bentuk pada peta akan sedikit berubah. Akibatnya garis lintang dan rasio bentuk objek di peta seperti negara, danau, sungai, dll. Tidak dipertahankan dengan tepat .

Ini juga disebut proyeksi Web Mercator - biasanya digunakan dalam aplikasi web termasuk Google Maps.

Mari terapkan 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; } }

Hal pertama yang perlu diperhatikan dalam pendekatan ini adalah kenyataan bahwa pendekatan ini mewakili jari - jari bumi sebesar satu konstanta dan bukan dua sebagaimana adanya. Kedua, kita dapat melihat bahwa kita telah mengimplementasikan dua fungsi yang digunakan untuk mengubah proyeksi sumbu x dan proyeksi sumbu y . Di kelas di atas kami telah menggunakan pustaka Matematika yang disediakan oleh java untuk membantu kami membuat kode kami lebih sederhana.

Mari kita uji konversi sederhana:

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

Perlu dicatat bahwa proyeksi ini akan memetakan titik-titik ke dalam kotak pembatas (kiri, bawah, kanan, atas) dari (-20037508.34, -23810769.32, 20037508.34, 23810769.32).

2 .2. Proyeksi Elliptical Mercator

Proyeksi sebenarnya memodelkan bumi sebagai elipsoid. Proyeksi ini memberikan rasio yang akurat untuk objek di mana pun di Bumi . Tentunya, ini menghormati objek di peta tetapi tidak 100% akurat . Namun, pendekatan ini bukan yang paling sering digunakan karena kompleks secara komputasi.

Mari terapkan 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 rumitnya pendekatan ini terhadap proyeksi pada sumbu y. Hal ini karena harus memperhatikan bentuk bumi yang tidak bulat. Meskipun pendekatan Mercator yang sebenarnya tampak kompleks, pendekatan ini lebih akurat daripada pendekatan bola karena menggunakan radius untuk merepresentasikan bumi satu minor dan satu mayor.

Mari kita uji konversi sederhana:

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

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

3 . Kesimpulan

Jika kita perlu mengubah koordinat lintang dan bujur menjadi permukaan 2D, kita dapat menggunakan proyeksi Mercator. Bergantung pada akurasi yang kita butuhkan untuk implementasi kita, kita dapat menggunakan pendekatan bola atau elips.

Seperti biasa, kami dapat menemukan kode artikel ini di GitHub.