114 lines
2.0 KiB
JavaScript
114 lines
2.0 KiB
JavaScript
|
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export 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);
|
||
|
}
|
||
|
}
|