You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现:保持中心不变将矩形对角线加倍后计算新地理顶点坐标

解决中心不变的地理矩形对角线加倍问题

我来帮你搞定这个地理矩形扩展的问题~ 核心思路是保持矩形中心坐标不变,把每个顶点相对于中心的偏移量加倍,这样对角线长度自然就变成原来的两倍了。

思路分析

因为要维持中心位置不变,对角线加倍本质上就是让每个顶点到中心的距离变为原来的2倍。对于任意原顶点坐标(lat, lon),新顶点坐标可以通过这个简单公式计算:
新纬度 = 2 * 原纬度 - 中心纬度
新经度 = 2 * 原经度 - 中心经度

这个公式的推导很直观:假设中心坐标是(C_lat, C_lon),原顶点到中心的偏移量是(lat - C_lat, lon - C_lon),加倍偏移量后,新顶点就是(C_lat + 2*(lat - C_lat), C_lon + 2*(lon - C_lon)),化简后就是上面的公式。

手动计算新矩形顶点坐标

首先计算原矩形的中心坐标:

  • 中心纬度:(54.2749558 + 54.4472187) / 2 = 54.36108725
  • 中心经度:(18.4287748 + 18.9512795) / 2 = 18.69002715

然后根据公式计算四个新顶点:

  • 新顶点1(对应原(54.2749558,18.4287748)):(54.18882435, 18.16752245)
  • 新顶点2(对应原(54.2749558,18.9512795)):(54.18882435, 19.21253185)
  • 新顶点3(对应原(54.4472187,18.9512795)):(54.53335015, 19.21253185)
  • 新顶点4(对应原(54.4472187,18.4287748)):(54.53335015, 18.16752245)

如果只需要新的对角点,取顶点1和顶点3即可,它们的对角线长度就是原来的2倍(78km)。

Java实现算法

下面是基于这个思路编写的Java代码,包含完整的坐标计算逻辑和测试主方法:

public class GeoRectangleExpander {
    // 封装经纬度的辅助类
    static class Coordinate {
        double latitude;
        double longitude;

        public Coordinate(double latitude, double longitude) {
            this.latitude = latitude;
            this.longitude = longitude;
        }

        @Override
        public String toString() {
            return String.format("(%.8f, %.8f)", latitude, longitude);
        }
    }

    // 计算原矩形的中心坐标
    private static Coordinate calculateCenter(Coordinate point1, Coordinate point2) {
        double centerLat = (point1.latitude + point2.latitude) / 2;
        double centerLon = (point1.longitude + point2.longitude) / 2;
        return new Coordinate(centerLat, centerLon);
    }

    // 扩展矩形,返回新的四个顶点数组
    private static Coordinate[] expandRectangle(Coordinate point1, Coordinate point2) {
        Coordinate center = calculateCenter(point1, point2);

        // 先获取原矩形的四个顶点
        Coordinate originalA = point1;
        Coordinate originalB = new Coordinate(point1.latitude, point2.longitude);
        Coordinate originalC = point2;
        Coordinate originalD = new Coordinate(point2.latitude, point1.longitude);

        // 计算偏移加倍后的新顶点
        Coordinate newA = new Coordinate(2 * originalA.latitude - center.latitude, 2 * originalA.longitude - center.longitude);
        Coordinate newB = new Coordinate(2 * originalB.latitude - center.latitude, 2 * originalB.longitude - center.longitude);
        Coordinate newC = new Coordinate(2 * originalC.latitude - center.latitude, 2 * originalC.longitude - center.longitude);
        Coordinate newD = new Coordinate(2 * originalD.latitude - center.latitude, 2 * originalD.longitude - center.longitude);

        return new Coordinate[]{newA, newB, newC, newD};
    }

    public static void main(String[] args) {
        // 原矩形的两个对角点
        Coordinate point1 = new Coordinate(54.2749558, 18.4287748);
        Coordinate point2 = new Coordinate(54.4472187, 18.9512795);

        // 获取扩展后的所有顶点
        Coordinate[] expandedVertices = expandRectangle(point1, point2);

        // 输出结果
        System.out.println("扩展后的矩形四个顶点坐标:");
        for (int i = 0; i < expandedVertices.length; i++) {
            System.out.printf("顶点%d: %s%n", i+1, expandedVertices[i]);
        }

        // 单独输出新的对角点(对应原对角线的扩展)
        System.out.println("\n新的对角点(对角线长度78km):");
        System.out.println("点1: " + expandedVertices[0]);
        System.out.println("点2: " + expandedVertices[2]);
    }
}

代码说明

  • Coordinate类用来封装纬度和经度,方便数据传递和格式化输出;
  • calculateCenter方法负责计算原矩形的中心坐标;
  • expandRectangle方法先推导原矩形的四个顶点,再通过偏移加倍的方式计算新顶点;
  • 主方法中使用给定的原坐标进行测试,输出所有新顶点和对应的对角点。

内容的提问来源于stack exchange,提问作者doublemc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:10:47