Preveďte zemepisnú šírku a dĺžku na bod 2D v prostredí Java

1. Prehľad

Pri implementácii aplikácií, ktoré používajú mapy, sa zvyčajne stretneme s problémom prevodu súradníc. Väčšinou musíme previesť zemepisnú šírku a dĺžku na bod 2D na zobrazenie. Našťastie na vyriešenie tohto problému môžeme použiť vzorce Mercatorovej projekcie.

V tomto výučbe sa budeme venovať projekcii Mercator a naučíme sa, ako implementovať jej dve varianty.

2. Mercatorova projekcia

Mercatorova projekcia je mapová projekcia, ktorú predstavil flámsky kartograf Gerardus Mercator v roku 1569. Mapová projekcia prevádza súradnice zemepisnej šírky a dĺžky na Zemi na bod na rovnom povrchu. Inými slovami, prekladá bod na povrchu Zeme do bodu na plochej mape.

Existujú dva spôsoby implementácie projekcie Mercator. Pseudo Mercatorova projekcia zaobchádza so Zemou ako s guľou. Skutočná Mercatorova projekcia modeluje Zem ako elipsoid. Budeme implementovať obe verzie.

Začnime so základnou triedou pre obe implementácie projekcie Mercator:

abstraktná trieda Mercator {final static double RADIUS_MAJOR = 6378137.0; finálna statická dvojitá RADIUS_MINOR = 6356752,3142; abstraktná dvojitá yAxisProjection (dvojitý vstup); abstraktná dvojitá xAxisProjection (dvojitý vstup); }

Táto trieda tiež poskytuje hlavný a vedľajší polomer Zeme meraný v metroch. Je dobre známe, že Zem nie je zrovna guľa. Z tohto dôvodu potrebujeme dva polomery. Po prvé, hlavný polomer je vzdialenosť od stredu Zeme k rovníku. Po druhé, menší polomer je vzdialenosť od stredu Zeme k severnému a južnému pólu.

2.1. Sférická Mercatorova projekcia

Model pseudoprojekcie zaobchádza so Zemou ako s guľou. Na rozdiel od eliptickej projekcie, kde by sa Zem premietala do presnejších tvarov. Tento prístup nám umožňuje a rýchly odhad na presnejšiu, ale výpočtovo ťažšiu eliptickú projekciu. V dôsledku toho je priamy merania vzdialeností v tejto projekcii bude približná.

Ďalej sa proporcie tvarov na mape mierne zmenia. Výsledkom je, že zemepisná šírka a pomery tvarov objektov na mape, ako sú krajiny, jazerá, rieky atď., Nie sú presne zachované.

Toto sa tiež nazýva projekcia Web Mercator - bežne používaná vo webových aplikáciách vrátane Google Maps.

Implementujme tento prístup:

verejná trieda SphericalMercator rozširuje Mercator {@Override double xAxisProjection (dvojitý vstup) {return Math.toRadians (vstup) * RADIUS_MAJOR; } @Override dvojitý yAxisProjection (dvojitý vstup) {návrat Math.log (Math.tan (Math.PI / 4 + Math.toRadians (vstup) / 2)) * RADIUS_MAJOR; }}

Najskôr je potrebné si uvedomiť, že tento prístup predstavuje: polomer Zeme jedna konštanta a nie dve také, aké v skutočnosti sú. Po druhé, môžeme vidieť, že sme implementovali dve funkcie, ktoré sa majú použiť na prevod na priemet osi x a priemet osi y. V triede vyššie sme použili Matematika knižnica poskytovaná jazykom Java, ktorá nám pomáha zjednodušiť náš kód.

Vyskúšajme jednoduchú konverziu:

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

Stojí za zmienku, že táto projekcia namapuje body do ohraničujúceho poľa (vľavo, dole, vpravo, hore) z (-20037508,34, -23810769,32, 20037508,34, 23810769,32).

2.2. Eliptická Mercatorova projekcia

Skutočná projekcia modeluje Zem ako elipsoid. Táto projekcia dávapresné pomerypre objekty kdekoľvek na Zemi. Určite rešpektuje objekty na mape, alenie 100% presné. Tento prístup však nie je najčastejšie používaný, pretože je výpočtovo zložitý.

Implementujme tento prístup:

trieda EllipticalMercator rozširuje Mercator {@Override dvojitý yAxisProjection (dvojitý vstup) {vstup = Math.min (Math.max (vstup, -89,5), 89,5); double earthDimensionalRateNormalized = 1,0 - Math.pow (RADIUS_MINOR / RADIUS_MAJOR, 2); dvojitý vstupOnEarthProj = Math.sqrt (earthDimensionalRateNormalized) * Math.sin (Math.toRadians (vstup)); inputOnEarthProj = Math.pow (((1.0 - inputOnEarthProj) / (1.0 + inputOnEarthProj)), 0,5 * Math.sqrt (earthDimensionalRateNormalized)); dvojitý vstupOnEarthProjNormalized = Math.tan (0,5 * ((Math.PI * 0,5) - Math.toRadians (vstup))) / inputOnEarthProj; return (-1) * RADIUS_MAJOR * Math.log (inputOnEarthProjNormalized); } @Override double xAxisProjection (dvojitý vstup) {návrat RADIUS_MAJOR * Math.toRadians (vstup); }}

Vyššie vidíme, aký zložitý je tento prístup vzhľadom na projekciu na osi y. Je to tak preto, lebo by sa malo brať do úvahy nekruhový tvar Zeme. Aj keď sa skutočný Mercatorov prístup javí ako zložitý, je presnejší ako sférický prístup, ktorý sa používa v prípade, že polomer predstavuje jednu malú a jednu veľkú zem.

Vyskúšajme jednoduchú konverziu:

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

Táto projekcia namapuje body do ohraničujúceho poľa (-20037508,34, -34619289,37, 20037508,34, 34619289,37).

3. Záver

Ak potrebujeme previesť súradnice zemepisnej šírky a dĺžky na povrch 2D, môžeme použiť Mercatorovu projekciu. V závislosti od presnosti, ktorú potrebujeme na implementáciu, môžeme použiť sférický alebo eliptický prístup.

Ako vždy nájdeme kód tohto článku na GitHube.


$config[zx-auto] not found$config[zx-overlay] not found