1

作成しているアプリのマップとして使用する必要のあるモールの画像があります。私は地図の下隅のGPS緯度/長さを持っており、下のGPS座標から地図画像の上部になるまでの距離を計算しました。ただし、これらは直線の線形マップではありません。つまり、緯度と長さをすべてきれいにプロットすることはできません。

さまざまな数式を試してみましたが、とても近くにありますが、地図の左上と右上の上部の緯度と長さをプロットできません。これまでのところ、これは私が持っているものです:

double distanceFromLeftToRightGPS = bottomLeft.distanceTo(bottomRight);
double bearingleftToRight= bottomLeft.bearingTo(bottomRight);

double distmapFromLeftToRightImg = map.getWidth();
double distmapFromTopToBottomImg = map.getHeight();

double percentageValueOfTopToBottomImg = (distmapFromTopToBottomImg * 100)
        / distmapFromLeftToRightImg;
double distanceFromTopToBottomGPS = (percentageValueOfTopToBottomImg * 0.01)
        * distanceFromLeftToRightGPS;

double bearingToTopFromBottom = -90;
double lat1 = Math.toRadians(bottomLeft.getLatitude());
double lon1 = Math.toRadians(bottomLeft.getLongitude());

double dist = (distanceFromTopToBottomGPS/1000f)/6371.0f;

double lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist)
        + Math.cos(lat1) * Math.sin(dist) * Math.cos(bearingToTopFromBottom));

double a = Math.atan2(Math.sin(bearingToTopFromBottom) * Math.sin(dist)
        * Math.cos(lat1), Math.cos(dist) - Math.sin(lat1) * Math.sin(lat2));

System.out.println("a = " +  a);
double lon2 = lon1 + a;

lon2 = (lon2 + 3 * Math.PI) % (2 * Math.PI) - Math.PI;

System.out.println("Latitude = " + Math.toDegrees(lat2) + "\nLongitude = "
        + Math.toDegrees(lon2));

これで私はとても近くになりますが、最終的な場所は実際にあるべき場所から外れています。また、マップの下から上に何が表示されるかを確認するために、どの方位を使用すべきかわかりません。他の誰かがこれを機能させる方法についての情報を持っているなら、それは素晴らしいでしょう。

4

2 に答える 2

1

私がここSOに関する他のいくつかの投稿から思いついた解決策であるこれらの2つの方法。マップの左上隅と右下隅に左上のGPS座標と右下のGPS座標がある場合は、これら2つの方法を使用して、マップ上の3番目のGPS座標をどこに描画するかを判断できます。これらは、左上と右下のGPS座標と同じくらい正確になります。次に、キャンバスを使用してビットマップに3番目のポイントを描画します。

public final static double OneEightyDeg = 180.0d;
public static double ImageSizeW, ImageSizeH ;

getSizesFromBitmap(ImageSizeW, ImageSizeH);


public double getCurrentPixelY(Location upperLeft, Location lowerRight, Location current) {
    double hypotenuse = upperLeft.distanceTo(current);
    double bearing = upperLeft.bearingTo(current);
    double currentDistanceY = Math.cos(bearing * Math.PI / OneEightyDeg) * hypotenuse;
    //                           "percentage to mark the position"
    double totalHypotenuse = upperLeft.distanceTo(lowerRight);
    double totalDistanceY = totalHypotenuse * Math.cos(upperLeft.bearingTo(lowerRight) * Math.PI / OneEightyDeg);
    double currentPixelY = currentDistanceY / totalDistanceY * ImageSizeH;

    return currentPixelY;
}

public double getCurrentPixelX(Location upperLeft, Location lowerRight, Location current) {
    double hypotenuse = upperLeft.distanceTo(current);
    double bearing = upperLeft.bearingTo(current);
    double currentDistanceX = Math.sin(bearing * Math.PI / OneEightyDeg) * hypotenuse;
    //                           "percentage to mark the position"
    double totalHypotenuse = upperLeft.distanceTo(lowerRight);
    double totalDistanceX = totalHypotenuse * Math.sin(upperLeft.bearingTo(lowerRight) * Math.PI / OneEightyDeg);
    double currentPixelX = currentDistanceX / totalDistanceX * ImageSizeW;

    return currentPixelX;
}
于 2013-03-14T17:28:26.977 に答える
1

緯度/経度座標でマップ上の 3 つのポイントを特定する必要があります。次に、ヘルマート変換を使用します。
ここSOには、「ヘルマート」変換の投稿があります。

于 2013-03-14T11:43:47.803 に答える