2013-03-14 134 views
1

我有我需要用作應用程序的地圖的商場圖像。我有地圖底角的GPS lat/long,我計算出了從底部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)); 

這讓我哦,如此接近,但最終的位置是離開它應該是真正的。我也不確定我應該使用什麼樣的方式來查看地圖底部會發生什麼。如果其他人有一些關於如何讓這個工作很棒的信息。

+0

這張照片是一幅地圖,顯示出像一個國家或大陸這樣的大地理區域,還是顯示出像村莊或城市這樣的小部分? – AlexWien 2013-03-14 11:39:38

+0

這些是矩形圖像,基本上都是從大型商場的藍色圖案中提取的。我實際上遇到了一些與我需要的數據類似的帖子,它使用左上角和右下角的gps座標來顯示地圖在谷歌地圖上排列的位置,然後找到放置gps位置的位置用戶。我根據自己的需求量身定製了它,它工作得很好。 – 2013-03-14 17:16:05

+0

是的,對於這樣的小區域來說,這是非常不容易的。沒有考慮地球曲率,只有緯度與經度軸的比例不同。 – AlexWien 2013-03-14 17:29:13

回答

0

這兩種方法的解決方案我在SO上從其他一些帖子中提出。如果您的地圖的左上角和右下角有一個左上角的GPS座標和右下角的GPS座標,則使用這兩種方法可以確定在地圖上繪製第三個GPS座標的位置。這些將與您的左上角和右下角的GPS座標一樣敏捷。然後使用畫布在位圖上繪製第三點。

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; 
} 
1

您需要在地圖上標識它們的緯度/經度座標上的3個點。然後使用Helmert轉換。
在這裏,有一些「Helmert」轉換的帖子。