1

マーカーを配置する必要がある Winkel Tripel マップがあります。緯度/経度のマーカーの位置が与えられます。だから私はそれをX、Yに変換する方法が必要です。

いくつかのコード (以下) を見つけましたが、試してみると、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));
}
4

1 に答える 1

0

その地図投影法は、オーブを 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

于 2016-01-11T13:47:45.413 に答える