2012-08-17 13 views
6

Busqué alrededor de un día, pero no encontré ningún ejemplo para mi problema en Javacode.Obtener longitud Laltitude de un punto en mi Worldmap en Mollweide proyección

Tengo un mapa del mundo con un tamaño de 2000 * 1400 píxeles con una proyección 'Mollweide'. ¿Cómo puedo averiguar cuál es la longitud y la laitud del punto (500,300) en mi mapa? Me gustaría codificar esto en Java.

he tratado de hacer esto con el 'Mapa de Java Proyección Biblioteca':

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

Podría alguien ayudarme con eso? Codeexample o sugerencia.

gracias y saludos

+0

describe más. ¿Qué biblioteca se usa para Worldmap? –

Respuesta

4

Wikipedia tiene most of the information que necesita:

enter image description here

Estas fórmulas asumen algunas cosas, como de costumbre. Hablan en dimensión proyectada, que es más pequeña que el componente. [0,0] está en el centro, no arriba a la izquierda. La coordenada Y sube en lugar de bajar. Y el resultado es en radio en lugar de grado. Soluciona esto y te funcionarán.

Dado que no proporcionó un enlace, supongo que está utilizando la Biblioteca de Proyección de Mapas de Java on GitHub. Sin documentación y con tiempo limitado, no puedo entender inverseTransform lo suficiente como para corregir su código; pero el MapComponent paquete es más simple de código:

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

puede pegar este código en el constructor de ch.ethz.karto.gui.ProjectionSelectionPanel. El IDE debe informar que dos métodos del mapa son privados, y primero debe cambiarlos a públicos (o usar el reflejo). Luego inicie, seleccione Mollweide, haga clic en el globo y mire la consola. Siéntase libre de cambiar el tamaño de la ventana.

+0

Muchas gracias. me ayudaste mucho. No estaba seguro con lambda 0. Ahora veo. Gracias. –

1

esta pregunta utiliza la información de la entrada de Wikipedia sobre Mollweide projection Inglés. He transcrito prácticamente la fórmula desde allí textualmente.

La respuesta corta, por lo que puede escribir su propio código:

Get del mapa de radio, r:
projectionWidth/(2 * √2)

Get theta, el ángulo del punto del mapa :
arcsine (y/(r * √2))

Nota: Arcsine es el inverso de sine. Utilice Math.asin (a) en java

Obtener la latitud:
arcoseno ((2 * theta + sine (2 * theta))/PI)

Obtener la longitud:
PI * x/(2 * R * √2 * coseno (theta)) + meridiano central.

O puede copiar esto.
No es muy eficiente; x e y son especificaciones como dobles becaus demasiado vago para escribir evitar encasillado estrechamiento
no-set no-compradores de todos los vars pública
todo el mundo-uno-Love TV-cenas del Dr. Bronner resolver sus problemas para usted
y cosas
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); 
    } 
} 

Después de llamar al constructor como

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

se puede obtener la latitud y la longitud de ted.longitude y ted.latitude. Además, la longitud puede tener que ajustarse en función de dónde se coloca el meridiano central en su proyección.

Cuestiones relacionadas