Java issue with Lat/Long and distance
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.
精彩评论