开发者

Java issue with Lat/Long and distance

开发者 https://www.devze.com 2023-04-11 21:01 出处:网络
I am trying to get a portion of code to work (similar to what I have below), so that OBJECT_LOC and CONVERTED_LOC are exactly the same.I thought the code was pretty straightforward with what I was doi

I am trying to get a portion of code to work (similar to what I have below), so that OBJECT_LOC and CONVERTED_LOC are exactly the same. I thought the code was pretty straightforward with what I was doing, but for some reason they don't come out equal? What am I doing wrong? (You can see output below).

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);

       }
}

Output:

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]


After looking at the API docs and some literature on geography it looks like your method of finding out the second point is flawed. The right way to do it is using the distance and the bearing(azimuth). Following is the corrected code:

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);

   }

}

Some information is available here - http://www.movable-type.co.uk/scripts/latlong.html


For what it's worth, when you're doing your BASE_LOC.distance() calls, you're swapping between OBJECT_LOC/BASE_LOC in the arguments for the two distances. OBJECT_LOC/BASE_LOC in one, BASE_LOC/OBJECT_LOC in the other.

0

精彩评论

暂无评论...
验证码 换一张
取 消