Проблема Java с широтой/долготой и расстоянием

Я пытаюсь заставить часть кода работать (аналогично тому, что у меня ниже), чтобы OBJECT_LOC и CONVERTED_LOC были точно такими же. Я думал, что код довольно прост для того, что я делал, но по какой-то причине они не совпадают? Что я делаю неправильно? (Вы можете увидеть вывод ниже).

import com.bbn.openmap.LatLonPoint;
import com.bbn.openmap.proj.Length;
import com.bbn.openmap.proj.coords.DMSLatLonPoint;

public class Test {

       /**
        * @param args
        */
       public static void main(String[] args) {

               // 45:20:00.0N/24:00:00.0E
               LatLonPoint BASE_LOC = new DMSLatLonPoint(false, 45, 20, 00.0f, false,
                               24, 00, 00.0f).getLatLonPoint();

               System.out.println("BASE_LOC: " + BASE_LOC);

               LatLonPoint OBJECT_LOC = new LatLonPoint(52.749355, 26.346556);

               System.out.println("OBJECT_LOC: " + OBJECT_LOC);

               float distanceX = BASE_LOC.distance(new LatLonPoint(BASE_LOC
                               .getLatitude(), OBJECT_LOC.getLongitude()));

               float distanceY = BASE_LOC.distance(new LatLonPoint(OBJECT_LOC
                               .getLatitude(), BASE_LOC.getLongitude()));


               LatLonPoint CONVERTED_POINT = new LatLonPoint(BASE_LOC.getLatitude()
                               + Length.DECIMAL_DEGREE.fromRadians(distanceY),
                               BASE_LOC.getLongitude()
                                               + Length.DECIMAL_DEGREE.fromRadians(distanceX));

               System.out.println("CONVERTED_POINT " + CONVERTED_POINT);

       }
}

Выход:

BASE_LOC: LatLonPoint[lat=45.333332,lon=24.0]
OBJECT_LOC: LatLonPoint[lat=52.749355,lon=26.346556]
CONVERTED_POINT LatLonPoint[lat=52.749355,lon=25.649527]

person mainstringargs    schedule 06.10.2011    source источник


Ответы (2)


После просмотра документов API и некоторой литературы по географии кажется, что ваш метод определения второго пункта ошибочен. Правильный способ сделать это - использовать расстояние и пеленг (азимут). Ниже приведен исправленный код:

import com.bbn.openmap.LatLonPoint;
import com.bbn.openmap.proj.coords.DMSLatLonPoint;

public class TestProgram {

   /**
    * @param args
    */
   public static void main(String[] args) {

           // 45:20:00.0N/24:00:00.0E
           LatLonPoint BASE_LOC = new DMSLatLonPoint(false, 45, 20, 00.0f, false, 24, 00, 00.0f).getLatLonPoint();
           System.out.println("BASE_LOC: " + BASE_LOC);

           LatLonPoint OBJECT_LOC = new LatLonPoint(52.749355, 26.0);
           System.out.println("OBJECT_LOC: " + OBJECT_LOC);

           float distance = BASE_LOC.distance(OBJECT_LOC);
           float az = BASE_LOC.azimuth(OBJECT_LOC);

           LatLonPoint CONVERTED_POINT = BASE_LOC.getPoint(distance, az);

           System.out.println("CONVERTED_POINT " + CONVERTED_POINT);

   }

}

Некоторая информация доступна здесь - http://www.movable-type.co.uk/scripts/latlong.html

person Puneet    schedule 07.10.2011

Как бы то ни было, когда вы выполняете вызовы BASE_LOC.distance(), вы переключаетесь между OBJECT_LOC/BASE_LOC в аргументах для двух расстояний. OBJECT_LOC/BASE_LOC в одном, BASE_LOC/OBJECT_LOC в другом.

person Marc B    schedule 06.10.2011
comment
Это специально. В первом вызове я установил BASE_LOC как широту, чтобы я мог получить только расстояние X от OBJECT_LOC. В следующем вызове я установил BASE_LOC как долготу, поэтому я могу получить только расстояние y от OBJECT_LOC - person mainstringargs; 07.10.2011