2013-03-14 65 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”转换的帖子。

相关问题