generatePath.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * 给经纬度数组增加 0~5cm 的随机偏移
  3. * @param {Array<Array<number>>} points [[lng, lat], ...]
  4. * @param {number} maxOffsetCm 最大偏移(厘米),默认 5cm
  5. * @returns {Array<Array<number>>}
  6. */
  7. export function offsetGeoPoints(points, maxOffsetCm = 5) {
  8. return points.map(([lng, lat]) => {
  9. // cm -> meter
  10. const maxOffsetMeter = maxOffsetCm / 100
  11. // 随机偏移(-max ~ +max)
  12. const offsetMeterLng = (Math.random() * 2 - 1) * maxOffsetMeter
  13. const offsetMeterLat = (Math.random() * 2 - 1) * maxOffsetMeter
  14. // 米 -> 度
  15. const latOffset = offsetMeterLat / 111320
  16. const lngOffset = offsetMeterLng / (111320 * Math.cos(lat * Math.PI / 180))
  17. return [
  18. lng + lngOffset,
  19. lat + latOffset
  20. ]
  21. })
  22. }
  23. /**
  24. * 经纬度数组转字符串
  25. * 输入格式:[[lng, lat], ...]
  26. * 输出格式:lat,lnglat,lng
  27. * @param {Array<Array<number>>} points
  28. * @param {number} fixed 保留小数位数(可选)
  29. * @returns {string}
  30. */
  31. export function geoPointsToString(points, fixed = 6) {
  32. return points
  33. .map(([lng, lat]) =>
  34. `${lat.toFixed(fixed)},${lng.toFixed(fixed)}`
  35. )
  36. .join('') + ''
  37. }
  38. /**
  39. * 将 startTime 加上指定秒数,返回同样格式的 endTime
  40. * @param {string} startTime - 格式: "YYYY-MM-DD HH:mm:ss"
  41. * @param {number} secondsToAdd - 要加的秒数
  42. * @returns {string} - 格式: "YYYY-MM-DD HH:mm:ss"
  43. */
  44. export function addSeconds(startTime, secondsToAdd) {
  45. const [datePart, timePart] = startTime.split(' ')
  46. let [year, month, day] = datePart.split('-').map(Number)
  47. let [hour, minute, second] = timePart.split(':').map(Number)
  48. // 转换成总秒数
  49. let totalSeconds = hour * 3600 + minute * 60 + second + secondsToAdd
  50. // 处理天数进位
  51. let extraDays = Math.floor(totalSeconds / 86400)
  52. totalSeconds %= 86400
  53. hour = Math.floor(totalSeconds / 3600)
  54. minute = Math.floor((totalSeconds % 3600) / 60)
  55. second = totalSeconds % 60
  56. // 处理日期进位
  57. const daysInMonth = (y, m) => new Date(y, m, 0).getDate()
  58. day += extraDays
  59. while (day > daysInMonth(year, month)) {
  60. day -= daysInMonth(year, month)
  61. month += 1
  62. if (month > 12) {
  63. month = 1
  64. year += 1
  65. }
  66. }
  67. const pad = (n) => n.toString().padStart(2, '0')
  68. return `${year}-${pad(month)}-${pad(day)} ${pad(hour)}:${pad(minute)}:${pad(second)}`
  69. }