const fs = require("fs"); const request = require("request"); const path = require("path"); module.exports = { delay(seconds = 1, callback) { let promise = new Promise((resolve, reject) => { setTimeout(() => { if (callback) { callback(); } resolve(true); }, seconds * 1000); }); return promise; }, mkdirsSync(dirname) { if (fs.existsSync(dirname)) { return true; } else { if (this.mkdirsSync(path.dirname(dirname))) { fs.mkdirSync(dirname); return true; } } }, isExist(path) { let promise = new Promise((resolve, reject) => { fs.access(path, function (err) { if (err && err.code == "ENOENT") { resolve(false); } resolve(true); }); }); return promise; }, /** * 计算两个地理坐标点之间的距离(Haversine公式) * @param {number} lat1 起点纬度 * @param {number} lng1 起点经度 * @param {number} lat2 终点纬度 * @param {number} lng2 终点经度 * @returns {number|null} 距离(公里),如果坐标无效则返回null */ calculateDistance(lat1, lng1, lat2, lng2) { // 验证坐标参数 if (!lat1 || !lng1 || !lat2 || !lng2 || isNaN(lat1) || isNaN(lng1) || isNaN(lat2) || isNaN(lng2)) { return null; } const R = 6371; // 地球半径(公里) const dLat = (lat2 - lat1) * Math.PI / 180; const dLng = (lng2 - lng1) * Math.PI / 180; const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) * Math.sin(dLng / 2) * Math.sin(dLng / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); const distance = R * c; // 保留两位小数 return Math.round(distance * 100) / 100; }, };