例と対応する画像を参照してください。
私は次のことを達成したいと思います:2つの場所(lat / lng)を提供します。これらは以下にAおよびBとして示されています。これから、仮想線が描画され、この線とCの間の距離が計算されます(任意の測定で)。
現在、Google Maps API v3でこれを達成していますが、選択した言語で舞台裏でこれを実行できるようにしたいと考えています。どんなヒント/アイデアも大歓迎です!
例と対応する画像を参照してください。
私は次のことを達成したいと思います:2つの場所(lat / lng)を提供します。これらは以下にAおよびBとして示されています。これから、仮想線が描画され、この線とCの間の距離が計算されます(任意の測定で)。
現在、Google Maps API v3でこれを達成していますが、選択した言語で舞台裏でこれを実行できるようにしたいと考えています。どんなヒント/アイデアも大歓迎です!
回答:
def get_perp( X1, Y1, X2, Y2, X3, Y3):
"""************************************************************************************************
Purpose - X1,Y1,X2,Y2 = Two points representing the ends of the line segment
X3,Y3 = The offset point
'Returns - X4,Y4 = Returns the Point on the line perpendicular to the offset or None if no such
point exists
'************************************************************************************************ """
XX = X2 - X1
YY = Y2 - Y1
ShortestLength = ((XX * (X3 - X1)) + (YY * (Y3 - Y1))) / ((XX * XX) + (YY * YY))
X4 = X1 + XX * ShortestLength
Y4 = Y1 + YY * ShortestLength
if X4 < X2 and X4 > X1 and Y4 < Y2 and Y4 > Y1:
return X4,Y4
return None
最短の長さは、私が間違えない限り、必要な距離ですか?
None
、合法的なソリューションが存在する場合にこのコードが返されることが多すぎるようです。問題は、最後の条件がX1 <X2およびY1 <Y2を想定していることであり、常に保証できるとは限りません。中間性のより良いテストが必要です。
たぶん私はそれをあまりにも複雑にしていますが、あなたが望むのはポイントからラインまでの距離です。これは、ABとCをABに直交する線で結ぶABに沿った点からの距離です。ABに垂直なこのベクトルは、
v=[x2-x1, -(y2-y1)] # Point A is [x1,y1] Point B is [x2,y2]
(角括弧を使用して、ベクトルまたは2要素配列を定義しました)。C [xp、yp]とポイントAの間の距離は
u=[x1-xp, y1-xp]
線とCの間の距離は、vに対するuの投影です。mod(v)= 1(それを正規化するだけ)と仮定すると、
distance = u*v = abs( (x2-x1)*(y1-yp) - (x1-xp)*(y2-y1) )
唯一の問題は、座標がWGS84の緯度/ログのペアではなく、投影されていることを確認したい(または測地座標を使用したい)ことです。これにはOGRまたはProj4を使用できます。
この数学のすべてにも少し嫌悪感を抱いているので、私は別の角度からそれを考えます。仮想回線ではなく「実際の」回線にしてから、既存のツールを使用します。
AとBが属性を共有している場合、線を引くことでそれらを接続できます(Kosmo GISには、ポイントから線を作成するツールがあり、このためのQGISプラグインもあると思います)。線を作成したら、「C」ポイントレイヤーの「ニア」機能を使用して、線までの距離を確認できます。ソフトウェアに数学を処理させてください!
AndroidでJavaを使用していた場合、ライブラリ関数を含む1行のみ
import static com.google.maps.android.PolyUtil.distanceToLine;
distanceToLine:
public static double distanceToLine(LatLng p, LatLng start,LatLng end)
ポイントpとラインセグメントの開始から終了までの球体上の距離を計算します。
パラメータ:p-測定するポイント
start-線分の始まり
end-線分の終わり
戻り値:メートル単位の距離(球体を想定)
ライブラリを追加するだけです
dependencies {
compile 'com.google.maps.android:android-maps-utils:0.5+'
}