LineStringにArrowheadを追加

[[x, y], [x, y], …] で記述されたLineString(点を順につなげた線)がある。

これを座標上に描画するのだが、方向(どちらが始点か)が一目見てわかるようにしたいとする。

いろいろ方法はあるが、とりあえず汎用的には、線分の終点にアローヘッド(矢印の頭)を付け加えて描画するとよい。

def add_arrowhead(coordinates):
    """
    :param coordinates: [[x, y], [x, y], ...]
    """
    # 矢印の傘の角度
    # 今回は18degとし、cos(18), sin(18)の値を事前計算
    cos, sin = 0.9510565, 0.3090170
    # LineStringの最後の2点を取得
    n1, n2 = coordinates[-2], coordinates[-1]
    vx = n2[0] - n1[0]
    vy = n2[1] - n1[1]
    nv = (vx ** 2 + vy ** 2) ** 0.5
    # ベクトルサイズ(=矢印の大きさ)を一定にする
    # 1e-4の部分で大きさを調整
    vx = vx / nv * 1e-4
    vy = vy / nv * 1e-4
    n3x = n2[0] + (-cos * vx - sin * vy)
    n3y = n2[1] + (sin * vx - cos * vy)
    n4x = n2[0] + (-cos * vx + sin * vy)
    n4y = n2[1] + (-sin * vx - cos * vy)
    coordinates.append([n3x, n3y])
    coordinates.append([n4x, n4y])
    coordinates.append(n2)

n1→n2に向かう線分のn2側に矢印を付けている。
n2→n1のベクトルをvとし、vを18度反時計方向にずらしたベクトルをn2→n3、18度時計方向にずらしたベクトルをn2→n4とする。いずれもベクトルの大きさが一定になるようにvの大きさで割って調整する。
LineStringの末尾にn3,n4,n2を加えることで、矢印の頭の三角形となる