2012-08-17 4 views
6

Szukałem około dnia teraz, ale nie znalazłem żadnego przykładu mojego problemu w Javacode.Pobierz Litude długość punktu w mojej mapie świata w projekcji Mollweide

Mam mapę świata o wielkości 2000 * 1400 pikseli z projekcją "Mollweide". Jak mogę dowiedzieć się, jaka jest długość i wysokość punktu (500 300) na mojej mapie? Chciałbym zakodować to w Javie.

starałem się zrobić to z 'Java Map Projection Bibliotece':

Point2D.Double pointonmap = null; 
Point2D.Double latlon = null; 
MolleweideProjection molproj=new MolleweideProjection(); 

pointonmap = new Point2D.Double (1400,1000); 

latlon=molproj.inverseTransform(pointonmap,new Point2D.Double()); 

System.out.println("latlon: " + latlon.getX() + ", " + latlon.getY()); 

Czy ktoś może mi pomóc z tym? Kodeks przykładowy lub podpowiedź.

dzięki i pozdrowienia

+0

Opisz więcej. Jakiej biblioteki używa Worldmap? –

Odpowiedz

4

Wikipedia ma most of the information trzeba:

enter image description here

Wzory te zakładają kilka rzeczy, jak zwykle. Mówią w wymiarze rzutowanym, który jest mniejszy niż komponent. [0,0] znajduje się w środku, a nie w lewym górnym rogu. Współrzędna Y rośnie, zamiast się obniża. I wynik jest w promieniu zamiast stopnia. Napraw te i będą działać dla Ciebie.

Ponieważ nie podałeś linku, zakładam, że korzystasz z biblioteki Java Map Projection Library on GitHub. Bez dokumentacji i z ograniczonym czasem nie mogę zrozumieć inverseTransform wystarczająco dobrze, aby naprawić kod; ale dołączone MapComponent jest prostsza do kodu:

map.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { 

    double x = e.getX() - map.getWidth()/2, // Mouse X with [0,0] at centre. 
      y = e.getY() - map.getHeight()/2, // Mouse Y with [0,0] at centre. 
      // Max Y of projected map, in pixel with [0,0] at centre. 
      maxY = map.getMapExtension().getMaxY() * map.getScaleToShowAll(), 
      sqrt2 = Math.sqrt(2), // Can be optimised away, but let's be faithful. 
      R = maxY/sqrt2, // Radius of projection, in pixel. 
      theta = Math.asin(y/(R * sqrt2)); 
    int delta_long = -lon0Slider.getValue(); // Longtitude shift from -180 to 180. 

      // Find lat long in radius and converts to degree. 
    double latInRad = Math.asin(-(2 * theta + Math.sin(2 * theta))/Math.PI), 
      latitude = Math.toDegrees(latInRad), 
      longInRad = Math.PI * x/(2 * R * sqrt2 * Math.cos(theta)), 
      longitude = Math.toDegrees(longInRad) + delta_long; 

    System.out.println("Lat: " + latitude + ", Long: " + longitude); 
} 

Możesz wkleić ten kod do konstruktora ch.ethz.karto.gui.ProjectionSelectionPanel. IDE powinien zgłosić, że dwie metody mapy są prywatne, i najpierw musisz je zmienić na publiczne (lub użyć refleksji). Następnie uruchom, wybierz Mollweide, kliknij na świecie i oglądać konsolę. Możesz zmienić rozmiar okna.

+0

Dziękuję bardzo. bardzo mi pomogłeś. nie byłem pewien z lambdą 0. teraz widzę. dzięki. –

1

Odpowiedź ta wykorzystuje informacje z wpisu English Wikipedia na Mollweide projection. W zasadzie dosłownie transkrybowałem tę formułę.

Krótka odpowiedź, więc można napisać własny kod:

uzyskać mapy na promień, R:
projectionWidth/(2 * √2)

Get theta, kąt punktu za wzdłuż mapie :
arcus sinus (y/(r * √2))

Uwaga: Arcsine jest odwrotnością sinusa. Używać Math.asin (a) w Java

Get szerokości geograficznej
sinus ((2 * teta + sinus (2 * teta))/PI)

Pobierz Długość:
PI * X/(2 * R * √2 * cosinus (theta)) + środkowy południk.

Lub możesz skopiować to.
To nie jest bardzo wydajne; x i y są Spec jako podwaja becaus zbyt leniwy, aby napisać typecast Unikaj zwężający
nie ustawiaczy żadnych pozyskiwaniu wszystkie vars publicznego
cały świat-jeden-Love TV-kolacje Dr Bronner w rozwiązywaniu problemów dla ciebie
i rzeczy
enoj

public class MolleweidePoint 
{ 
    public double x, y, latitude, longitude; 

    public MolleweidePoint(double projectionWidth, double x, double y) 
    { 
     double rootTwo = Math.sqrt(2); 
     double r = projectionWidth/2/rootTwo; 
     double theta = Math.asin(y/r/rootTwo); 

     this.x = x; 
     this.y = y; 
     longitude = Math.PI * x/2/r/rootTwo/Math.cos(theta); 
     latitude = Math.asin(2 * theta + Math.sin(2 * theta)/Math.PI); 
    } 
} 

Po wywołaniu konstruktora jak

MolleweidePoint ted = new MolleweidePoint(projection.width, 300, 500) 

można uzyskać szerokość i długość geograficzną z ted.longitude i ted.latitude. Również długość geograficzna może być skorygowana w zależności od tego, gdzie centralny południk jest umieszczony na twojej projekcji.

Powiązane problemy