index.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. var D2R = 0.01745329251994329577;
  2. import parser from './parser';
  3. import {sExpr} from './process';
  4. function rename(obj, params) {
  5. var outName = params[0];
  6. var inName = params[1];
  7. if (!(outName in obj) && (inName in obj)) {
  8. obj[outName] = obj[inName];
  9. if (params.length === 3) {
  10. obj[outName] = params[2](obj[outName]);
  11. }
  12. }
  13. }
  14. function d2r(input) {
  15. return input * D2R;
  16. }
  17. function cleanWKT(wkt) {
  18. if (wkt.type === 'GEOGCS') {
  19. wkt.projName = 'longlat';
  20. } else if (wkt.type === 'LOCAL_CS') {
  21. wkt.projName = 'identity';
  22. wkt.local = true;
  23. } else {
  24. if (typeof wkt.PROJECTION === 'object') {
  25. wkt.projName = Object.keys(wkt.PROJECTION)[0];
  26. } else {
  27. wkt.projName = wkt.PROJECTION;
  28. }
  29. }
  30. if (wkt.AXIS) {
  31. var axisOrder = '';
  32. for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) {
  33. var axis = [wkt.AXIS[i][0].toLowerCase(), wkt.AXIS[i][1].toLowerCase()];
  34. if (axis[0].indexOf('north') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'north')) {
  35. axisOrder += 'n';
  36. } else if (axis[0].indexOf('south') !== -1 || ((axis[0] === 'y' || axis[0] === 'lat') && axis[1] === 'south')) {
  37. axisOrder += 's';
  38. } else if (axis[0].indexOf('east') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'east')) {
  39. axisOrder += 'e';
  40. } else if (axis[0].indexOf('west') !== -1 || ((axis[0] === 'x' || axis[0] === 'lon') && axis[1] === 'west')) {
  41. axisOrder += 'w';
  42. }
  43. }
  44. if (axisOrder.length === 2) {
  45. axisOrder += 'u';
  46. }
  47. if (axisOrder.length === 3) {
  48. wkt.axis = axisOrder;
  49. }
  50. }
  51. if (wkt.UNIT) {
  52. wkt.units = wkt.UNIT.name.toLowerCase();
  53. if (wkt.units === 'metre') {
  54. wkt.units = 'meter';
  55. }
  56. if (wkt.UNIT.convert) {
  57. if (wkt.type === 'GEOGCS') {
  58. if (wkt.DATUM && wkt.DATUM.SPHEROID) {
  59. wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a;
  60. }
  61. } else {
  62. wkt.to_meter = wkt.UNIT.convert;
  63. }
  64. }
  65. }
  66. var geogcs = wkt.GEOGCS;
  67. if (wkt.type === 'GEOGCS') {
  68. geogcs = wkt;
  69. }
  70. if (geogcs) {
  71. //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){
  72. // wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R;
  73. //}
  74. if (geogcs.DATUM) {
  75. wkt.datumCode = geogcs.DATUM.name.toLowerCase();
  76. } else {
  77. wkt.datumCode = geogcs.name.toLowerCase();
  78. }
  79. if (wkt.datumCode.slice(0, 2) === 'd_') {
  80. wkt.datumCode = wkt.datumCode.slice(2);
  81. }
  82. if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') {
  83. wkt.datumCode = 'nzgd49';
  84. }
  85. if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') {
  86. if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') {
  87. wkt.sphere = true;
  88. }
  89. wkt.datumCode = 'wgs84';
  90. }
  91. if (wkt.datumCode.slice(-6) === '_ferro') {
  92. wkt.datumCode = wkt.datumCode.slice(0, - 6);
  93. }
  94. if (wkt.datumCode.slice(-8) === '_jakarta') {
  95. wkt.datumCode = wkt.datumCode.slice(0, - 8);
  96. }
  97. if (~wkt.datumCode.indexOf('belge')) {
  98. wkt.datumCode = 'rnb72';
  99. }
  100. if (geogcs.DATUM && geogcs.DATUM.SPHEROID) {
  101. wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk');
  102. if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') {
  103. wkt.ellps = 'intl';
  104. }
  105. wkt.a = geogcs.DATUM.SPHEROID.a;
  106. wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10);
  107. }
  108. if (geogcs.DATUM && geogcs.DATUM.TOWGS84) {
  109. wkt.datum_params = geogcs.DATUM.TOWGS84;
  110. }
  111. if (~wkt.datumCode.indexOf('osgb_1936')) {
  112. wkt.datumCode = 'osgb36';
  113. }
  114. if (~wkt.datumCode.indexOf('osni_1952')) {
  115. wkt.datumCode = 'osni52';
  116. }
  117. if (~wkt.datumCode.indexOf('tm65')
  118. || ~wkt.datumCode.indexOf('geodetic_datum_of_1965')) {
  119. wkt.datumCode = 'ire65';
  120. }
  121. if (wkt.datumCode === 'ch1903+') {
  122. wkt.datumCode = 'ch1903';
  123. }
  124. if (~wkt.datumCode.indexOf('israel')) {
  125. wkt.datumCode = 'isr93';
  126. }
  127. }
  128. if (wkt.b && !isFinite(wkt.b)) {
  129. wkt.b = wkt.a;
  130. }
  131. function toMeter(input) {
  132. var ratio = wkt.to_meter || 1;
  133. return input * ratio;
  134. }
  135. var renamer = function(a) {
  136. return rename(wkt, a);
  137. };
  138. var list = [
  139. ['standard_parallel_1', 'Standard_Parallel_1'],
  140. ['standard_parallel_1', 'Latitude of 1st standard parallel'],
  141. ['standard_parallel_2', 'Standard_Parallel_2'],
  142. ['standard_parallel_2', 'Latitude of 2nd standard parallel'],
  143. ['false_easting', 'False_Easting'],
  144. ['false_easting', 'False easting'],
  145. ['false-easting', 'Easting at false origin'],
  146. ['false_northing', 'False_Northing'],
  147. ['false_northing', 'False northing'],
  148. ['false_northing', 'Northing at false origin'],
  149. ['central_meridian', 'Central_Meridian'],
  150. ['central_meridian', 'Longitude of natural origin'],
  151. ['central_meridian', 'Longitude of false origin'],
  152. ['latitude_of_origin', 'Latitude_Of_Origin'],
  153. ['latitude_of_origin', 'Central_Parallel'],
  154. ['latitude_of_origin', 'Latitude of natural origin'],
  155. ['latitude_of_origin', 'Latitude of false origin'],
  156. ['scale_factor', 'Scale_Factor'],
  157. ['k0', 'scale_factor'],
  158. ['latitude_of_center', 'Latitude_Of_Center'],
  159. ['latitude_of_center', 'Latitude_of_center'],
  160. ['lat0', 'latitude_of_center', d2r],
  161. ['longitude_of_center', 'Longitude_Of_Center'],
  162. ['longitude_of_center', 'Longitude_of_center'],
  163. ['longc', 'longitude_of_center', d2r],
  164. ['x0', 'false_easting', toMeter],
  165. ['y0', 'false_northing', toMeter],
  166. ['long0', 'central_meridian', d2r],
  167. ['lat0', 'latitude_of_origin', d2r],
  168. ['lat0', 'standard_parallel_1', d2r],
  169. ['lat1', 'standard_parallel_1', d2r],
  170. ['lat2', 'standard_parallel_2', d2r],
  171. ['azimuth', 'Azimuth'],
  172. ['alpha', 'azimuth', d2r],
  173. ['srsCode', 'name']
  174. ];
  175. list.forEach(renamer);
  176. if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) {
  177. wkt.long0 = wkt.longc;
  178. }
  179. if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) {
  180. wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90);
  181. wkt.lat_ts = wkt.lat1;
  182. } else if (!wkt.lat_ts && wkt.lat0 && wkt.projName === 'Polar_Stereographic') {
  183. wkt.lat_ts = wkt.lat0;
  184. wkt.lat0 = d2r(wkt.lat0 > 0 ? 90 : -90);
  185. }
  186. }
  187. export default function(wkt) {
  188. var lisp = parser(wkt);
  189. var type = lisp.shift();
  190. var name = lisp.shift();
  191. lisp.unshift(['name', name]);
  192. lisp.unshift(['type', type]);
  193. var obj = {};
  194. sExpr(lisp, obj);
  195. cleanWKT(obj);
  196. return obj;
  197. }