从旧坐标和x和y计算新坐标

Dim*_*mme 7 java math coordinates

我在现实生活中有以下项目设置:

我的设置

雷达是静态的,这意味着它始终具有相同的位置.该A-Item可以移动,它的位置可以不管.从雷达我可以读取与雷达相关的坐标xy坐标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不能超过几百米.

Sam*_*ard 1

我认为应该可以这样做:将xy坐标转换为极坐标rtheta,(以雷达为原点)。减去雷达的旋转,然后转换回笛卡尔坐标。然后您只需转换为纬度和经度并添加雷达的坐标即可。

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)

不幸的是,这似乎不起作用,我不明白为什么。

如果您想以东/西/北/南正度数表示坐标,您还必须检查它们是否为负值,并在这种情况下反转它们和方向。