创建一个任意的曲线,用于在OpenLayers中显示的已知文本行字符串

时间:2010-08-09 19:08:35

标签: geometry geospatial openlayers geography pathgeometry

我在生成的地图图层中的点之间动态生成WKT LineString,以便在OpenLayers中显示。我想使点之间的线条弯曲,我希望能够根据各种输入变量动态改变曲率。

这适用于网络监控应用,我们希望曲率基于点之间的延迟时间(不是原始延迟本身,而是在给定时间段内与“正常”值的偏差)。

虽然一些GIS应用程序和数据库支持WKT的CircularString扩展,但OpenLayers并不知道任何事情。

所以我需要从线段中生成一条曲线:

现在,行字符串只是:

LINESTRING(hop1_long hop1_lat, hop2_long hop2_lat)

我可以决定使linesegment“弯曲”的唯一方法是插入中间点:

LINESTRING(hop1_long hop1_lat, long1 lat1, long2 lat2, ..., hop2_long hop2_lat)

这应该完全适合我们的应用程序,但我不知道如何生成中间点!

我假设有一些众所周知的方法/算法用于在2d平面中生成线段之外的“弯曲”线。有没有人对如何实现这一点有任何想法,或有可能有帮助的书籍/文章/在线资源?

更新(2010-08-13):

Bezier曲线是票,在阅读之后实现基本的Bezier算法非常简单。但我必须编写一些代码来生成控制点。这是我想出的PHP代码。这假定为“Vector2d”类,其中包含xy成员。

function get_control_points($to, $from, $mag_scale, $angle) {
  $dirX = $to->x - $from->x;
  $dirY = $to->y - $from->y;

  $mag = sqrt(($dirX * $dirX) + ($dirY * $dirY));
  if (!$mag) {
    return array($to, $from);
  }

  $length = $mag * $mag_scale;

  $dirX = $dirX / $mag;
  $dirY = $dirY / $mag;

  $sin = sin($angle);
  $cos = cos($angle);

  $rotX = $cos * $dirX - $sin * $dirY;
  $rotY = $sin * $dirX + $cos * $dirY;
  $rotNegX = $cos * -$dirX - $sin * $dirY;
  $rotNegY = $sin * $dirX - $cos * $dirY;

  // Flip control points for "backwards" curves
  if ($dirX x;
    $y1 = -$rotNegY * $length + $from->y;
    $x2 = -$rotX * $length + $to->x;
    $y2 = -$rotY * $length + $to->y;
  }
  // Or generate "normal" control points
  else {
    $x1 = $rotX * $length + $from->x;
    $y1 = $rotY * $length + $from->y;
    $x2 = $rotNegX * $length + $to->x;
    $y2 = $rotNegY * $length + $to->y;
  }

  return array(new Vector2d($x2, $y2), new Vector2d($x1, $y1));
}

1 个答案:

答案 0 :(得分:3)

如果您想生成一系列构成曲线的线段,请首先查看可由单个变量轻松参数化的曲线。例如,以(cx,cy)为中心的半径为r的圆由以下表达式参数化:

(x,y)=(cx,cy)+ r *(cos(t),sin(t)),

其中t从0到2π。

所以你可以通过比较t k =π×k / 30来评估圆形来创建一个半圆形状,其中k从0到30运行。这会给你一个由30个线段组成的半圆弧。

如果您想要更多一般曲线,请查看Bezier curves。它们通过值t进行参数化,可以在0和1之间的均匀间隔进行评估。