2013-02-21 102 views
1

我有一張Winkel Tripel地圖,需要將標記放在上面。我給定了緯度/經度標記的位置。所以我需要一種方法將它轉換爲X,Y。在Winkel Tripel投影上將經度/緯度轉換爲笛卡爾

我發現了一些代碼(下面),但是當我試用它時,45º對角線的曲線有一個適中的s曲線。所以顯然是不正確的。

任何幫助將是偉大的。我在PHP中這樣做,但我應該能夠轉換任何語言。

private function sinc($x){ 
    if($x == 0) return 1; 
    return sin($x)/$x; 
} 

private function winkelTripelToCartesian($lat, $lng){ 
    $lat = deg2rad($lat); 
    $lng = deg2rad($lng); 

    $alpha = acos(cos($lat) * cos($lng/2)); 

    $x = ($lng * M_2_PI + (2 * cos($lat) * sin($lng/2))/$this->sinc($alpha))/2; 
    $y = ($lat + (sin($lat)/$this->sinc($alpha)))/2; 

    return array('x'=> strval($x), 'y' => strval($y)); 
} 

回答

0

該映射投影嘗試將一個orb顯示爲2D對象,這會導致它改變形狀的外觀。這可能會導致你的線路彎曲。

如果你還沒有舒爾,這裏是一個腳本,我用使用JavaScript來繪製與溫克爾III投影地圖上的標記:

// latitudes/longitudes to radians 
    var latRadian = (latitudes[i] * Math.PI)/180; 
    var lngRadian = (longitudes[e] * Math.PI)/180; 
    console.log("Radian Coordinates = " + latRadian + ", " + lngRadian); 

    //Radians to xy cartesian coordinates 
    var alpha = Math.acos(Math.cos(latRadian) * Math.cos(lngRadian/2)); 
    var phi_1 = Math.acos(2/Math.PI); 
    function sinc(x) { 
     if (x == 0) { 
      return 1; 
     } else { 
      return (Math.sin(x)/x); 
     } 
    } 
    var x = (svgHeight/Math.PI) * (lngRadian * Math.cos(phi_1) + 2 * (Math.cos(latRadian) * Math.sin(lngRadian/2)/sinc(alpha)))/2; 
    var y = (svgHeight/Math.PI) * (latRadian + (Math.sin(latRadian)/sinc(alpha)))/2; 

你可以找到完整的例子在這裏:http://codepen.io/StinoM/pen/PZjYqw?editors=001

這裏是我發現使用Ruby的一些代碼:https://gist.github.com/duncanbeevers/195554

相關問題