2

Google Earthから、次のような画像の座標が記載されたボックスを入手しました。

    <LatLonBox>
        <north>53.10685</north>
        <south>53.10637222222223</south>
        <east>8.853144444444444</east>
        <west>8.851858333333333</west>
        <rotation>-26.3448</rotation>
    </LatLonBox>

次に、このLatLonBoxと交差するポイントの天気をテストします。ポイントがLatLonBoxと交差するかどうかを確認する基本的なアイデアは、ポイントを指定された角度だけ回転させて戻し、ポイントが通常の(回転されていない)長方形と交差するかどうかをテストすることでした。

回転を手動で計算しようとしました:

public static MyGeoPoint rotatePoint(MyGeoPoint point, MyGeoPoint origion, double degree)
{
double x = origion.getLatitude() + (Math.cos(Math.toRadians(degree)) * (point.getLatitude() - origion.getLatitude()) - Math.sin(Math.toRadians(degree)) * (point.getLongitude() - origion.getLongitude()));
double y =  origion.getLongitude()  + (Math.sin(Math.toRadians(degree)) * (point.getLatitude() - origion.getLatitude()) + Math.cos(Math.toRadians(degree))  * (point.getLongitude() - origion.getLongitude()));

return new MyGeoPoint(x, y);

}

public boolean intersect(MyGeoPoint geoPoint)
{   
    geoPoint = MyGeoPoint.rotatePoint(geoPoint, this.getCenter(), - this.getRotation());
    
    return (geoPoint.getLatitude() < getTopLeftLatitude()
            && geoPoint.getLatitude() > getBottomRightLatitude()
                && geoPoint.getLongitude() > getTopLeftLongitude()
                    && geoPoint.getLongitude() < getBottomRightLongitude());
}

そして、結果は間違っているようです。

    LatLonBox box = new LatLonBox(53.10685, 8.851858333333333, 53.10637222222223, 8.853144444444444, -26.3448);
    
    MyGeoPoint point1 = new MyGeoPoint(53.106872, 8.852311);
    MyGeoPoint point2 = new MyGeoPoint(53.10670378322918, 8.852967186822669);   
    MyGeoPoint point3 = new MyGeoPoint(53.10652664993972, 8.851994565566875);
    MyGeoPoint point4 = new MyGeoPoint(53.10631650700605, 8.85270995172055);
    
    System.out.println(box.intersect(point1));
    System.out.println(box.intersect(point2));
    System.out.println(box.intersect(point3));
    System.out.println(box.intersect(point4));

結果はtrue、false、false、trueです。しかし、それは4倍真であるはずです。おそらく私は、推論に何らかの誤りを犯しています。緯度の値が上に向かって大きくなっているためかもしれません。しかし、私はフォーミュラを変更する方法を知りません。

助けが必要です ...


編集:私の基本的な考え方と公式は正しいと思います。また、私は同様の解決策を見つけました。リンクし、違いを見つけることができませんでした。

したがって、考えられる唯一のエラーの原因は、軸が比例していないことだと思います。したがって、問題はこれをどのように考慮するかです。

誰かがアイデアを持っていることを願っています。

4

3 に答える 3

4

問題は確かに軸が比例していないということでした。

次の方法で処理します。

public static MyGeoPoint rotatePoint(MyGeoPoint point, MyGeoPoint origion, double degree)
{
double x =  origion.longitude   + (Math.cos(Math.toRadians(degree)) * (point.longitude - origion.longitude) - Math.sin(Math.toRadians(degree))  * (point.latitude - origion.latitude) / Math.abs(Math.cos(Math.toRadians(origion.latitude)));
double y = origion.latitude + (Math.sin(Math.toRadians(degree)) * (point.longitude - origion.longitude) * Math.abs(Math.cos(Math.toRadians(origion.latitude))) + Math.cos(Math.toRadians(degree))   * (point.latitude - origion.latitude));
return new MyGeoPoint(x, y);
}
于 2012-10-11T14:04:26.607 に答える
0

私が正しく理解していれば、これらの4つの点が回転した長方形にあるかどうかを確認したいと思います。

長方形が回転しているので、コーナーポイントではなくチェックすることをお勧めしますが、次のようになります。

長方形ABCDを回転させた場合は、線| AB |、| BC |、|CD|を計算します。および|DA|。2つの点がある場合は、y = ax + bを使用します(2つの簡単な等式化を与える両方の座標の[x、y]を与えることによってa、bを計算します)。

最後に、関数intersectがチェックします

  if point <= line |CD| 
      AND point >= line |AB|
          AND point <= line |BC|
             AND point >= |DA|

それからそれは長方形の内側にあります。

これは、ポイントP [x、y]をax + y + b(a> 0または-ax-yb)に入れたときに実行できます。ゼロの場合は線上にあり、線の下または「左側」よりも小さい場合は線上にあります。お役に立てば幸いです。

ところで、なぜ-1を掛ける度の値を使用しているのですか?それは必要ですか?

于 2012-10-05T12:26:57.607 に答える
0

問題は、データ構造LatLonBoxが画像の境界の説明として意味をなさないことであるように思われます。緯度経度座標のボックスは、幾何学的な長方形ではありません。(北極の近くまたは北極を含むボックスについて考えてみてください。)画像の中心の緯度/経度座標を処理するようにアプリケーションを再考してから、緯度の線に対する角度として回転を処理する必要があります。 (赤道に平行)。(それでも、北極または南極を中心とする画像は、個別に処理する必要がある退化したケースになります。)したがって、ボックスは適切に次のようになります。

<geobox>
  <center_lat>41</center_lat>
  <center_lon>-74</center_lon>
  <rotation_degrees_ccw>-23</rotation_degrees_ccw>
  <width>1000</width> <!-- in pixels or meters, but not in degrees! -->
  <height>600</height> <!-- same as above -->
</geobox>

そうは言っても、(x0、y0)、幅w、高さh、中心を中心とした回転角度Tを中心とする真の幾何学的ボックスがあるとします。次に、次のようにして、ボックス内のメンバーシップについてポイントP(x、y)をテストできます。ボックスを原点に移動し、軸に揃える変換が必要です。これは、Translate(-x0、-y0)、次にRotate(-T)です。行列としてのこの変換は

[cos(-T) -sin(-T) 0][1 0 -x0]   [ cos(T)  sin(T) -x0*cos(T)-y0*sin(T)]
[sin(-T)  cos(-T) 0][0 1 -y0] = [-sin(T)  cos(T)  x0*sin(T)-y0*cos(T)]
[0        0       1][0 0   1]   [  0        0                  1     ]

この変換をテストするポイントに適用して、目的のボックスにあるかどうかを確認します。

// Transform the point to be tested.
ct = cos(T);
st = sin(T);
xp =  ct * x + st * y - x0 * ct - y0 * st;
yp = -st * x + ct * y + x0 * st - y0 * ct;
// Test for membership in the box.
boolean inside = xp >= -w/2 && xp <= w/2 && yp >= -h/2 && yp <= h/2;

遅く、この算術をチェックしていませんが、近いです。それが機能しない場合は言います。

于 2012-10-10T02:48:44.057 に答える