|
@@ -6,9 +6,22 @@
|
|
|
* @license Apache-2.0
|
|
|
*/
|
|
|
|
|
|
+import OperationError from "../errors/OperationError.mjs";
|
|
|
import geohash from "ngeohash";
|
|
|
+/*
|
|
|
+Currently unable to update to geodesy v2 as we cannot load .js modules into a .mjs file.
|
|
|
+When we do update, imports will look like this:
|
|
|
+
|
|
|
+import LatLonEllipsoidal from "geodesy/latlon-ellipsoidal.js";
|
|
|
+import Mgrs from "geodesy/mgrs.js";
|
|
|
+import OsGridRef from "geodesy/osgridref.js";
|
|
|
+import Utm from "geodesy/utm.js";
|
|
|
+*/
|
|
|
import geodesy from "geodesy";
|
|
|
-import OperationError from "../errors/OperationError.mjs";
|
|
|
+const LatLonEllipsoidal = geodesy.LatLonEllipsoidal,
|
|
|
+ Mgrs = geodesy.Mgrs,
|
|
|
+ OsGridRef = geodesy.OsGridRef,
|
|
|
+ Utm = geodesy.Utm;
|
|
|
|
|
|
/**
|
|
|
* Co-ordinate formats
|
|
@@ -116,22 +129,22 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli
|
|
|
switch (inFormat) {
|
|
|
case "Geohash":
|
|
|
hash = geohash.decode(input.replace(/[^A-Za-z0-9]/g, ""));
|
|
|
- latlon = new geodesy.LatLonEllipsoidal(hash.latitude, hash.longitude);
|
|
|
+ latlon = new LatLonEllipsoidal(hash.latitude, hash.longitude);
|
|
|
break;
|
|
|
case "Military Grid Reference System":
|
|
|
- utm = geodesy.Mgrs.parse(input.replace(/[^A-Za-z0-9]/g, "")).toUtm();
|
|
|
+ utm = Mgrs.parse(input.replace(/[^A-Za-z0-9]/g, "")).toUtm();
|
|
|
latlon = utm.toLatLonE();
|
|
|
break;
|
|
|
case "Ordnance Survey National Grid":
|
|
|
- osng = geodesy.OsGridRef.parse(input.replace(/[^A-Za-z0-9]/g, ""));
|
|
|
- latlon = geodesy.OsGridRef.osGridToLatLon(osng);
|
|
|
+ osng = OsGridRef.parse(input.replace(/[^A-Za-z0-9]/g, ""));
|
|
|
+ latlon = OsGridRef.osGridToLatLon(osng);
|
|
|
break;
|
|
|
case "Universal Transverse Mercator":
|
|
|
// Geodesy needs a space between the first 2 digits and the next letter
|
|
|
if (/^[\d]{2}[A-Za-z]/.test(input)) {
|
|
|
input = input.slice(0, 2) + " " + input.slice(2);
|
|
|
}
|
|
|
- utm = geodesy.Utm.parse(input);
|
|
|
+ utm = Utm.parse(input);
|
|
|
latlon = utm.toLatLonE();
|
|
|
break;
|
|
|
case "Degrees Minutes Seconds":
|
|
@@ -143,7 +156,7 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli
|
|
|
if (splitLat.length >= 3 && splitLong.length >= 3) {
|
|
|
lat = convDMSToDD(splitLat[0], splitLat[1], splitLat[2], 10);
|
|
|
lon = convDMSToDD(splitLong[0], splitLong[1], splitLong[2], 10);
|
|
|
- latlon = new geodesy.LatLonEllipsoidal(lat.degrees, lon.degrees);
|
|
|
+ latlon = new LatLonEllipsoidal(lat.degrees, lon.degrees);
|
|
|
} else {
|
|
|
throw new OperationError("Invalid co-ordinate format for Degrees Minutes Seconds");
|
|
|
}
|
|
@@ -152,7 +165,7 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli
|
|
|
splitLat = splitInput(split[0]);
|
|
|
if (splitLat.length >= 3) {
|
|
|
lat = convDMSToDD(splitLat[0], splitLat[1], splitLat[2]);
|
|
|
- latlon = new geodesy.LatLonEllipsoidal(lat.degrees, lat.degrees);
|
|
|
+ latlon = new LatLonEllipsoidal(lat.degrees, lat.degrees);
|
|
|
} else {
|
|
|
throw new OperationError("Invalid co-ordinate format for Degrees Minutes Seconds");
|
|
|
}
|
|
@@ -168,7 +181,7 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli
|
|
|
// Convert to decimal degrees, and then convert to a geodesy object
|
|
|
lat = convDDMToDD(splitLat[0], splitLat[1], 10);
|
|
|
lon = convDDMToDD(splitLong[0], splitLong[1], 10);
|
|
|
- latlon = new geodesy.LatLonEllipsoidal(lat.degrees, lon.degrees);
|
|
|
+ latlon = new LatLonEllipsoidal(lat.degrees, lon.degrees);
|
|
|
} else {
|
|
|
// Not a pair, so only try to convert one set of co-ordinates
|
|
|
splitLat = splitInput(input);
|
|
@@ -176,7 +189,7 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli
|
|
|
throw new OperationError("Invalid co-ordinate format for Degrees Decimal Minutes.");
|
|
|
}
|
|
|
lat = convDDMToDD(splitLat[0], splitLat[1], 10);
|
|
|
- latlon = new geodesy.LatLonEllipsoidal(lat.degrees, lat.degrees);
|
|
|
+ latlon = new LatLonEllipsoidal(lat.degrees, lat.degrees);
|
|
|
}
|
|
|
break;
|
|
|
case "Decimal Degrees":
|
|
@@ -186,14 +199,14 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli
|
|
|
if (splitLat.length !== 1 || splitLong.length !== 1) {
|
|
|
throw new OperationError("Invalid co-ordinate format for Decimal Degrees.");
|
|
|
}
|
|
|
- latlon = new geodesy.LatLonEllipsoidal(splitLat[0], splitLong[0]);
|
|
|
+ latlon = new LatLonEllipsoidal(splitLat[0], splitLong[0]);
|
|
|
} else {
|
|
|
// Not a pair, so only try to convert one set of co-ordinates
|
|
|
splitLat = splitInput(split[0]);
|
|
|
if (splitLat.length !== 1) {
|
|
|
throw new OperationError("Invalid co-ordinate format for Decimal Degrees.");
|
|
|
}
|
|
|
- latlon = new geodesy.LatLonEllipsoidal(splitLat[0], splitLat[0]);
|
|
|
+ latlon = new LatLonEllipsoidal(splitLat[0], splitLat[0]);
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
@@ -260,7 +273,7 @@ export function convertCoordinates (input, inFormat, inDelim, outFormat, outDeli
|
|
|
convLat = mgrs.toString(precision);
|
|
|
break;
|
|
|
case "Ordnance Survey National Grid":
|
|
|
- osng = geodesy.OsGridRef.latLonToOsGrid(latlon);
|
|
|
+ osng = OsGridRef.latLonToOsGrid(latlon);
|
|
|
if (osng.toString() === "") {
|
|
|
throw new OperationError("Could not convert co-ordinates to OS National Grid. Are the co-ordinates in range?");
|
|
|
}
|