2012-02-26 10 views
6

Я работаю над Android-приложением, которое использует Geopoints, и я хочу определить Geopoint от другого Geopoint, расстояния (в любом формате) и полярного угла. Например, я хочу получить координаты места в 100 метрах на северо-северо-востоке (22,5 град.) Моего местоположения, полученные GPS в моем телефоне.Определите геометрию от другого, расстояние и полярный угол

Единственный метод, который я нашел, - Location.distanceBetween(...).

ответ

1

Посмотрите на большом круг формулах: http://en.wikipedia.org/wiki/Great-circle_distance

Это должно дать вам несколько советов о том, как рассчитать расстояние.

Для точки в заданном расстоянии и заголовок, проверить http://williams.best.vwh.net/avform.htm#LL Эти формулы выглядят довольно сложно, но легко осуществить;)

+0

Вы реализовали это? Не могли бы вы поделиться с нами кодом? :) – knagode

+0

Я реализовал это для проекта на работе. Поэтому я сожалею, что не могу поделиться этим кодом. – Black

+0

Я уже поделился своим кодом ниже ... Надеюсь, это сэкономит некоторое время другим пользователям;) – knagode

3

Реализация для Android. Этот код отлично подходит для модульного тестирования в ваших приложениях:

public double radiansFromDegrees(double degrees) 
{ 
    return degrees * (Math.PI/180.0); 
} 

public double degreesFromRadians(double radians) 
{ 
    return radians * (180.0/Math.PI); 
} 

public Location locationFromLocation(Location fromLocation, double distance, double bearingDegrees) 
{ 
    double distanceKm = distance/1000.0; 
    double distanceRadians = distanceKm/6371.0; 
    //6,371 = Earth's radius in km 
    double bearingRadians = this.radiansFromDegrees(bearingDegrees); 
    double fromLatRadians = this.radiansFromDegrees(fromLocation.getLatitude()); 
    double fromLonRadians = this.radiansFromDegrees(fromLocation.getLongitude()); 

    double toLatRadians = Math.asin(Math.sin(fromLatRadians) * Math.cos(distanceRadians) 
           + Math.cos(fromLatRadians) * Math.sin(distanceRadians) * Math.cos(bearingRadians)); 

    double toLonRadians = fromLonRadians + Math.atan2(Math.sin(bearingRadians) 
               * Math.sin(distanceRadians) * Math.cos(fromLatRadians), Math.cos(distanceRadians) 
               - Math.sin(fromLatRadians) * Math.sin(toLatRadians)); 

    // adjust toLonRadians to be in the range -180 to +180... 
    toLonRadians = ((toLonRadians + 3*Math.PI) % (2*Math.PI)) - Math.PI; 

    Location result = new Location(LocationManager.GPS_PROVIDER); 
    result.setLatitude(this.degreesFromRadians(toLatRadians)); 
    result.setLongitude(this.degreesFromRadians(toLonRadians)); 
    return result; 
} 
+2

Это должен быть принятый ответ – Snake