Pretvorite zemljopisnu širinu i dužinu u 2D točku na Javi

1. Pregled

Kada implementiramo aplikacije koje koriste mape, obično ćemo naići na problem pretvorbe koordinata. Većinu vremena moramo pretvoriti zemljopisnu širinu i dužinu u 2D točku za prikaz. Srećom, da bismo riješili taj problem, možemo se poslužiti formulama Mercatorove projekcije.

U ovom ćemo uputstvu pokriti Mercator projekciju i naučit ćemo kako primijeniti njegove dvije varijante.

2. Projekcija Mercatora

Projekcija Mercator je projekcija karte koju je uveo flamanski kartograf Gerardus Mercator 1569. Projekcija karte pretvara koordinate zemljopisne širine i dužine na Zemlji u točku na ravnoj površini. Drugim riječima, prevodi točku na površini zemlje u točku na ravnoj karti.

Postoje dva načina implementacije Mercatorove projekcije. Pseudo Mercatorova projekcija tretira Zemlju kao kuglu. Prava Mercatorova projekcija modelira Zemlju kao elipsoid. Implementirat ćemo obje verzije.

Počnimo s osnovnom klasom za obje implementacije Mercatorove projekcije:

apstraktna klasa Mercator {konačni statički dvostruki RADIUS_MAJOR = 6378137.0; završni statički dvostruki RADIUS_MINOR = 6356752.3142; sažetak dvostruka yAxisProjection (dvostruki ulaz); sažetak dvostruka xAxisProjection (dvostruki ulaz); }

Ova klasa također pruža glavni i manji radijus Zemlje izmjeren u metrima. Dobro je poznato da Zemlja nije baš sfera. Iz tog razloga su nam potrebna dva polumjera. Prvo, glavni radijus je udaljenost od središta zemlje do ekvatora. Drugo, manji radijus je udaljenost od središta zemlje do sjevernog i južnog pola.

2.1. Sferna Mercatorova projekcija

Model pseudo-projekcije tretira zemlju kao kuglu. Za razliku od eliptične projekcije gdje bi se Zemlja projicirala u točnijem obliku. Ovaj pristup omogućuje nam a brza procjena do preciznije, ali proračunski teže eliptične projekcije. Kao rezultat toga, izravna mjerenja udaljenosti u ovoj će projekciji biti približno.

Nadalje, proporcije oblika na karti će se neznatno promijeniti. Kao rezultat te zemljopisna širina i omjeri oblika objekata na karti kao što su zemlje, jezera, rijeke itd. Nisu precizno sačuvana.

To se naziva i Web Mercator projekcijom - koja se često koristi u web aplikacijama, uključujući Google Maps.

Primijenimo ovaj pristup:

javna klasa SphericalMercator proširuje Mercator {@Override double xAxisProjection (dvostruki ulaz) {return Math.toRadians (input) * RADIUS_MAJOR; } @Override double yAxisProjection (dvostruki ulaz) {return Math.log (Math.tan (Math.PI / 4 + Math.toRadians (input) / 2)) * RADIUS_MAJOR; }}

Prvo što treba primijetiti kod ovog pristupa je činjenica da ovaj pristup predstavlja radius zemlje po jedna konstanta a ne dvije kao što stvarno jest. Drugo, možemo vidjeti da smo implementirali dvije funkcije za pretvaranje u projekcija osi x i projekcija osi y. U gornjoj klasi koju smo koristili Matematika knjižnica koju nam je osigurala Java kako bi nam olakšala rad koda.

Isprobajmo jednostavnu pretvorbu:

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

Vrijedno je napomenuti da će ova projekcija preslikati točke u granični okvir (lijevo, dolje, desno, gore) od (-20037508.34, -23810769.32, 20037508.34, 23810769.32).

2.2. Eliptična Mercatorova projekcija

Istinska projekcija modelira zemlju kao elipsoid. Ova projekcija dajetočni omjeriza objekte bilo gdje na Zemlji. Sigurno, poštuje objekte na karti alinije 100% precizan. Međutim, ovaj pristup nije najčešće korišten jer je računski složen.

Primijenimo ovaj pristup:

klasa EllipticalMercator proširuje Mercator {@Override double yAxisProjection (dvostruki ulaz) {input = Math.min (Math.max (input, -89,5), 89,5); dvostruka zemljaDimensionalRateNormalized = 1,0 - Math.pow (RADIUS_MINOR / RADIUS_MAJOR, 2); dvostruki inputOnEarthProj = Math.sqrt (earthDimensionalRateNormalized) * Math.sin (Math.toRadians (input)); inputOnEarthProj = Math.pow (((1,0 - inputOnEarthProj) / (1,0 + inputOnEarthProj)), 0,5 * Math.sqrt (earthDimensionalRateNormalized)); dvostruki inputOnEarthProjNormalized = Math.tan (0,5 * ((Math.PI * 0,5) - Math.toRadians (input))) / inputOnEarthProj; return (-1) * RADIUS_MAJOR * Math.log (inputOnEarthProjNormalized); } @Override double xAxisProjection (dvostruki ulaz) {return RADIUS_MAJOR * Math.toRadians (input); }}

Iznad možemo vidjeti koliko je ovaj pristup složen u pogledu projekcije na os y. To je zato što bi trebalo uzeti u obzir ne-okrugli oblik zemlje. Iako se pravi Mercatorov pristup čini složenim, točniji je od sfernog pristupa jer koristi polumjere za predstavljanje jedne male i jedne velike zemlje.

Isprobajmo jednostavnu pretvorbu:

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

Ova projekcija preslikava točke u granični okvir (-20037508.34, -34619289.37, 20037508.34, 34619289.37).

3. Zaključak

Ako moramo pretvoriti koordinate zemljopisne širine i dužine na 2D površinu, možemo koristiti Mercatorovu projekciju. Ovisno o točnosti koja nam je potrebna za našu provedbu, možemo koristiti sferni ili eliptični pristup.

Kao i uvijek, kod ovog članka možemo pronaći na GitHubu.


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