Commit 23b2cd43 authored by ahocevar's avatar ahocevar
Browse files

Merge pull request #27 from calvinmetcalf/parse-better

improving the parsing methods in Proj.js
parents 8d1e7b53 95c89e4a
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -3,21 +3,21 @@ module.exports = function(grunt) {
		pkg: grunt.file.readJSON('package.json'),
		concat:{
			full:{
				src:[ './src/Proj4.js','./src/Proj.js','./src/defs.js','./src/common.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/defs/*.js','./src/util/MGRS.js'],
				src:[ './src/Proj4.js','./src/common.js','./src/Proj.js','./src/defs.js','src/defs/bigDefs.js','src/defs/smallDefs.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/util/MGRS.js'],
				dest:'./dist/proj4.js'
			},
			noDefs:{
				src:[ './src/Proj4.js','./src/Proj.js','./src/defs.js','./src/common.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/defs/GOOGLE.js'],
				src:[ './src/Proj4.js','./src/common.js','./src/Proj.js','./src/defs.js','src/defs/smallDefs.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/defs/GOOGLE.js'],
				dest:'./dist/proj4-noDefs.js'
			}
		},
		uglify:{
			full:{
				src:[ './src/Proj4.js','./src/Proj.js','./src/defs.js','./src/common.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/defs/*.js','./src/util/MGRS.js'],
				src:[ './src/Proj4.js','./src/common.js','./src/Proj.js','./src/defs.js','src/defs/bigDefs.js','src/defs/smallDefs.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/util/MGRS.js'],
				dest:'./dist/proj4.min.js'
			},
			noDefs:{
				src:[ './src/Proj4.js','./src/Proj.js','./src/defs.js','./src/common.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/defs/GOOGLE.js'],
				src:[ './src/Proj4.js','./src/common.js','./src/Proj.js','./src/defs.js','src/defs/smallDefs.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/defs/GOOGLE.js'],
				dest:'./dist/proj4-noDefs.min.js'
			}
		},
@@ -52,7 +52,7 @@ module.exports = function(grunt) {
          proj4: true
        }
			},
			before: [ './src/Proj4.js','./src/Proj.js','./src/defs.js','./src/common.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/defs/*.js','./src/util/MGRS.js'],
			before: [ './src/Proj4.js','./src/Proj.js','./src/defs.js','./src/common.js','./src/datum.js','./src/Point.js','./src/constants.js','./src/projCode/*.js','./src/util/MGRS.js'],
      after: [ './dist/proj4.js']
		}
	});
