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 在带有 winkel 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 回答