get-epsg-code
Version:
Gets EPSG Code for Various Inputs (incl. OGC WKT, ESRI WKT, GML, Mapfile, PROJ String, Proj4js String, XML)
1,274 lines (1,252 loc) • 148 kB
JavaScript
(() => {
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"(exports, module) {
var b64ab = {};
b64ab.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"
};
b64ab.toArrayBuffer = function toArrayBuffer(b64) {
var char2bits = b64ab.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;
};
b64ab.toBase64String = function toBase64String(ab) {
if (!b64ab.bits2char) {
b64ab.bits2char = {};
for (let char in b64ab.char2bits)
b64ab.bits2char[b64ab.char2bits[char]] = char;
}
var bits2char = b64ab.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 b64ab;
});
}
if (typeof module === "object")
module.exports = b64ab;
if (typeof window === "object")
window.b64ab = b64ab;
if (typeof self === "object")
self.b64ab = b64ab;
}
});
// node_modules/xml-utils/index-of-match.js
var require_index_of_match = __commonJS({
"node_modules/xml-utils/index-of-match.js"(exports, module) {
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;
}
module.exports = indexOfMatch;
module.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"(exports, module) {
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;
}
module.exports = indexOfMatchEnd;
module.exports.default = indexOfMatchEnd;
}
});
// node_modules/xml-utils/count-substring.js
var require_count_substring = __commonJS({
"node_modules/xml-utils/count-substring.js"(exports, module) {
function countSubstring(string, substring) {
const pattern = new RegExp(substring, "g");
const match = string.match(pattern);
return match ? match.length : 0;
}
module.exports = countSubstring;
module.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"(exports, module) {
var indexOfMatch = require_index_of_match();
var indexOfMatchEnd = require_index_of_match_end();
var countSubstring = require_count_substring();
function findTagByName(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 };
}
module.exports = findTagByName;
module.exports.default = findTagByName;
}
});
// 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"(exports, module) {
var findTagByName = 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 = findTagByName(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;
}
module.exports = findTagsByName;
module.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"(exports, module) {
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;
}
module.exports = findTagsByPath;
module.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"(exports, module) {
var findTagsByPath = require_find_tags_by_path();
function findTagByPath(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;
}
module.exports = findTagByPath;
module.exports.default = findTagByPath;
}
});
// node_modules/xml-utils/get-attribute.js
var require_get_attribute = __commonJS({
"node_modules/xml-utils/get-attribute.js"(exports, module) {
function getAttribute(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];
}
}
module.exports = getAttribute;
module.exports.default = getAttribute;
}
});
// node_modules/wkt-parser/wkt.build.js
var require_wkt_build = __commonJS({
"node_modules/wkt-parser/wkt.build.js"(exports, module) {
"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;
};
module.exports = index;
}
});
// node_modules/utm-utils/src/getCodeFromEsriWKT.js
var require_getCodeFromEsriWKT = __commonJS({
"node_modules/utm-utils/src/getCodeFromEsriWKT.js"(exports, module) {
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 module === "object") {
module.exports = getCodeFromEsriWKT;
module.exports.default = getCodeFromEsriWKT;
}
}
});
// node_modules/utm-utils/src/getCodeFromProjString.js
var require_getCodeFromProjString = __commonJS({
"node_modules/utm-utils/src/getCodeFromProjString.js"(exports, module) {
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 module === "object") {
module.exports = getCodeFromProjString;
module.exports.default = getCodeFromProjString;
}
}
});
// lib/hash.js
var require_hash = __commonJS({
"lib/hash.js"(exports, module) {
function hash32(string) {
string = string.trim();
string = string.replace(/\n/g, " ");
string = string.replace(/\t/g, " ");
string = string.replace(/ +/g, " ");
let hash = 0;
let i;
let chr;
if (string.length === 0)
return hash;
const string_length = string.length;
for (i = 0; i < string_length; i++) {
chr = string.charCodeAt(i);
hash = (hash << 5) - hash + chr;
hash |= 0;
}
return hash;
}
module.exports = hash32;
module.exports.default = hash32;
}
});
// node_modules/wkt-crs/wkt-crs.js
var require_wkt_crs = __commonJS({
"node_modules/wkt-crs/wkt-crs.js"(exports, module) {
function sort(data, { keywords } = {}) {
const keys = Object.keys(data).filter((k) => !/\d+/.test(k));
if (!keywords) {
keywords = [];
const counts = {};
if (Array.isArray(data)) {
data.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) => {
data[key] = sort(data[key]);
});
keywords.forEach((key) => {
const indices = [];
const params = [];
data.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) => {
data[indices[i]] = param;
});
});
return data;
}
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 data;
try {
data = JSON.parse(wkt);
} catch (error) {
console.error(`[wktcrs] failed to parse '${wkt}'`);
throw error;
}
if (debug)
console.log("[wktcrs] json parsed: '" + wkt + "'");
function process(data2, parent) {
const kw = data2[0];
data2.forEach(function(it) {
if (Array.isArray(it)) {
process(it, data2);
}
});
const kwarr = "MULTIPLE_" + kw;
if (kwarr in parent) {
parent[kwarr].push(data2);
} else if (kw in parent) {
parent[kwarr] = [parent[kw], data2];
delete parent[kw];
} else {
parent[kw] = data2;
}
return parent;
}
const result = process(data, [data]);
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 module === "object")
module.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"(exports, module) {
var wktcrs = require_wkt_crs();
function sort_wkt(wkt) {
const { data } = wktcrs.parse(wkt, { raw: true });
wktcrs.sort(data);
return wktcrs.unparse(data, { 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;
}
module.exports = normalize_wkt;
module.exports.default = normalize_wkt;
}
});
// lib/normalize/esriwkt.js
var require_esriwkt = __commonJS({
"lib/normalize/esriwkt.js"(exports, module) {
var normalize_wkt = require_wkt();
function normalize_esriwkt(esriwkt, { debug = false } = { debug: false }) {
return normalize_wkt(esriwkt, { debug });
}
module.exports = normalize_esriwkt;
module.exports.default = normalize_esriwkt;
}
});
// lib/normalize/proj4.js
var require_proj4 = __commonJS({
"lib/normalize/proj4.js"(exports, module) {
function normalize_proj4(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;
}
module.exports = normalize_proj4;
module.exports.default = normalize_proj4;
}
});
// node_modules/is-wkt/is-wkt.js
var require_is_wkt = __commonJS({
"node_modules/is-wkt/is-wkt.js"(exports, module) {
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 module === "object") {
module.exports = isWKT;
module.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"(exports, module) {
var FORMATS = {
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"
};
module.exports = {
FORMATS
};
}
});
// lib/get-proj-type.js
var require_get_proj_type = __commonJS({
"lib/get-proj-type.js"(exports, module) {
var isWKT = require_is_wkt();
var wktcrs = require_wkt_crs();
var { FORMATS } = require_enums();
var { ESRI_WKT, GEOSERVER, MAPFILE, MAPNIK, OGC_GML, OGC_XML, OGC_WKT, POSTGIS, PROJ_4, PROJ_4_JS, PROJJSON, WKT_2 } = FORMATS;
function getProjType(input, { debug = false } = { debug: false }) {
if (input.startsWith("{") && input.includes("projjson")) {
return PROJJSON;
} else if (isWKT(input)) {
const parsed = wktcrs.parse(input.toUpperCase()).data;
if ("AUTHORITY" in (parsed.PROJCS || parsed.PROJCRS || parsed.GEOGCS || parsed.GEOGCRS)) {
return OGC_WKT;
} else if ("ID" in parsed) {
return WKT_2;
} else {
return ESRI_WKT;
}
} else if (input.includes("gml:ProjectedCRS") || input.includes("gml:GeodeticCRS") || input.includes("gml:GeographicCRS")) {
if (input.includes("gml:srsID")) {
return OGC_XML;
} else {
return OGC_GML;
}
} else if (input.startsWith("+") && input.includes("+proj=")) {
return PROJ_4;
} else if (input.startsWith(`proj4.defs(`)) {
return PROJ_4_JS;
} else if (/^\d{1,6}\=(PROJCS|GEOGCS)/.test(input)) {
return GEOSERVER;
} else if (input.startsWith("PROJECTION") && input.endsWith("END")) {
return MAPFILE;
} else if (input.endsWith("</Map>")) {
return MAPNIK;
} else if (input.startsWith("INSERT")) {
return POSTGIS;
} else {
if (debug)
console.log('get-proj-type could not identify "' + input + '"');
return "SOMETHING ELSE";
}
}
module.exports = getProjType;
module.exports.default = getProjType;
}
});
// lib/parse/proj4js.js
var require_proj4js = __commonJS({
"lib/parse/proj4js.js"(exports, module) {
function parseProj4JS(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);
}
module.exports = parseProj4JS;
module.exports.default = parseProj4JS;
}
});
// lib/data/esriwkt-mapfile-proj4.json
var require_esriwkt_mapfile_proj4 = __commonJS({
"lib/data/esriwkt-mapfile-proj4.json"(exports, module) {
module.exports = {
properties: {
columns: [
"epsg_code",
"esriwkt",
"mapfile",
"proj4"
],
key: "epsg_code",
dataType: "int32"
},
data: "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