使用GeoPoint位置和米X / Y,如何计算经度/纬度?

时间:2013-12-02 21:09:17

标签: android google-maps gps

我有一个我一直在玩的小项目(Android,GPS,地图API),我需要知道如何从给定的经度/纬度/ GeoPoint中找到经度/纬度/ GeoPoint,只知道米/ km经度和纬度。例如我想知道一个点来自我的位置,我知道沿着经度+1000米,沿纬度+1000。

它与您将看到的通常的GeoPoint /距离问题略有不同,并且它与地理围栏半径不太相关,因为距离为X,Y米/公里,而且我没有任何影响。 (我可以算出轴承,但我没有合适的直接距离)

基本上,如果我可以撤销GeoPoint.distanceTo(),它就可以帮我完成工作。

更新

再多一点背景。我基本上应用了一个节点三角测量的想法,但算法要求我的输入采用与经度和纬度不同的地图规范化形式。我创建了一个地图/网格,其中0,0(底部/左侧)是我正在使用的节点的左/西和底部/南部最经度/纬度值。地图上的所有其他节点X / Y都是通过使用GeoPoint.distanceTo()从0,0节点的经度/纬度中找到它们的米来确定的。 (注意我通过对每个节点执行distanceTo两次来找到他们的X / Y,所以我有0,0的X和Y米,而不是到节点的直接线)以米为单位的距离被输入到算法中并且新的X /生成Y个地图点。

所以我需要弄清楚如何将经度/纬度的距离转换为另一个,以前未知的经度/纬度。

double startPointLongitude = 23.459821;
double startPointLatitude = 76.998200;
double distanceLongitude = 100; // 100 meters along the longitude
double distanceLatitude = 75; // 75 meters along the latitude

3 个答案:

答案 0 :(得分:1)

基本上我接受了AlexWien的回答,纠正了两件事并将其变成了一种java方法

private static final double WGS84_RADIUS = 6370997.0;
private static double EarthCircumFence = 2* WGS84_RADIUS * Math.PI;

private static Position getPosition(Position sourcePosition, double mEastWest, double mNorthSouth){
    double degreesPerMeterForLat = EarthCircumFence/360.0;
    double shrinkFactor = Math.cos((sourcePosition.getLat()*Math.PI/180));
    double degreesPerMeterForLon = degreesPerMeterForLat * shrinkFactor;
    double newLat = sourcePosition.getLat() + mNorthSouth * (1/degreesPerMeterForLat);
    double newLng = sourcePosition.getLng() + mEastWest * (1/degreesPerMeterForLon);
    return new Position(newLat, newLng);
}   

答案 1 :(得分:0)

两个纬度之间的距离永远不会改变,它始终是aprox。 111公里 (使用WGS84地球半径计算的确切值:

 EarthCircumFence = 2* WGS84_RADIUS * Math.Pi;

meterPerDegree =(Earth Cirumfence / 360)

使用此信息,您可以轻松计算纬度偏移, 只需扭转因素并具有:

degreesPerMeterForLat = EarthCircumfenceMeter / 360.0
经度有点不同,两度经度之间的距离缩小 你越远离aequator。

shrinkFactor = cos(toRadians(locationLatitude));

现在补偿:

degreesPerMeterForLon = degreesPerMeterForLat / shrinkFactor;

最后

newLatPos = latOld + numMeters * degreesPerMeterForLat;
newLonPos = lonOld + numMeters * degreesPerMeterForLon;

这适用于距离偏移< 10 - 50 km

答案 2 :(得分:0)

叹了口气,我在6个小时前发布了此内容,但似乎没有通过。

好的,尽管大多数地理公式和事实偶尔会超出我的想象,但仍然可以解决这个问题。使用地理就像使用公历一样,如果你一直为它编程,这是有道理的,但是否则很容易被错误的假设弄糊涂。

以下情况除了我的应用程序将采用起始GeoPoint的long / lat

   /**
    * the length of one degree of latitude (and one degree of longitude at equator) in meters.
    */
   private static final double DEGREE_DISTANCE_AT_EQUATOR = 111329;


   /**
    * calculates the x,y in meters from a given starting point's long0, lat0 to a target destination point's long1, lat1.
    * @param long0 start point longitude
    * @param lat0 start point latitude
    * @param long1 end point longitude
    * @param lat1 end point latitude
    * @return
    */
   public static Pair<Double, Double> xyFromLongLat(int long0, int lat0, int long1, int lat1) {
    double x = (long1 / 1E6 - long0 / 1E6) * longitudeDistanceAtLatitude(lat0 / 1E6);
    double y = (lat1 / 1E6 - lat0 / 1E6) * DEGREE_DISTANCE_AT_EQUATOR;
    return new Pair<Double, Double>(x, y);
   }

   /**
    * calculates longitude and latitude from a given starting point, with only the X/Y meters 
    * @param long0
    * @param lat0
    * @param x
    * @param y
    * @return
    */
   public static Pair<Double, Double> longLatFromXY(int long0, int lat0, double x, double y) {
        double lat1 = (y / DEGREE_DISTANCE_AT_EQUATOR) + (lat0 / 1E6);
        double long1 = x / longitudeDistanceAtLatitude(lat0) + (long0 / 1E6);
        return new Pair<Double, Double>(lat1, long1);
   }