+1 −1
Original line number Diff line number Diff line
{
  "name": "proj4js",
  "version": "1.0.0",
  "version": "1.1.0",
  "description": "Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.",
  "main": "./dist/proj4.js",
  "directories": {
+4 −134
Original line number Diff line number Diff line
@@ -349,144 +349,14 @@ proj4.Proj = proj4.Class({
   *
   */
  parseDefs: function() {
    var re = new RegExp('(title|proj|units|datum|nadgrids|' + 'ellps|a|b|rf|' + 'lat_0|lat_1|lat_2|lat_ts|lon_0|lon_1|lon_2|alpha|lonc|' + 'x_0|y_0|k_0|k|r_a|zone|south|' + 'towgs84|to_meter|from_greenwich|pm|axis|czech|' + 'wktext|no_rot|no_off|no_defs)');
    this.defData = proj4.defs[this.srsCode];
    var paramName, paramVal;
    if (!this.defData) {
      return;
    }
    var paramArray = this.defData.split("+");

    for (var prop = 0; prop < paramArray.length; prop++) {
      var property = paramArray[prop].split("=");
      paramName = property[0].toLowerCase();
      paramVal = property[1];

      switch (paramName.replace(/\s/gi, "")) { // trim out spaces
      case "":
        break; // throw away nameless parameter
        // DGR 2012-10-13 : + in title (EPSG:2056: CH1903+ / LV95)
      case "title":
        this.title = paramVal;
        while (!paramArray[prop + 1].match(re)) {
          this.title += '+' + paramArray[++prop];
    var key;
    for(key in this.defData){
      this[key]=this.defData[key];
    }
        break;
      case "proj":
        this.projName = paramVal.replace(/\s/gi, "");
        break;
      case "units":
        this.units = paramVal.replace(/\s/gi, "");
        break;
      case "datum":
        this.datumCode = paramVal.replace(/\s/gi, "");
        break;
        // DGR 2011-03-20 : nagrids -> nadgrids
      case "nadgrids":
        this.nadgrids = paramVal.replace(/\s/gi, "");
        break; // DGR 2012-07-29
      case "ellps":
        this.ellps = paramVal.replace(/\s/gi, "");
        break;
      case "a":
        this.a = parseFloat(paramVal);
        break; // semi-major radius
      case "b":
        this.b = parseFloat(paramVal);
        break; // semi-minor radius
        // DGR 2007-11-20
      case "rf":
        this.rf = parseFloat(paramVal);
        break; // inverse flattening rf= a/(a-b)
      case "lat_0":
        this.lat0 = paramVal * proj4.common.D2R;
        break; // phi0, central latitude
      case "lat_1":
        this.lat1 = paramVal * proj4.common.D2R;
        break; //standard parallel 1
      case "lat_2":
        this.lat2 = paramVal * proj4.common.D2R;
        break; //standard parallel 2
      case "lat_ts":
        this.lat_ts = paramVal * proj4.common.D2R;
        break; // used in merc and eqc
      case "lon_0":
        this.long0 = paramVal * proj4.common.D2R;
        break; // lam0, central longitude
      case "lon_1":
        this.long1 = paramVal * proj4.common.D2R;
        break;
      case "lon_2":
        this.long2 = paramVal * proj4.common.D2R;
        break;
      case "no_rot":
        this.no_rot = true;
        break;
      case "no_off":
        this.no_off = true;
        break;
      case "alpha":
        this.alpha = parseFloat(paramVal) * proj4.common.D2R;
        break; //for somerc projection
      case "lonc":
        this.longc = paramVal * proj4.common.D2R;
        break; //for somerc projection
      case "x_0":
        this.x0 = parseFloat(paramVal);
        break; // false easting
      case "y_0":
        this.y0 = parseFloat(paramVal);
        break; // false northing
      case "k_0":
        this.k0 = parseFloat(paramVal);
        break; // projection scale factor
      case "k":
        this.k0 = parseFloat(paramVal);
        break; // both forms returned
      case "r_a":
        this.R_A = true;
        break; // sphere--area of ellipsoid
      case "zone":
        this.zone = parseInt(paramVal, 10);
        break; // UTM Zone
      case "south":
        this.utmSouth = true;
        break; // UTM north/south
      case "towgs84":
        this.datum_params = paramVal.split(",");
        break;
      case "to_meter":
        this.to_meter = parseFloat(paramVal);
        break; // cartesian scaling
      case "from_greenwich":
        this.from_greenwich = paramVal * proj4.common.D2R;
        break;
      case "czech":
        this.czech = true;
        break;
        // DGR 2008-07-09 : if pm is not a well-known prime meridian take
        // the value instead of 0.0, then convert to radians
      case "pm":
        paramVal = paramVal.replace(/\s/gi, "");
        this.from_greenwich = proj4.PrimeMeridian[paramVal] ? proj4.PrimeMeridian[paramVal] : parseFloat(paramVal);
        this.from_greenwich *= proj4.common.D2R;
        break;
        // DGR 2010-11-12: axis
      case "axis":
        paramVal = paramVal.replace(/\s/gi, "");
        var legalAxis = "ewnsud";
        if (paramVal.length === 3 && legalAxis.indexOf(paramVal.substr(0, 1)) !== -1 && legalAxis.indexOf(paramVal.substr(1, 1)) !== -1 && legalAxis.indexOf(paramVal.substr(2, 1)) !== -1) {
          this.axis = paramVal;
        } //FIXME: be silent ?
        break;
      case "wktext":
        break; //DGR 2012-07-29
      case "no_defs":
        break;
      default:
        //alert("Unrecognized parameter: " + paramName);
      } // switch()
    } // for paramArray
    this.deriveConstants();
  },

+138 −12
Original line number Diff line number Diff line
proj4.defs = {
  // These are so widely used, we'll go ahead and throw them in
  // without requiring a separate .js file
  'WGS84': "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees",
  'EPSG:4326': "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees",
  'EPSG:4269': "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees",
  'EPSG:3857': "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"
proj4.defs = function(name) {
  /*global console*/
  var defData;
  if(arguments.length === 2){
    defData = arguments[1];
  }else if(arguments.length===1){
    if(Array.isArray(name)){
      return name.map(function(v){
        if(Array.isArray(v)){
          proj4.defs.apply(proj4,v);
        }else{
          proj4.defs(v);
        }
      });
    }else if(typeof name === 'string'){
      
    }else if('EPSG' in name){
      proj4.defs['EPSG:'+name.EPSG]=name;
    }else{
      console.log(name);
    }
    return;
  }
  var self = {};
  var nameSplit;
  if (name.indexOf(":") > -1) {
    nameSplit = name.split(":");
    self[nameSplit[0]] = nameSplit[1];
  }
  var paramObj = {};
  defData.split("+").map(function(v) {
    return v.trim();
  }).filter(function(a) {
    return a;
  }).forEach(function(a) {
    var split = a.split("=");
    if (split[1] === "@null") {
      return;
    }
    split.push(true);
    paramObj[split[0].toLowerCase()] = split[1];
  });
  var paramName, paramVal, paramOutname;
  var params = {
    proj: 'projName',
    datum: 'datumCode',
    rf: function(v) {
      self.rf = parseFloat(v, 10);
    },
    lat_0: function(v) {
      self.lat0 = v * proj4.common.D2R;
    },
    lat_1: function(v) {
      self.lat1 = v * proj4.common.D2R;
    },
    lat_2: function(v) {
      self.lat2 = v * proj4.common.D2R;
    },
    lat_ts: function(v) {
      self.lat_ts = v * proj4.common.D2R;
    },
    lon_0: function(v) {
      self.long0 = v * proj4.common.D2R;
    },
    lon_1: function(v) {
      self.long1 = v * proj4.common.D2R;
    },
    lon_2: function(v) {
      self.long2 = v * proj4.common.D2R;
    },
    alpha: function(v) {
      self.alpha = parseFloat(v) * proj4.common.D2R;
    },
    lonc: function(v) {
      self.longc = v * proj4.common.D2R;
    },
    x_0: function(v) {
      self.x0 = parseFloat(v, 10);
    },
    y_0: function(v) {
      self.y0 = parseFloat(v, 10);
    },
    k_0: function(v) {
      self.k0 = parseFloat(v, 10);
    },
    k: function(v) {
      self.k0 = parseFloat(v, 10);
    },
    r_a: function() {
      self.R_A = true;
    },
    zone: function(v) {
      self.zone = parseInt(v, 10);
    },
    south: function() {
      self.utmSouth = true;
    },
    towgs84: function(v) {
      self.datum_params = v.split(",").map(function(a) {
        return parseFloat(a, 10);
      });
    },
    to_meter: function(v) {
      self.to_meter = parseFloat(v, 10);
    },
    from_greenwich: function(v) {
      self.from_greenwich = v * proj4.common.D2R;
    },
    pm: function(v) {
      self.from_greenwich = (proj4.PrimeMeridian[v] ? proj4.PrimeMeridian[v] : parseFloat(v, 10)) * proj4.common.D2R;
    },
    axis: function(v) {
      var legalAxis = "ewnsud";
      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) {
        self.axis = v;
      }
    }
  };
  for (paramName in paramObj) {
    paramVal = paramObj[paramName];
    if (paramName in params) {
      paramOutname = params[paramName];
      if (typeof paramOutname === 'function') {
        paramOutname(paramVal);
      }
      else {
        self[paramOutname] = paramVal;
      }
    }
    else {
      self[paramName] = paramVal;
    }
  }
  proj4.defs[name] = self;
};
proj4.defToJson = function(str){
  return JSON.stringify(proj4.defs[str]);
};
proj4.defs['EPSG:3785'] = proj4.defs['EPSG:3857'];  //maintain backward compat, official code is 3857
proj4.defs.GOOGLE = proj4.defs['EPSG:3857'];
proj4.defs['EPSG:900913'] = proj4.defs['EPSG:3857'];
proj4.defs['EPSG:102113'] = proj4.defs['EPSG:3857'];

src/defs/bigDefs.js

0 → 100644
+3 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading