Dim*_*mme 7 java math coordinates
我在现实生活中有以下项目设置:

雷达是静态的,这意味着它始终具有相同的位置.该A-Item可以移动,它的位置可以不管.从雷达我可以读取与雷达相关的坐标x和y坐标A.我编写了以下类来描述每个项目的位置:
public class Position {
public enum Direction {
EAST, WEST, NORTH, SOUTH
};
public final Direction latitudeDirection, longitudeDirection;
public final float latitude, longitude, altitude;
public Position(Direction latitudeDirection, Direction longitudeDirection,
float latitude, float longitude, float altitude) {
this.latitudeDirection = latitudeDirection;
this.longitudeDirection = longitudeDirection;
this.latitude = latitude;
this.longitude = longitude;
this.altitude = altitude;
}
public Position(float radarX, float radarY) {
// TODO: Implement the question here
this.altitude = Config.RADAR_POSITION.altitude;
}
}
class Config {
// Position of the radar
public static final Position RADAR_POSITION = new Position(
Position.Direction.NORTH, // Latitude direction
Position.Direction.EAST, // Longitude direction
55.0f, // Latitude
13.0f, // Longitude
60.0f); // Altitude
// Facing direction of the radar in degrees. 0° is north, advancing
// clockwise.
public static final float RADAR_FACING_DIRECTION = 10.0f;
}
Run Code Online (Sandbox Code Playgroud)
现在,鉴于雷达的地理坐标,x以及y坐标A相对于雷达和相对于北方雷达的面对方向,我怎么可以计算的绝对地理坐标A?
地球的曲率不是问题,因为最大值x和/或y不能超过几百米.
我认为应该可以这样做:将x和y坐标转换为极坐标r和theta,(以雷达为原点)。减去雷达的旋转,然后转换回笛卡尔坐标。然后您只需转换为纬度和经度并添加雷达的坐标即可。
double r = Math.hypot(radarX, radarY);
double theta = Math.atan2(radarY, radarX);
theta -= Math.toRadians(Config.RADAR_FACING_DIRECTION);
float x = (float) r * Math.cos(theta);
float y = (float) r * Math.sin(theta);
longitude = metersToLongitude(Config.RADAR_POSITION, y) + Config.RADAR_POSITION.longitude;
latitude = metersToLatitude(Config.RADAR_POSITION, x) + Config.RADAR_POSITION.latitude;
Run Code Online (Sandbox Code Playgroud)
我在维基百科上找到了纬度和经度长度的公式。纬度在任何地方都是相同的,但经度在两极附近会变小。
static float metersToLatitude(Position near, float meters) {
return meters / 110.6*1000;
}
static float metersToLongitude(Position near, float meters) {
float lat = Math.toRadians(near.latitude);
return meters /
(111132.954 - 559.822 * Math.cos(2*lat) + 1.175 * Math.cos(4*lat));
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不起作用,我不明白为什么。
如果您想以东/西/北/南正度数表示坐标,您还必须检查它们是否为负值,并在这种情况下反转它们和方向。