projString.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import {D2R} from './constants/values';
  2. import PrimeMeridian from './constants/PrimeMeridian';
  3. import units from './constants/units';
  4. import match from './match';
  5. export default function(defData) {
  6. var self = {};
  7. var paramObj = defData.split('+').map(function(v) {
  8. return v.trim();
  9. }).filter(function(a) {
  10. return a;
  11. }).reduce(function(p, a) {
  12. var split = a.split('=');
  13. split.push(true);
  14. p[split[0].toLowerCase()] = split[1];
  15. return p;
  16. }, {});
  17. var paramName, paramVal, paramOutname;
  18. var params = {
  19. proj: 'projName',
  20. datum: 'datumCode',
  21. rf: function(v) {
  22. self.rf = parseFloat(v);
  23. },
  24. lat_0: function(v) {
  25. self.lat0 = v * D2R;
  26. },
  27. lat_1: function(v) {
  28. self.lat1 = v * D2R;
  29. },
  30. lat_2: function(v) {
  31. self.lat2 = v * D2R;
  32. },
  33. lat_ts: function(v) {
  34. self.lat_ts = v * D2R;
  35. },
  36. lon_0: function(v) {
  37. self.long0 = v * D2R;
  38. },
  39. lon_1: function(v) {
  40. self.long1 = v * D2R;
  41. },
  42. lon_2: function(v) {
  43. self.long2 = v * D2R;
  44. },
  45. alpha: function(v) {
  46. self.alpha = parseFloat(v) * D2R;
  47. },
  48. gamma: function(v) {
  49. self.rectified_grid_angle = parseFloat(v);
  50. },
  51. lonc: function(v) {
  52. self.longc = v * D2R;
  53. },
  54. x_0: function(v) {
  55. self.x0 = parseFloat(v);
  56. },
  57. y_0: function(v) {
  58. self.y0 = parseFloat(v);
  59. },
  60. k_0: function(v) {
  61. self.k0 = parseFloat(v);
  62. },
  63. k: function(v) {
  64. self.k0 = parseFloat(v);
  65. },
  66. a: function(v) {
  67. self.a = parseFloat(v);
  68. },
  69. b: function(v) {
  70. self.b = parseFloat(v);
  71. },
  72. r_a: function() {
  73. self.R_A = true;
  74. },
  75. zone: function(v) {
  76. self.zone = parseInt(v, 10);
  77. },
  78. south: function() {
  79. self.utmSouth = true;
  80. },
  81. towgs84: function(v) {
  82. self.datum_params = v.split(",").map(function(a) {
  83. return parseFloat(a);
  84. });
  85. },
  86. to_meter: function(v) {
  87. self.to_meter = parseFloat(v);
  88. },
  89. units: function(v) {
  90. self.units = v;
  91. var unit = match(units, v);
  92. if (unit) {
  93. self.to_meter = unit.to_meter;
  94. }
  95. },
  96. from_greenwich: function(v) {
  97. self.from_greenwich = v * D2R;
  98. },
  99. pm: function(v) {
  100. var pm = match(PrimeMeridian, v);
  101. self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R;
  102. },
  103. nadgrids: function(v) {
  104. if (v === '@null') {
  105. self.datumCode = 'none';
  106. }
  107. else {
  108. self.nadgrids = v;
  109. }
  110. },
  111. axis: function(v) {
  112. var legalAxis = "ewnsud";
  113. if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) {
  114. self.axis = v;
  115. }
  116. },
  117. approx: function() {
  118. self.approx = true;
  119. }
  120. };
  121. for (paramName in paramObj) {
  122. paramVal = paramObj[paramName];
  123. if (paramName in params) {
  124. paramOutname = params[paramName];
  125. if (typeof paramOutname === 'function') {
  126. paramOutname(paramVal);
  127. }
  128. else {
  129. self[paramOutname] = paramVal;
  130. }
  131. }
  132. else {
  133. self[paramName] = paramVal;
  134. }
  135. }
  136. if(typeof self.datumCode === 'string' && self.datumCode !== "WGS84"){
  137. self.datumCode = self.datumCode.toLowerCase();
  138. }
  139. return self;
  140. }