Konvertálja a szélességi és hosszúsági adatokat 2D-pontra a Java-ban

1. Áttekintés

A térképeket használó alkalmazások megvalósításakor jellemzően a koordináta-átalakítás problémájába ütközünk. Legtöbbször nekünk kell konvertálja a szélességet és hosszúságot 2D ponttá a megjelenítéshez. Szerencsére a probléma megoldásához felhasználhatjuk a Mercator vetületének képleteit.

Ebben az oktatóanyagban bemutatjuk a Mercator vetületét, és megtanuljuk, hogyan kell megvalósítani két változatát.

2. Mercator vetület

A Mercator-vetület egy térképvetítés, amelyet Gerardus Mercator flamand térképész vezetett be 1569-ben. Más szavakkal, a föld felszínén lévő pontot egy lapos térkép pontjává fordítja.

A Mercator-vetület megvalósításának két módja van. A pszeudo Mercator vetület gömbként kezeli a Földet. Az igazi Mercator-vetület ellipszoidként modellezi a Földet. Mindkét verziót megvalósítjuk.

Kezdjük egy alaposztályral mindkét Mercator vetítési megvalósításhoz:

absztrakt osztály Mercator {végső statikus kettős RADIUS_MAJOR = 6378137.0; végleges statikus kettős RADIUS_MINOR = 6356752.3142; absztrakt dupla yAxisProjection (kettős bemenet); absztrakt dupla xAxisProjection (kettős bemenet); }

Ez az osztály megadja a Föld fő- és melléksugarát is méterben mérve. Köztudott, hogy a Föld nem éppen gömb. Ezért két sugárra van szükségünk. Először is a fő sugár a föld közepétől az Egyenlítőig terjedő távolság. Másodszor, a kisebb sugár a föld közepétől az északi és déli pólusig terjedő távolság.

2.1. Gömb alakú Mercator vetület

Az álprojekciós modell a földet gömbként kezeli. Ellentétes vetítéssel ellentétben, ahol a Föld pontosabb alakra vetülne. Ez a megközelítés lehetővé teszi számunkra a gyors becslés a pontosabb, de számítási szempontból nehezebb elliptikus vetületre. Ennek eredményeként a közvetlen távolságmérések ebben a vetületben hozzávetőleges lesz.

Ezenkívül a térképen lévő alakzatok aránya kis mértékben megváltozik. Ennek eredményeként a térképen lévő objektumok földrajzi szélessége és alakjainak aránya, például az országok, tavak, folyók stb. pontosan megőrzött.

Ezt hívják Web Mercator vetítésnek is - amelyet gyakran használnak a webes alkalmazásokban, beleértve a Google Maps-et is.

Vezessük be ezt a megközelítést:

a SphericalMercator nyilvános osztály kiterjeszti a Mercatorot {@Orride double xAxisProjection (double input) {return Math.toRadians (input) * RADIUS_MAJOR; } @Orride double yAxisProjection (double input) {return Math.log (Math.tan (Math.PI / 4 + Math.toRadians (input) / 2)) * RADIUS_MAJOR; }}

Először meg kell jegyezni ezt a megközelítést, hogy ez a megközelítés képviseli a sugár a föld által egy állandó és nem kettőt, mint amilyen valójában. Másodszor, láthatjuk, hogy két funkciót valósítottunk meg a konvertáláshoz x tengely vetület és y tengely vetület. A fenti osztályban használtuk Math a java által biztosított könyvtár, amely megkönnyíti a kódunk egyszerűsítését.

Teszteljünk egy egyszerű konverziót:

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

Érdemes megjegyezni, hogy ez a vetület a (-20037508.34, -23810769.32, 20037508.34, 23810769.32) határoló dobozába (balra, alul, jobbra, felülre) térképez.

2.2 Elliptikus Mercator vetület

Az igazi vetület a földet ellipszoidként modellezi. Ez a vetület adpontos arányoktárgyakra a Föld bármely pontján. Biztosan, tiszteletben tartja a térképen lévő tárgyakat, denem 100% -ban pontos. Ez a megközelítés azonban nem a leggyakrabban használt, mert számítási szempontból bonyolult.

Vezessük be ezt a megközelítést:

class EllipticalMercator kiterjeszti a Mercatorot {@Orride 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); kettős inputOnEarthProj = Math.sqrt (earthDimensionalRateNormalized) * Math.sin (Math.toRadians (input)); inputOnEarthProj = Math.pow ((((1.0 - inputOnEarthProj) / (1.0 + inputOnEarthProj)), 0.5 * Math.sqrt (earthDimensionalRateNormalized)); kettős inputOnEarthProjNormalized = Math.tan (0,5 * ((Math.PI * 0,5) - Math.toRadians (input))) / inputOnEarthProj; return (-1) * RADIUS_MAJOR * Math.log (inputOnEarthProjNormalized); } @Orride double xAxisProjection (double input) {return RADIUS_MAJOR * Math.toRadians (input); }}

Fentről láthatjuk, hogy ez a megközelítés mennyire összetett az y-tengely vetületét illetően. Ennek figyelembe kell vennie a nem kerek föld alakját. Bár az igazi Mercator-megközelítés bonyolultnak tűnik, pontosabb, mint a gömbös megközelítés, mivel sugárzással használja a földet egy kiskorú és egy dúr ábrázolására.

Teszteljünk egy egyszerű konverziót:

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

Ez a vetület a pontokat leképezi a (-20037508.34, -34619289.37, 20037508.34, 34619289.37) határoló dobozába.

3. Következtetés

Ha a szélességi és hosszúsági koordinátákat 2D-s felületre kell átalakítanunk, használhatjuk a Mercator vetületét. A megvalósításhoz szükséges pontosságtól függően használhatjuk a gömbös vagy elliptikus megközelítést.

Mint mindig, a cikk kódját is megtalálhatjuk a GitHubon.