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
相关产品推荐
相关产品推荐

