From 7f6661cca40e3530111d628222fa25462022ec78 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期四, 04 九月 2025 18:25:36 +0800 Subject: [PATCH] 2025.9.4 --- src/utils/map/calculate.js | 37 ++++++++++++++++++++++++++++++++++++- 1 files changed, 36 insertions(+), 1 deletions(-) diff --git a/src/utils/map/calculate.js b/src/utils/map/calculate.js index 01ffd8d..152837c 100644 --- a/src/utils/map/calculate.js +++ b/src/utils/map/calculate.js @@ -286,5 +286,40 @@ gcj02towgs84, //浠嶨PS杞珮寰� - wgs84_To_Gcj02 + wgs84_To_Gcj02, + + /** + * 璁$畻涓�缁勭粡绾害鍧愭爣鐨勪腑蹇冪偣 + * @param {Array} coordinates - 缁忕含搴︽暟缁勶紝鏍煎紡: [{lng: number, lat: number}, ...] + * @returns {Object} 涓績鐐瑰潗鏍� {lng: number, lat: number} + */ + calculateCenterCoordinates(coordinates) { + if (coordinates.length === 0) return { lng: 0, lat: 0 }; + if (coordinates.length === 1) return coordinates[0]; + + let x = 0, + y = 0, + z = 0; + coordinates.forEach((p) => { + const lng = (p.lng * Math.PI) / 180; // 缁忓害杞姬搴� + const lat = (p.lat * Math.PI) / 180; // 绾害杞姬搴� + + // 杞崲涓轰笁缁村潗鏍� + x += Math.cos(lat) * Math.cos(lng); + y += Math.cos(lat) * Math.sin(lng); + z += Math.sin(lat); + }); + + // 鍙栧钩鍧囧�� + const avgX = x / coordinates.length; + const avgY = y / coordinates.length; + const avgZ = z / coordinates.length; + + // 杞崲鍥炵粡绾害 + const lng = (Math.atan2(avgY, avgX) * 180) / Math.PI; + const hypotenuse = Math.sqrt(avgX ** 2 + avgY ** 2); + const lat = (Math.atan2(avgZ, hypotenuse) * 180) / Math.PI; + + return { lng, lat }; + } }; -- Gitblit v1.9.3