2012-08-17 57 views
6

我搜索了大概一天,但沒有找到我的問題Javacode中的任何示例。獲取我在Mollweide投影中的世界地圖中某點的Laltitude

我有一個尺寸爲2000 * 1400像素的'Mollweide'投影的世界地圖。 我怎樣才能找出地圖中點(500,300)的經度和緯度? 我想用Java編寫這個代碼。

我試圖與「Java的地圖投影庫」要做到這一點:

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

誰能幫我嗎?代碼示例或提示。

感謝和問候

+0

描述更多。什麼圖書館用於Worldmap? – 2017-03-11 19:08:36

回答

4

維基百科有most of the information你需要:

enter image description here

這些公式假設了一些東西,像往常一樣。 他們說話的投影尺寸比組件小。 [0,0]位於中央,而不是左上角。 Y座標上升而不是下降。 結果是以半徑代替度數。 解決這些問題,他們會爲你工作。

由於您沒有提供鏈接,因此我假定您正在使用Java Map Projection Library on GitHub。 沒有文檔和時間有限,我無法理解inverseTransform以修復您的代碼;但捆綁MapComponent是簡單的代碼:

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

您可以將此代碼粘貼到的ch.ethz.karto.gui.ProjectionSelectionPanel構造。 IDE應該報告地圖的兩種方法是私人的,您需要將它們更改爲公開(或使用反射)。 然後啓動它,選擇Mollweide,點擊地球儀並觀看控制檯。隨意調整窗口大小。

+0

非常感謝。你幫了我很多。我不明白,lambda 0.現在我明白了。謝謝。 – 2017-03-12 06:13:09

1

這個答案使用從Mollweide projection的英文維基百科條目信息。我幾乎從那裏逐字抄錄了這個公式。

簡短的回答,這樣你就可以編寫自己的代碼:

獲取地圖的半徑r:
projectionWidth /(2 *√2)

獲取THETA,該點的沿着地圖角:
反正弦(y /(r *√2))

注:正弦是反正弦。使用Math.asin的(a)在Java

獲取的緯度:
反正弦((2 * THETA +正弦(2 * THETA))/ PI)

獲取經度:
PI * X/(2 * R *√2*餘弦θ)+中央子午線。

或者你可以copyPasta這個。
效率不高, x和y是規範雙打因爲...懶得寫類型轉換避免縮小
沒有制定者沒有干將全瓦爾公共
所有世界一個愛布朗納博士的電視晚餐解決您的問題,爲您
和東西
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); 
    } 
} 

調用諸如

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

構造函數,你可以從ted.longitude和獲取經緯度後。此外,經度可能需要根據中央子午線放置在投影中的位置進行調整。

相關問題