UNPKG

get-epsg-code

Version:

Gets EPSG Code for Various Inputs (incl. OGC WKT, ESRI WKT, GML, Mapfile, PROJ String, Proj4js String, XML)

1,273 lines (1,251 loc) 145 kB
var __getOwnPropNames = Object.getOwnPropertyNames; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; // node_modules/b64ab/b64ab.js var require_b64ab = __commonJS({ "node_modules/b64ab/b64ab.js"(exports2, module2) { var b64ab2 = {}; b64ab2.char2bits = { 0: "110100", 1: "110101", 2: "110110", 3: "110111", 4: "111000", 5: "111001", 6: "111010", 7: "111011", 8: "111100", 9: "111101", A: "000000", Q: "010000", g: "100000", w: "110000", B: "000001", R: "010001", h: "100001", x: "110001", C: "000010", S: "010010", i: "100010", y: "110010", D: "000011", T: "010011", j: "100011", z: "110011", E: "000100", U: "010100", k: "100100", F: "000101", V: "010101", l: "100101", G: "000110", W: "010110", m: "100110", H: "000111", X: "010111", n: "100111", I: "001000", Y: "011000", o: "101000", J: "001001", Z: "011001", p: "101001", K: "001010", a: "011010", q: "101010", L: "001011", b: "011011", r: "101011", M: "001100", c: "011100", s: "101100", N: "001101", d: "011101", t: "101101", O: "001110", e: "011110", u: "101110", "+": "111110", P: "001111", f: "011111", v: "101111", "/": "111111" }; b64ab2.toArrayBuffer = function toArrayBuffer(b64) { var char2bits = b64ab2.char2bits; var eqct = 0; for (let i2 = b64.length; i2 >= 0; i2--) if (b64[i2] === "=") eqct++; var slen = b64.length - eqct; var l = Math.floor(0.75 * slen); var u8 = new Uint8Array(l); var s = ""; for (var i = 0; i < slen; i++) { var char = b64[i]; if (char === "=") break; s += char2bits[char]; if (s.length >= 8) { u8[Math.floor(0.75 * i)] = parseInt(s.substring(0, 8), 2); s = s.substring(8); } } return u8.buffer; }; b64ab2.toBase64String = function toBase64String(ab) { if (!b64ab2.bits2char) { b64ab2.bits2char = {}; for (let char in b64ab2.char2bits) b64ab2.bits2char[b64ab2.char2bits[char]] = char; } var bits2char = b64ab2.bits2char; var u8 = new Uint8Array(ab); var s = ""; var b = ""; for (var i = 0; i < u8.length; i++) { var n = u8[i].toString(2); while (n.length < 8) n = "0" + n; b += n; while (b.length >= 6) { s += bits2char[b.substring(0, 6)]; b = b.substring(6); } } if (b.length > 0) { while (b.length < 6) b += "0"; s += bits2char[b]; } while (s.length % 4 !== 0) { s += "="; } return s; }; if (typeof define === "function" && define.amd) { define(function() { return b64ab2; }); } if (typeof module2 === "object") module2.exports = b64ab2; if (typeof window === "object") window.b64ab = b64ab2; if (typeof self === "object") self.b64ab = b64ab2; } }); // node_modules/xml-utils/index-of-match.js var require_index_of_match = __commonJS({ "node_modules/xml-utils/index-of-match.js"(exports2, module2) { function indexOfMatch(xml, pattern, startIndex) { const re = new RegExp(pattern); const match = re.exec(xml.slice(startIndex)); if (match) return startIndex + match.index; else return -1; } module2.exports = indexOfMatch; module2.exports.default = indexOfMatch; } }); // node_modules/xml-utils/index-of-match-end.js var require_index_of_match_end = __commonJS({ "node_modules/xml-utils/index-of-match-end.js"(exports2, module2) { function indexOfMatchEnd(xml, pattern, startIndex) { const re = new RegExp(pattern); const match = re.exec(xml.slice(startIndex)); if (match) return startIndex + match.index + match[0].length - 1; else return -1; } module2.exports = indexOfMatchEnd; module2.exports.default = indexOfMatchEnd; } }); // node_modules/xml-utils/count-substring.js var require_count_substring = __commonJS({ "node_modules/xml-utils/count-substring.js"(exports2, module2) { function countSubstring(string, substring) { const pattern = new RegExp(substring, "g"); const match = string.match(pattern); return match ? match.length : 0; } module2.exports = countSubstring; module2.exports.default = countSubstring; } }); // node_modules/xml-utils/find-tag-by-name.js var require_find_tag_by_name = __commonJS({ "node_modules/xml-utils/find-tag-by-name.js"(exports2, module2) { var indexOfMatch = require_index_of_match(); var indexOfMatchEnd = require_index_of_match_end(); var countSubstring = require_count_substring(); function findTagByName2(xml, tagName, options) { const debug = options && options.debug || false; const nested = !(options && typeof options.nested === false); const startIndex = options && options.startIndex || 0; if (debug) console.log("[xml-utils] starting findTagByName with", tagName, " and ", options); const start = indexOfMatch(xml, `<${tagName}[ >/]`, startIndex); if (debug) console.log("[xml-utils] start:", start); if (start === -1) return void 0; const afterStart = xml.slice(start + tagName.length); let relativeEnd = indexOfMatchEnd(afterStart, "^[^<]*[ /]>", 0); const selfClosing = relativeEnd !== -1 && afterStart[relativeEnd - 1] === "/"; if (debug) console.log("[xml-utils] selfClosing:", selfClosing); if (selfClosing === false) { if (nested) { let startIndex2 = 0; let openings = 1; let closings = 0; while ((relativeEnd = indexOfMatchEnd(afterStart, "[ /]" + tagName + ">", startIndex2)) !== -1) { const clip = afterStart.substring(startIndex2, relativeEnd + 1); openings += countSubstring(clip, "<" + tagName + "[ \n >]"); closings += countSubstring(clip, "</" + tagName + ">"); if (closings >= openings) break; startIndex2 = relativeEnd; } } else { relativeEnd = indexOfMatchEnd(afterStart, "[ /]" + tagName + ">", 0); } } const end = start + tagName.length + relativeEnd + 1; if (debug) console.log("[xml-utils] end:", end); if (end === -1) return void 0; const outer = xml.slice(start, end); let inner; if (selfClosing) { inner = null; } else { inner = outer.slice(outer.indexOf(">") + 1, outer.lastIndexOf("<")); } return { inner, outer, start, end }; } module2.exports = findTagByName2; module2.exports.default = findTagByName2; } }); // node_modules/xml-utils/find-tags-by-name.js var require_find_tags_by_name = __commonJS({ "node_modules/xml-utils/find-tags-by-name.js"(exports2, module2) { var findTagByName2 = require_find_tag_by_name(); function findTagsByName(xml, tagName, options) { const tags = []; const debug = options && options.debug || false; const nested = options && typeof options.nested === "boolean" ? options.nested : true; let startIndex = options && options.startIndex || 0; let tag; while (tag = findTagByName2(xml, tagName, { debug, startIndex })) { if (nested) { startIndex = tag.start + 1 + tagName.length; } else { startIndex = tag.end; } tags.push(tag); } if (debug) console.log("findTagsByName found", tags.length, "tags"); return tags; } module2.exports = findTagsByName; module2.exports.default = findTagsByName; } }); // node_modules/xml-utils/find-tags-by-path.js var require_find_tags_by_path = __commonJS({ "node_modules/xml-utils/find-tags-by-path.js"(exports2, module2) { var findTagsByName = require_find_tags_by_name(); function findTagsByPath(xml, path, options) { const debug = options && options.debug || false; const returnOnFirst = options && options.returnOnFirst || false; let tags = findTagsByName(xml, path.shift(), { debug, nested: false }); if (debug) console.log("first tags are:", tags); for (let pathIndex = 0; pathIndex < path.length; pathIndex++) { const tagName = path[pathIndex]; if (debug) console.log("tagName:", tagName); let allSubTags = []; for (let tagIndex = 0; tagIndex < tags.length; tagIndex++) { const tag = tags[tagIndex]; const subTags = findTagsByName(tag.outer, tagName, { debug, startIndex: 1 }); if (debug) console.log("subTags.length:", subTags.length); if (subTags.length > 0) { subTags.forEach((subTag) => { subTag.start += tag.start, subTag.end += tag.start; }); if (returnOnFirst && pathIndex === path.length - 1) return [subTags[0]]; allSubTags = allSubTags.concat(subTags); } } tags = allSubTags; } return tags; } module2.exports = findTagsByPath; module2.exports.default = findTagsByPath; } }); // node_modules/xml-utils/find-tag-by-path.js var require_find_tag_by_path = __commonJS({ "node_modules/xml-utils/find-tag-by-path.js"(exports2, module2) { var findTagsByPath = require_find_tags_by_path(); function findTagByPath2(xml, path, options) { const debug = options && options.debug || false; const found = findTagsByPath(xml, path, { debug, returnOnFirst: true }); if (Array.isArray(found) && found.length === 1) return found[0]; else return void 0; } module2.exports = findTagByPath2; module2.exports.default = findTagByPath2; } }); // node_modules/xml-utils/get-attribute.js var require_get_attribute = __commonJS({ "node_modules/xml-utils/get-attribute.js"(exports2, module2) { function getAttribute2(tag, attributeName, options) { const debug = options && options.debug || false; if (debug) console.log("[xml-utils] getting " + attributeName + " in " + tag); const xml = typeof tag === "object" ? tag.outer : tag; const opening = xml.slice(0, xml.indexOf(">") + 1); const quotechars = ['"', "'"]; for (let i = 0; i < quotechars.length; i++) { const char = quotechars[i]; const pattern = attributeName + "\\=" + char + "([^" + char + "]*)" + char; if (debug) console.log("[xml-utils] pattern:", pattern); const re = new RegExp(pattern); const match = re.exec(opening); if (debug) console.log("[xml-utils] match:", match); if (match) return match[1]; } } module2.exports = getAttribute2; module2.exports.default = getAttribute2; } }); // node_modules/wkt-parser/wkt.build.js var require_wkt_build = __commonJS({ "node_modules/wkt-parser/wkt.build.js"(exports2, module2) { "use strict"; var NEUTRAL = 1; var KEYWORD = 2; var NUMBER = 3; var QUOTED = 4; var AFTERQUOTE = 5; var ENDED = -1; var whitespace = /\s/; var latin = /[A-Za-z]/; var keyword = /[A-Za-z84_]/; var endThings = /[,\]]/; var digets = /[\d\.E\-\+]/; function Parser(text) { if (typeof text !== "string") { throw new Error("not a string"); } this.text = text.trim(); this.level = 0; this.place = 0; this.root = null; this.stack = []; this.currentObject = null; this.state = NEUTRAL; } Parser.prototype.readCharicter = function() { var char = this.text[this.place++]; if (this.state !== QUOTED) { while (whitespace.test(char)) { if (this.place >= this.text.length) { return; } char = this.text[this.place++]; } } switch (this.state) { case NEUTRAL: return this.neutral(char); case KEYWORD: return this.keyword(char); case QUOTED: return this.quoted(char); case AFTERQUOTE: return this.afterquote(char); case NUMBER: return this.number(char); case ENDED: return; } }; Parser.prototype.afterquote = function(char) { if (char === '"') { this.word += '"'; this.state = QUOTED; return; } if (endThings.test(char)) { this.word = this.word.trim(); this.afterItem(char); return; } throw new Error(`havn't handled "` + char + '" in afterquote yet, index ' + this.place); }; Parser.prototype.afterItem = function(char) { if (char === ",") { if (this.word !== null) { this.currentObject.push(this.word); } this.word = null; this.state = NEUTRAL; return; } if (char === "]") { this.level--; if (this.word !== null) { this.currentObject.push(this.word); this.word = null; } this.state = NEUTRAL; this.currentObject = this.stack.pop(); if (!this.currentObject) { this.state = ENDED; } return; } }; Parser.prototype.number = function(char) { if (digets.test(char)) { this.word += char; return; } if (endThings.test(char)) { this.word = parseFloat(this.word); this.afterItem(char); return; } throw new Error(`havn't handled "` + char + '" in number yet, index ' + this.place); }; Parser.prototype.quoted = function(char) { if (char === '"') { this.state = AFTERQUOTE; return; } this.word += char; return; }; Parser.prototype.keyword = function(char) { if (keyword.test(char)) { this.word += char; return; } if (char === "[") { var newObjects = []; newObjects.push(this.word); this.level++; if (this.root === null) { this.root = newObjects; } else { this.currentObject.push(newObjects); } this.stack.push(this.currentObject); this.currentObject = newObjects; this.state = NEUTRAL; return; } if (endThings.test(char)) { this.afterItem(char); return; } throw new Error(`havn't handled "` + char + '" in keyword yet, index ' + this.place); }; Parser.prototype.neutral = function(char) { if (latin.test(char)) { this.word = char; this.state = KEYWORD; return; } if (char === '"') { this.word = ""; this.state = QUOTED; return; } if (digets.test(char)) { this.word = char; this.state = NUMBER; return; } if (endThings.test(char)) { this.afterItem(char); return; } throw new Error(`havn't handled "` + char + '" in neutral yet, index ' + this.place); }; Parser.prototype.output = function() { while (this.place < this.text.length) { this.readCharicter(); } if (this.state === ENDED) { return this.root; } throw new Error('unable to parse string "' + this.text + '". State is ' + this.state); }; function parseString(txt) { var parser = new Parser(txt); return parser.output(); } function mapit(obj, key, value) { if (Array.isArray(key)) { value.unshift(key); key = null; } var thing = key ? {} : obj; var out = value.reduce(function(newObj, item) { sExpr(item, newObj); return newObj; }, thing); if (key) { obj[key] = out; } } function sExpr(v, obj) { if (!Array.isArray(v)) { obj[v] = true; return; } var key = v.shift(); if (key === "PARAMETER") { key = v.shift(); } if (v.length === 1) { if (Array.isArray(v[0])) { obj[key] = {}; sExpr(v[0], obj[key]); return; } obj[key] = v[0]; return; } if (!v.length) { obj[key] = true; return; } if (key === "TOWGS84") { obj[key] = v; return; } if (key === "AXIS") { if (!(key in obj)) { obj[key] = []; } obj[key].push(v); return; } if (!Array.isArray(key)) { obj[key] = {}; } var i; switch (key) { case "UNIT": case "PRIMEM": case "VERT_DATUM": obj[key] = { name: v[0].toLowerCase(), convert: v[1] }; if (v.length === 3) { sExpr(v[2], obj[key]); } return; case "SPHEROID": case "ELLIPSOID": obj[key] = { name: v[0], a: v[1], rf: v[2] }; if (v.length === 4) { sExpr(v[3], obj[key]); } return; case "PROJECTEDCRS": case "PROJCRS": case "GEOGCS": case "GEOCCS": case "PROJCS": case "LOCAL_CS": case "GEODCRS": case "GEODETICCRS": case "GEODETICDATUM": case "EDATUM": case "ENGINEERINGDATUM": case "VERT_CS": case "VERTCRS": case "VERTICALCRS": case "COMPD_CS": case "COMPOUNDCRS": case "ENGINEERINGCRS": case "ENGCRS": case "FITTED_CS": case "LOCAL_DATUM": case "DATUM": v[0] = ["name", v[0]]; mapit(obj, key, v); return; default: i = -1; while (++i < v.length) { if (!Array.isArray(v[i])) { return sExpr(v, obj[key]); } } return mapit(obj, key, v); } } var D2R = 0.017453292519943295; function rename(obj, params) { var outName = params[0]; var inName = params[1]; if (!(outName in obj) && inName in obj) { obj[outName] = obj[inName]; if (params.length === 3) { obj[outName] = params[2](obj[outName]); } } } function d2r(input) { return input * D2R; } function cleanWKT(wkt) { if (wkt.type === "GEOGCS") { wkt.projName = "longlat"; } else if (wkt.type === "LOCAL_CS") { wkt.projName = "identity"; wkt.local = true; } else { if (typeof wkt.PROJECTION === "object") { wkt.projName = Object.keys(wkt.PROJECTION)[0]; } else { wkt.projName = wkt.PROJECTION; } } if (wkt.AXIS) { var axisOrder = ""; for (var i = 0, ii = wkt.AXIS.length; i < ii; ++i) { var axis = [wkt.AXIS[i][0].toLowerCase(), wkt.AXIS[i][1].toLowerCase()]; if (axis[0].indexOf("north") !== -1 || (axis[0] === "y" || axis[0] === "lat") && axis[1] === "north") { axisOrder += "n"; } else if (axis[0].indexOf("south") !== -1 || (axis[0] === "y" || axis[0] === "lat") && axis[1] === "south") { axisOrder += "s"; } else if (axis[0].indexOf("east") !== -1 || (axis[0] === "x" || axis[0] === "lon") && axis[1] === "east") { axisOrder += "e"; } else if (axis[0].indexOf("west") !== -1 || (axis[0] === "x" || axis[0] === "lon") && axis[1] === "west") { axisOrder += "w"; } } if (axisOrder.length === 2) { axisOrder += "u"; } if (axisOrder.length === 3) { wkt.axis = axisOrder; } } if (wkt.UNIT) { wkt.units = wkt.UNIT.name.toLowerCase(); if (wkt.units === "metre") { wkt.units = "meter"; } if (wkt.UNIT.convert) { if (wkt.type === "GEOGCS") { if (wkt.DATUM && wkt.DATUM.SPHEROID) { wkt.to_meter = wkt.UNIT.convert * wkt.DATUM.SPHEROID.a; } } else { wkt.to_meter = wkt.UNIT.convert; } } } var geogcs = wkt.GEOGCS; if (wkt.type === "GEOGCS") { geogcs = wkt; } if (geogcs) { if (geogcs.DATUM) { wkt.datumCode = geogcs.DATUM.name.toLowerCase(); } else { wkt.datumCode = geogcs.name.toLowerCase(); } if (wkt.datumCode.slice(0, 2) === "d_") { wkt.datumCode = wkt.datumCode.slice(2); } if (wkt.datumCode === "new_zealand_geodetic_datum_1949" || wkt.datumCode === "new_zealand_1949") { wkt.datumCode = "nzgd49"; } if (wkt.datumCode === "wgs_1984" || wkt.datumCode === "world_geodetic_system_1984") { if (wkt.PROJECTION === "Mercator_Auxiliary_Sphere") { wkt.sphere = true; } wkt.datumCode = "wgs84"; } if (wkt.datumCode.slice(-6) === "_ferro") { wkt.datumCode = wkt.datumCode.slice(0, -6); } if (wkt.datumCode.slice(-8) === "_jakarta") { wkt.datumCode = wkt.datumCode.slice(0, -8); } if (~wkt.datumCode.indexOf("belge")) { wkt.datumCode = "rnb72"; } if (geogcs.DATUM && geogcs.DATUM.SPHEROID) { wkt.ellps = geogcs.DATUM.SPHEROID.name.replace("_19", "").replace(/[Cc]larke\_18/, "clrk"); if (wkt.ellps.toLowerCase().slice(0, 13) === "international") { wkt.ellps = "intl"; } wkt.a = geogcs.DATUM.SPHEROID.a; wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10); } if (geogcs.DATUM && geogcs.DATUM.TOWGS84) { wkt.datum_params = geogcs.DATUM.TOWGS84; } if (~wkt.datumCode.indexOf("osgb_1936")) { wkt.datumCode = "osgb36"; } if (~wkt.datumCode.indexOf("osni_1952")) { wkt.datumCode = "osni52"; } if (~wkt.datumCode.indexOf("tm65") || ~wkt.datumCode.indexOf("geodetic_datum_of_1965")) { wkt.datumCode = "ire65"; } if (wkt.datumCode === "ch1903+") { wkt.datumCode = "ch1903"; } if (~wkt.datumCode.indexOf("israel")) { wkt.datumCode = "isr93"; } } if (wkt.b && !isFinite(wkt.b)) { wkt.b = wkt.a; } function toMeter(input) { var ratio = wkt.to_meter || 1; return input * ratio; } var renamer = function(a) { return rename(wkt, a); }; var list = [ ["standard_parallel_1", "Standard_Parallel_1"], ["standard_parallel_1", "Latitude of 1st standard parallel"], ["standard_parallel_2", "Standard_Parallel_2"], ["standard_parallel_2", "Latitude of 2nd standard parallel"], ["false_easting", "False_Easting"], ["false_easting", "False easting"], ["false-easting", "Easting at false origin"], ["false_northing", "False_Northing"], ["false_northing", "False northing"], ["false_northing", "Northing at false origin"], ["central_meridian", "Central_Meridian"], ["central_meridian", "Longitude of natural origin"], ["central_meridian", "Longitude of false origin"], ["latitude_of_origin", "Latitude_Of_Origin"], ["latitude_of_origin", "Central_Parallel"], ["latitude_of_origin", "Latitude of natural origin"], ["latitude_of_origin", "Latitude of false origin"], ["scale_factor", "Scale_Factor"], ["k0", "scale_factor"], ["latitude_of_center", "Latitude_Of_Center"], ["latitude_of_center", "Latitude_of_center"], ["lat0", "latitude_of_center", d2r], ["longitude_of_center", "Longitude_Of_Center"], ["longitude_of_center", "Longitude_of_center"], ["longc", "longitude_of_center", d2r], ["x0", "false_easting", toMeter], ["y0", "false_northing", toMeter], ["long0", "central_meridian", d2r], ["lat0", "latitude_of_origin", d2r], ["lat0", "standard_parallel_1", d2r], ["lat1", "standard_parallel_1", d2r], ["lat2", "standard_parallel_2", d2r], ["azimuth", "Azimuth"], ["alpha", "azimuth", d2r], ["srsCode", "name"] ]; list.forEach(renamer); if (!wkt.long0 && wkt.longc && (wkt.projName === "Albers_Conic_Equal_Area" || wkt.projName === "Lambert_Azimuthal_Equal_Area")) { wkt.long0 = wkt.longc; } if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === "Stereographic_South_Pole" || wkt.projName === "Polar Stereographic (variant B)")) { wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90); wkt.lat_ts = wkt.lat1; } else if (!wkt.lat_ts && wkt.lat0 && wkt.projName === "Polar_Stereographic") { wkt.lat_ts = wkt.lat0; wkt.lat0 = d2r(wkt.lat0 > 0 ? 90 : -90); } } var index = function(wkt) { var lisp = parseString(wkt); var type = lisp.shift(); var name = lisp.shift(); lisp.unshift(["name", name]); lisp.unshift(["type", type]); var obj = {}; sExpr(lisp, obj); cleanWKT(obj); return obj; }; module2.exports = index; } }); // node_modules/utm-utils/src/getCodeFromEsriWKT.js var require_getCodeFromEsriWKT = __commonJS({ "node_modules/utm-utils/src/getCodeFromEsriWKT.js"(exports2, module2) { function getCodeFromEsriWKT(esri_wkt) { if (!esri_wkt) return; const match = /PROJCS\[\"([^"]+)\"/.exec(esri_wkt); if (!match) return; const name = match[1]; if (name.match(/^WGS_1984_UTM_Zone_\d{1,2}(N|S)$/)) { const last_part = name.split("_").pop(); const zone = last_part.substring(0, last_part.length - 1); const hemisphere = last_part.substring(last_part.length - 1) == "N" ? 6 : 7; return Number.parseInt("32" + hemisphere + zone); } else if (name.match(/^NAD_1983_UTM_Zone_\d{1,2}N$/)) { const last_part = name.split("_").pop(); const zone = last_part.substring(0, last_part.length - 1); return Number.parseInt("269" + zone); } } if (typeof define === "function" && define.amd) { define(function() { return getCodeFromEsriWKT; }); } if (typeof module2 === "object") { module2.exports = getCodeFromEsriWKT; module2.exports.default = getCodeFromEsriWKT; } } }); // node_modules/utm-utils/src/getCodeFromProjString.js var require_getCodeFromProjString = __commonJS({ "node_modules/utm-utils/src/getCodeFromProjString.js"(exports2, module2) { function getCodeFromProjString(proj) { if (proj.includes("+proj=utm") && proj.includes("+zone=")) { const parts = proj.split(" "); const zone = parts.find((part) => part.startsWith("+zone=")).split("=")[1]; const south = proj.includes("+south"); let ellps = parts.find((part) => part.startsWith("+ellps=")); if (ellps) ellps = ellps.split("=")[1]; if (ellps === "GRS80" && south === false) { return Number.parseInt("269" + zone); } else { const hemisphere = south ? "7" : "6"; return Number.parseInt("32" + hemisphere + zone); } } } if (typeof define === "function" && define.amd) { define(function() { return getCodeFromProjString; }); } if (typeof module2 === "object") { module2.exports = getCodeFromProjString; module2.exports.default = getCodeFromProjString; } } }); // lib/hash.js var require_hash = __commonJS({ "lib/hash.js"(exports2, module2) { function hash32(string) { string = string.trim(); string = string.replace(/\n/g, " "); string = string.replace(/\t/g, " "); string = string.replace(/ +/g, " "); let hash2 = 0; let i; let chr; if (string.length === 0) return hash2; const string_length = string.length; for (i = 0; i < string_length; i++) { chr = string.charCodeAt(i); hash2 = (hash2 << 5) - hash2 + chr; hash2 |= 0; } return hash2; } module2.exports = hash32; module2.exports.default = hash32; } }); // node_modules/wkt-crs/wkt-crs.js var require_wkt_crs = __commonJS({ "node_modules/wkt-crs/wkt-crs.js"(exports2, module2) { function sort(data2, { keywords } = {}) { const keys = Object.keys(data2).filter((k) => !/\d+/.test(k)); if (!keywords) { keywords = []; const counts = {}; if (Array.isArray(data2)) { data2.forEach((it) => { if (Array.isArray(it) && it.length >= 2 && typeof it[1] === "string") { const k = it[0]; if (!counts[k]) counts[k] = 0; counts[k]++; } }); for (let k in counts) { if (counts[k] > 0) keywords.push(k); } } } keys.forEach((key) => { data2[key] = sort(data2[key]); }); keywords.forEach((key) => { const indices = []; const params = []; data2.forEach((item, i) => { if (Array.isArray(item) && item[0] === key) { indices.push(i); params.push(item); } }); params.sort((a, b) => { a = a[1].toString(); b = b[1].toString(); return a < b ? -1 : a > b ? 1 : 0; }); params.forEach((param, i) => { data2[indices[i]] = param; }); }); return data2; } function parse(wkt, options) { const raw = typeof options === "object" && options.raw === true; const debug = typeof options === "object" && options.debug === true; if (debug) console.log("[wktcrs] parse starting with\n", wkt); wkt = wkt.replace(/[A-Z][A-Z\d_]+\[/gi, function(match) { return '["' + match.substr(0, match.length - 1) + '",'; }); wkt = wkt.replace(/, ?([A-Z][A-Z\d_]+[,\]])/gi, function(match, p1) { const varname = p1.substr(0, p1.length - 1); return ',"' + (raw ? "raw:" : "") + varname + '"' + p1[p1.length - 1]; }); if (typeof options === "object" && options.raw === true) { wkt = wkt.replace(/, {0,2}(-?[\.\d]+)(?=,|\])/g, function(match, p1) { return ',"' + (raw ? "raw:" : "") + p1 + '"'; }); } if (debug) console.log("[wktcrs] json'd wkt: '" + wkt + "'"); let data2; try { data2 = JSON.parse(wkt); } catch (error) { console.error(`[wktcrs] failed to parse '${wkt}'`); throw error; } if (debug) console.log("[wktcrs] json parsed: '" + wkt + "'"); function process(data3, parent) { const kw = data3[0]; data3.forEach(function(it) { if (Array.isArray(it)) { process(it, data3); } }); const kwarr = "MULTIPLE_" + kw; if (kwarr in parent) { parent[kwarr].push(data3); } else if (kw in parent) { parent[kwarr] = [parent[kw], data3]; delete parent[kw]; } else { parent[kw] = data3; } return parent; } const result = process(data2, [data2]); if (debug) console.log("[wktcrs] parse returning", result); return { data: result }; } function unparse(wkt, options) { if (Array.isArray(wkt) && wkt.length == 1 && Array.isArray(wkt[0])) { wkt = wkt[0]; } const [kw, ...attrs] = wkt; const str = kw + "[" + attrs.map((attr) => { if (Array.isArray(attr)) { return unparse(attr, options).data; } else if (typeof attr === "number") { return attr.toString(); } else if (typeof attr === "string") { if (attr.startsWith("raw:")) { return attr.replace("raw:", ""); } else { return '"' + attr + '"'; } } else { throw new Error('[wktcrs] unexpected attribute "' + attr + '"'); } }).join(",") + "]"; return { data: str }; } var _module = { parse, unparse, sort }; if (typeof define === "function") define(function() { return _module; }); if (typeof module2 === "object") module2.exports = _module; if (typeof window === "object") window.wktcrs = _module; if (typeof self === "object") self.wktcrs = _module; } }); // lib/normalize/wkt.js var require_wkt = __commonJS({ "lib/normalize/wkt.js"(exports2, module2) { var wktcrs = require_wkt_crs(); function sort_wkt(wkt) { const { data: data2 } = wktcrs.parse(wkt, { raw: true }); wktcrs.sort(data2); return wktcrs.unparse(data2, { raw: true }).data; } function normalize_wkt(wkt, { debug = false } = { debug: false }) { wkt = wkt.trim(); wkt = wkt.replace(/\n/g, " "); wkt = wkt.replace(/\t/g, " "); wkt = wkt.replace(/ +/g, " "); wkt = wkt.replace(/ /g, "_"); wkt = wkt.replace(`GEOGCS["GCS_`, `GEOGCS["`); wkt = wkt.replace(`DATUM["D_`, `DATUM["`); wkt = wkt.replace("Gauss_Kruger", "GK"); wkt = wkt.replace(/\.\d{16,}/g, (n) => n.substr(0, 16)); wkt = wkt.replace(/\d+\.0[,"'\]]/g, (s) => s.substring(0, s.indexOf(".")) + s.charAt(s.length - 1)); wkt = wkt.replace(/[_|"]1984[_|"]/g, (s) => s.charAt(0) + "84" + s.charAt(s.length - 1)); wkt = wkt.replace(/"[A-Za-z_\d]+"/g, (s) => '"' + s.substring(1, s.length - 1).toLowerCase() + '"'); wkt = sort_wkt(wkt); if (debug) console.log('[get-epsg-code] wkt after cleaning: "' + wkt + '"'); return wkt; } module2.exports = normalize_wkt; module2.exports.default = normalize_wkt; } }); // lib/normalize/esriwkt.js var require_esriwkt = __commonJS({ "lib/normalize/esriwkt.js"(exports2, module2) { var normalize_wkt = require_wkt(); function normalize_esriwkt2(esriwkt, { debug = false } = { debug: false }) { return normalize_wkt(esriwkt, { debug }); } module2.exports = normalize_esriwkt2; module2.exports.default = normalize_esriwkt2; } }); // lib/normalize/proj4.js var require_proj4 = __commonJS({ "lib/normalize/proj4.js"(exports2, module2) { function normalize_proj42(str, { debug = false, remove_k1 = true, remove_no_defs = true, remove_title = true, remove_init = true, remove_type = true } = {}) { str = str.trim(); str = str.replace(/ +/g, " "); let parts = str.split(/ ?\+/g).filter((it) => it.trim() !== "").sort(); if (remove_k1) parts = parts.filter((it) => it !== "k=1"); if (remove_no_defs) parts = parts.filter((it) => it !== "no_defs"); if (remove_type) parts = parts.filter((it) => !it.startsWith("type")); if (remove_init) parts = parts.filter((it) => !it.startsWith("init")); if (remove_title) parts = parts.filter((it) => !it.startsWith("title")); str = parts.map((it) => "+" + it).join(" "); if (debug) console.log('normalized proj4 string\nfrom "' + arguments[0] + '"\nto "' + str + '"'); return str; } module2.exports = normalize_proj42; module2.exports.default = normalize_proj42; } }); // node_modules/is-wkt/is-wkt.js var require_is_wkt = __commonJS({ "node_modules/is-wkt/is-wkt.js"(exports2, module2) { var keywords = [ "PROJECTEDCRS", "PROJCRS", "GEOGCS", "GEOCCS", "PROJCS", "LOCAL_CS", "GEODCRS", "GEODETICCRS", "GEODETICDATUM", "ENGCRS", "ENGINEERINGCRS", "PRIMEM", "DATUM" ]; function isWKT(str) { str = str.trim(); if (str.startsWith("PROJCS[") || str.startsWith("PROJCRS[") || str.startsWith("GEOGCS[") || str.startsWith("GEOGCRS[")) { for (let i = 0; i < keywords.length; i++) { const kw = keywords[i]; if (str.includes(kw + "[")) { return true; } } } else { return false; } } if (typeof define === "function" && define.amd) { define(function() { return isWKT; }); } if (typeof module2 === "object") { module2.exports = isWKT; module2.exports.default = isWKT; } if (typeof self === "object") self.isWKT = isWKT; if (typeof window === "object") window.isWKT = isWKT; } }); // lib/enums.js var require_enums = __commonJS({ "lib/enums.js"(exports2, module2) { var FORMATS2 = { ESRI_WKT: "esriwkt", GEOSERVER: "geoserver", MAPFILE: "mapfile", MAPNIK: "mapnik", OGC_GML: "gml", OGC_XML: "xml", OGC_WKT: "wkt", POSTGIS: "postgis", PROJ_4: "proj4", PROJ_4_JS: "js", PROJJSON: "PROJJSON", WKT_2: "wkt2" }; module2.exports = { FORMATS: FORMATS2 }; } }); // lib/get-proj-type.js var require_get_proj_type = __commonJS({ "lib/get-proj-type.js"(exports2, module2) { var isWKT = require_is_wkt(); var wktcrs = require_wkt_crs(); var { FORMATS: FORMATS2 } = require_enums(); var { ESRI_WKT: ESRI_WKT2, GEOSERVER: GEOSERVER2, MAPFILE: MAPFILE2, MAPNIK: MAPNIK2, OGC_GML: OGC_GML2, OGC_XML: OGC_XML2, OGC_WKT: OGC_WKT2, POSTGIS: POSTGIS2, PROJ_4: PROJ_42, PROJ_4_JS: PROJ_4_JS2, PROJJSON: PROJJSON2, WKT_2: WKT_22 } = FORMATS2; function getProjType2(input, { debug = false } = { debug: false }) { if (input.startsWith("{") && input.includes("projjson")) { return PROJJSON2; } else if (isWKT(input)) { const parsed = wktcrs.parse(input.toUpperCase()).data; if ("AUTHORITY" in (parsed.PROJCS || parsed.PROJCRS || parsed.GEOGCS || parsed.GEOGCRS)) { return OGC_WKT2; } else if ("ID" in parsed) { return WKT_22; } else { return ESRI_WKT2; } } else if (input.includes("gml:ProjectedCRS") || input.includes("gml:GeodeticCRS") || input.includes("gml:GeographicCRS")) { if (input.includes("gml:srsID")) { return OGC_XML2; } else { return OGC_GML2; } } else if (input.startsWith("+") && input.includes("+proj=")) { return PROJ_42; } else if (input.startsWith(`proj4.defs(`)) { return PROJ_4_JS2; } else if (/^\d{1,6}\=(PROJCS|GEOGCS)/.test(input)) { return GEOSERVER2; } else if (input.startsWith("PROJECTION") && input.endsWith("END")) { return MAPFILE2; } else if (input.endsWith("</Map>")) { return MAPNIK2; } else if (input.startsWith("INSERT")) { return POSTGIS2; } else { if (debug) console.log('get-proj-type could not identify "' + input + '"'); return "SOMETHING ELSE"; } } module2.exports = getProjType2; module2.exports.default = getProjType2; } }); // lib/parse/proj4js.js var require_proj4js = __commonJS({ "lib/parse/proj4js.js"(exports2, module2) { function parseProj4JS2(input, { debug = false } = { debug: false }) { const start = input.indexOf(":") + 1; const end = input.indexOf('"', start + 2); const str = input.substring(start, end); if (debug) console.log('parseProj4JS str: "' + str + '"'); if (str) return Number(str); } module2.exports = parseProj4JS2; module2.exports.default = parseProj4JS2; } }); // lib/data/esriwkt-mapfile-proj4.json var require_esriwkt_mapfile_proj4 = __commonJS({ "lib/data/esriwkt-mapfile-proj4.json"(exports2, module2) { module2.exports = { properties: { columns: [ "epsg_code", "esriwkt", "mapfile", "proj4" ], key: "epsg_code", dataType: "int32" }, data: "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