

緯度経度座標系上の `O` の(緯度,経度)周囲に存在する線型の物体Tとの最も近距離点の座標を求めたいです。

現在、分かっている情報はOの緯度経度座標(degree)と青で表示されているバー型の物体の両端の緯度,経度座標(degree)のみです。

現在分かっている情報例:

[code]

    Oの座標(34.9207,39.4168),青バーの範囲(34.8923,139.3775~34.8915,139.3784)
    
[/code]

  
青バーは下記のコードで端っこの座標を入力して表示することができましたが、その後、上手く進めませんでした。

[code]

    bmap.plot([139.3775,34.8923],[139.3784,34.8915], 'r-',linewidth=4)
    
[/code]

現在、私のアイデアとしては青バーをlinspaceなどの関数で始点から終点までの座標を細かくし、O点から１つ１つの点までの距離を求め最も近距離の座標を取ろうと思っておりますがこれ以外、良い手法がありますでしょうか?

matlabのpolyxpolyの関数と似たような関数があれば教えていただきますでしょうか？  
どうぞよろしくお願いいたします。

[![状況の説明](https://i.stack.imgur.com/ZkwHM.png)](https://i.stack.imgur.com/ZkwHM.png)


CC BY-SA 4.0
2022-01-31T21:45:34.107
86049
2022-02-01T01:53:02.823
2022-02-01T00:11:31.093
3060
37823
question
python python3
地図上のある範囲の線から最短距離の点を求めたい


平面上での最短距離座標を求めるサンプルコードです。  
`get_nearest`関数で線分`t`と座標`o`の最短距離座標を計算して返します。

Shapelyパッケージの[nearest_points](https://shapely.readthedocs.io/en/latest/manual.html?highlight=linestring#shapely.ops.nearest_points)関数を使えば簡単に求めることもできます。(要`pip
install shapely`)  
なお、`nearest_points(t,
o)`は2個セットのタプルを返し、1個目は`o`に至近の`t`上のPointを、2個目は`t`に至近の`o`上のPoint(`o`はPointなので`o`そのもの)を返します。

**サンプルコード**

[code]

    def get_nearest(t, o):
        x1, y1 = t[0]
        x2, y2 = t[1]
        x3, y3 = o
        dx, dy = x2-x1, y2-y1
        det = dx*dx + dy*dy
        a = (dy*(y3-y1)+dx*(x3-x1))/det
        return x1+a*dx, y1+a*dy
    
    t = [(2, 0), (0, 1)]
    o = (0, 0)
    print(get_nearest(t, o))
    
    from shapely.geometry import Point, LineString
    from shapely.ops import nearest_points
    
    t = LineString([(2, 0), (0, 1)])
    o = Point(0, 0)
    
    nt, no = nearest_points(t, o)
    print(nt, no)
    
    # (0.3999999999999999, 0.8)
    # POINT (0.3999999999999999 0.8) POINT (0 0)
    
[/code]

**参考資料**  
[How to find the closest point on a line segment to an arbitrary
point?の回答](https://stackoverflow.com/a/28931906)  
[Find coordinate of the closest point on polygon in
Shapelyの回答](https://stackoverflow.com/a/56398341)


CC BY-SA 4.0
2022-02-01T01:53:02.823
86053
2022-02-01T01:53:02.823
9820
86049
answer