Utils.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. 205.395583333332 = 205°23'44.1"
  3. 1,直接读取"度":205
  4. 2,(205.395583333332-205)*60=23.734999999920 得到"分":23
  5. 3,(23.734999999920-23)*60=44.099999995200 得到"秒":44.1
  6. return string,
  7. */
  8. export function latLngDecimalToDegrees(decimal: number): string {
  9. let absDecimal = Math.abs(decimal);
  10. let isNegative = Math.abs(decimal) != decimal;
  11. let d = Math.floor(absDecimal); //度
  12. let m = Math.floor((absDecimal - d) * 60); //分
  13. let s = Math.round((absDecimal - d) * 3600 % 60); //秒
  14. if(s == 60) {s = 0; m++}
  15. if(m == 60) {m = 0; d++}
  16. //d = ('000'+d).slice(-3); // left-pad with leading zeros
  17. const mm = ('00'+m).slice(-2); // left-pad with leading zeros
  18. const ss = ('00'+s).slice(-2);
  19. //if (s<10) s = '0' + s; // left-pad with leading zeros (note may include decimals)
  20. return (isNegative ? "-" : "") + d + '°' + mm + "′" + ss + '″';
  21. }
  22. /*
  23. Decimal Degrees = Degrees + minutes/60 + seconds/3600
  24. 例:57°55'56.6" =57+55/60+56.6/3600=57.9323888888888
  25. return Float or NaN
  26. */
  27. export function latLngDegreesToDecimal(degreesStr: string): number {
  28. let degreesArr = degreesStr.split("°");
  29. let degrees = parseInt(degreesArr[0]);
  30. let isNegative = Math.abs(degrees) != degrees;
  31. if (degreesArr.length == 1) {
  32. return degrees;
  33. } else if(!isSafeString(degreesArr[1])) {
  34. return degrees;
  35. }
  36. let minutesArr = degreesArr[1].split("′");
  37. let minutes = parseInt(minutesArr[0]);
  38. let min = parseFloat((isNegative ? "-" : "") + (Math.abs(degrees) + Math.abs(minutes) / 60));
  39. if (minutesArr.length == 1) {
  40. return min;
  41. } else if(!isSafeString(minutesArr[1])) {
  42. return min;
  43. }
  44. let secondsStr = minutesArr[1];
  45. let secondsArr = secondsStr.split('″');
  46. let seconds = parseFloat(secondsArr[0]);
  47. return parseFloat((isNegative ? "-" : "") + (Math.abs(degrees) + Math.abs(minutes) / 60 + Math.abs(seconds) / 3600));
  48. }
  49. export function isObject(arg: any): boolean {
  50. return typeof arg === 'object' && arg !== null;
  51. }
  52. export function isUndefined(arg: any): boolean {
  53. return arg === void 0;
  54. }
  55. export function isString(arg: any): boolean {
  56. return typeof arg === 'string';
  57. }
  58. export function isSafeString(arg: any): boolean {
  59. if (isUndefined(arg)) {
  60. return false;
  61. }
  62. if (!isString(arg)) {
  63. return false;
  64. }
  65. if (arg.length == 0) {
  66. return false;
  67. }
  68. return true;
  69. }
  70. export function isNumber(arg: any): boolean {
  71. return typeof arg === 'number';
  72. }
  73. export function hasPoint(obj: any): boolean {
  74. return (isObject(obj)
  75. && isNumber(obj.lat)
  76. && isNumber(obj.lng));
  77. }