如何在OpenLayers 3中通过地图边缘绘制测地线?

时间:2016-06-16 10:29:22

标签: javascript maps coordinates openlayers openlayers-3

我正在尝试使用arc.js绘制测地线。当点的经度差小于180时,它工作正常。否则,例如,经度为179和-179,OpenLayers绘制距离最远的线。

所以我找到了直线的解决方案:

  1. 检查经度差异是否超过180
  2. 计算所需线和地图边缘的交点(找到经度为180或-180的临时点)
  3. 使用数组ol.geom.MultiLineString
  4. 创建[[firstPoint, temporaryPoint], [temporaryPoint, secondPoint]]
  5. 使用行创建功能
  6. 它工作正常。但是对于使用arc.js的测地线来说这个技巧非常复杂。主要问题在于交叉点的计算。

    enter image description here

    我应该在OpenLayers文档或examples中找到解决方案但是没有任何地图边缘交叉的例子。

1 个答案:

答案 0 :(得分:2)

经过数小时的调查,我找到了解决方案。这看起来像一个技巧,但它工作正常。

首先,这是来自arc.js documentation的原始代码:

group_concat

主要问题是arc.js无法计算与International Date Line相交的线的坐标。所以我决定在计算Great Circle之前将点移动到一个图块中。

我必须找到经度偏移:

 SELECT 
    report.`Name`,
    GROUP_CONCAT(
      CONCAT(
        "[",
      DATE(report.Date) --(not working) order by DATE(report.Date)  ,
        ',',
      report.ProductPrice --(not working) order by DATE(report.ProductPrice) ,
        "]"
      ) 
    ) AS ProductPrice  
  FROM report
 GROUP BY report.Name ;

也可能是var start = { x: currentPoint.longitude, y: currentPoint.latitude }, end = { x: nextPoint.longitude, y: nextPoint.latitude }, generator = new arc.GreatCircle(start, end), arcLine = generator.Arc(1000 ,{offset:10}); 。取决于放置什么点。

之后,您可以使用arc.js生成坐标:

var dateLineOffset = 180 - currentPoint.longitude;

然后你需要迭代生成的坐标并修复偏移量。就我而言,我使用了地图

nextPoint.longitude

那就是它。 var start = { x: -180, y: currentPoint.latitude }, end = { x: nextPoint.longitude + dateLineOffset, y: nextPoint.latitude }, generator = new arc.GreatCircle(start, end), arcLine = generator.Arc(1000 ,{offset:10}); 将包含正确的坐标。

enter image description here