0

私は自分の位置の経度と緯度を持っており、道路に沿ったポイント (経度/緯度) のリストとして順序付けられた位置のリストを持っています。どの 2 点の間にいるのかを調べるにはどうすればよいですか?

最も近い 2 つのポイントを検索すると、写真の私の場合は P2 と P3 になります。ポイント p1 と p2 の間にいることを確認する方法を知りたいです。

検索するポイントのリストは、緯度と経度を含むデータベース行になるため、sql-query、linq-query、または疑似コードを作成する方法へのポインターであり、最適なソリューションを示すものはすべて大歓迎です。私は地理位置情報とその周りの数学に慣れていないので、初心者として扱ってください。;)

(ポイントのリストは、P1 の ID が 1、P2 の ID が 2 などになるように並べ替えられます。)

ここに画像の説明を入力

4

2 に答える 2

1

あなたが提案するものは非常に複雑になる可能性があり (同等の条件下で多くのポイント)、正確なアルゴリズムを提供するには (はるかに) より多くの作業が必要になることに注意してください。より単純な状況 (あなたの写真のようなもの) を処理することはそれほど難しくありません。以下を含める必要があります。

  • 緯度/経度の値をデカルト座標に変換します (計算を簡単にするためです。ただし、この手順をスキップすることもできます)。このリンクでは、この面でいくつかのインスピレーションを得ることができます。それは C# ですが、アイデアはとにかく明確です。

  • 使用可能なすべての点を「対で」反復し、分析対象の点 ( Mypos) がそれらによって形成された線の中間位置にあるかどうかを確認します。以下のコードに示されているように、この計算は非常に単純であるため、事前にフィルター処理を行う必要はありません (事前に近いポイントを探します)。

.

Dim point1() As Double = New Double() {0, 0} 'x,y
Dim point2() As Double = New Double() {0, 3}
Dim pointToCheck() As Double = New Double() {0.05, 2}

Dim similarityRatio As Double = 0.9
Dim minValSimilarDistance As Double = 0.001
Dim similarityDistance As Double = 0.5

Dim eq1 As Double = (point2(0) - point1(0)) * (pointToCheck(1) - point1(1))
Dim eq2 As Double = (point2(1) - point1(1)) * (pointToCheck(0) - point1(0))
Dim maxVal As Double = eq1
If (eq2 > eq1) Then maxVal = eq2

Dim inLine = False
Dim isInBetween As Boolean = False

If (eq1 = eq2 OrElse (maxVal > 0 AndAlso Math.Abs(eq1 - eq2) / maxVal <= (1 - similarityRatio))) Then
    inLine = True
ElseIf (eq1 <= minValSimilarDistance AndAlso eq2 <= similarityDistance) Then
    inLine = True
ElseIf (eq2 <= minValSimilarDistance AndAlso eq1 <= similarityDistance) Then
    inLine = True
End If

If (inLine) Then
    'pointToCheck part of the line formed by point1 and point2, but not necessarily between them
    Dim insideX As Boolean = False
    If (pointToCheck(0) >= point1(0) AndAlso pointToCheck(0) <= point2(0)) Then
        insideX = True
    Else If (pointToCheck(0) >= point2(0) AndAlso pointToCheck(0) <= point1(0)) Then
        insideX = True
    End If
    if(insideX) Then
        If (pointToCheck(1) >= point1(1) AndAlso pointToCheck(1) <= point2(1)) Then
            isInBetween = True
        ElseIf (pointToCheck(1) >= point2(1) AndAlso pointToCheck(1) <= point1(1)) Then
            isInBetween = True
        End If
    End If
End If

If (isInBetween) Then
    'pointToCheck is between point1 and point2
End If

ご覧のとおり、さまざまな比率を含めて、正確な条件を微調整できるようにしました (ポイントは、ほとんどの場合、直線上に正確には収まりません)。similarityRatio多かれ少なかれ類似している「方程式」を説明します (つまり、X と Y の値が線内に正確には収まりませんが、十分に近い)。similarityRatioゼロを含むケース (たとえば、同じ X または Y) を適切に処理できません。これが目的でminValSimilarDistanceありsimilarityDistance、目的です。これらの値を調整するか、比率を再定義することができます (「方程式」ではなく、ポイント間の X/Y 変動に関して)。

于 2013-09-19T08:50:29.510 に答える