2012-08-17 12 views
6

Ich suchte jetzt über einen Tag, aber fand kein Beispiel für mein Problem in JavaCode.Longitude Laltitude eines Punktes in meiner Weltkarte in Mollweide Projektion

Ich habe eine Weltkarte mit einer Größe von 2000 * 1400 Pixeln mit einer 'Mollweide' Projektion. Wie kann ich herausfinden, wie lang und breit der Punkt (500,300) in meiner Karte ist? Ich möchte das in Java codieren.

Ich habe versucht, dies mit dem 'Java Map Projection Library' zu tun:

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()); 

mir jemand dabei helfen könnte? Code-Beispiel oder Hinweis.

Danke und Grüße

+0

beschreiben mehr. Welche Bibliothek nutzt Worldmap? –

Antwort

4

Wikipedia most of the information hat Sie brauchen:

enter image description here

Diese Formeln gehen davon aus, ein paar Dinge, wie üblich. Sie sprechen in projizierter Dimension, die kleiner als die Komponente ist. [0,0] ist in der Mitte, nicht oben links. Die Y-Koordinate steigt eher als ab. Und das Ergebnis ist im Radius statt Grad. Fix diese und sie werden für Sie arbeiten.

Da Sie keinen Link angegeben haben, nehme ich an, dass Sie die Java Map Projection Library on GitHub verwenden. Ohne Dokumentation und mit begrenzter Zeit kann ich inverseTransform nicht gut genug verstehen, um Ihren Code zu reparieren; aber die gebündelte MapComponent ist einfacher Code:

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); 
} 

Sie diesen Code in den Konstruktor von ch.ethz.karto.gui.ProjectionSelectionPanel einfügen können. Die IDE sollte angeben, dass zwei Methoden der Karte privat sind, und Sie müssen sie zuerst in public ändern (oder Reflektion verwenden). Dann starten Sie es, wählen Sie Mollweide, klicken Sie auf den Globus und beobachten Sie die Konsole. Fühlen Sie sich frei, die Größe des Fensters zu ändern.

+0

Vielen Dank. Sie haben mir sehr geholfen. war nicht sicher mit Lambda 0. jetzt sehe ich. Vielen Dank. –

1

Diese Antwort verwendet Informationen aus dem englischen Wikipedia-Eintrag auf Mollweide projection. Ich habe die Formel von da aus wörtlich übersetzt.

Die kurze Antwort, so dass Sie Ihren eigenen Code schreiben:

der Radius des auf Karte anzeigen, r:
projectionWidth/(2 * √2)

Get Theta, der Winkel der Punkt auf der Karte :
arcsine (y/(r * √2))

Hinweis: Arcsine ist das Inverse von Sinus. Verwenden Math.asin (a) in Java

Holen den Breitengrad:
arcsin ((2 * theta + sin (2 * theta))/PI)

Holen den Längengrad:
PI * x/(2 * R * √2 * Cosinus (Theta)) + Mittelmeridian.

Oder Sie können dies kopieren.
Es ist nicht sehr effizient; x und y-Spezifikation sind als becaus zu faul verdoppelt Typumwandlung zu vermeiden, schreiben Verengung
keine Etter Nein-Getter all-Vars öffentlichen
all-Welt-one-Liebe für Sie Dr. Bronner TV-Abendessen Ihre Probleme lösen
und
Sachen 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); 
    } 
} 

Nach dem Konstruktor aufrufen wie

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

Sie die geografische Breite und Länge von ted.longitude erhalten können und 012.338.. Außerdem muss die Länge möglicherweise angepasst werden, je nachdem, wo der Mittelmeridian auf Ihrer Projektion platziert ist.

Verwandte Themen