1
0
Fork 0
mirror of https://github.com/iNavFlight/inav-configurator.git synced 2025-07-13 11:29:53 +03:00
inav-configurator/js/geozone.js
2024-11-10 17:54:31 -03:00

203 lines
No EOL
4.2 KiB
JavaScript

'use strict'
const GeozoneType = Object.freeze({
EXCULSIVE: 0,
INCLUSIVE: 1,
});
const GeozoneShapes = Object.freeze({
CIRCULAR: 0,
POLYGON: 1,
});
const GeozoneFenceAction = Object.freeze({
NONE: 0,
AVOID: 1,
POSHOLD: 2,
RTH: 3,
});
let GeozoneVertex = function (number, lat, lon) {
self = {};
self.setNumber = (data) => {
number = data;
}
self.getNumber = () => {
return number;
}
self.setLat = (data) => {
lat = data;
}
self.getLat = () => {
return lat;
}
self.setLon = (data) => {
lon = data;
}
self.getLon = () => {
return lon;
}
self.getLatMap = () => {
return lat / 1e7;
}
self.getLonMap = () => {
return lon / 1e7;
}
return self;
}
let Geozone = function (type, shape, minAltitude, maxAltitude, sealevelRef, radius, fenceAction, vertices, number = 0) {
var self = {};
self.setNumber = (data) => {
number = data;
}
self.getNumber = () => {
return number;
}
self.setType = (data) => {
type = data;
}
self.getType = () => {
return type;
}
self.setShape = (data) => {
shape = data;
}
self.getShape = () => {
return shape;
}
self.setMinAltitude = (data) => {
minAltitude = data;
}
self.getMinAltitude = () => {
return minAltitude;
}
self.setMaxAltitude = (data) => {
maxAltitude = data;
}
self.getMaxAltitude = () => {
return maxAltitude;
}
self.setSealevelRef = (data) => {
sealevelRef = data;
}
self.getSealevelRef = () => {
return sealevelRef;
}
self.setRadius = (data) => {
radius = data;
}
self.getRadius = () => {
return radius;
}
self.setFenceAction = (data) => {
fenceAction = data;
}
self.getFenceAction = () => {
return fenceAction;
}
self.getFirstVertex = () => {
return vertices[0];
}
self.getLastVertex = () => {
return vertices[vertices.length - 1];
}
self.getVerticesCount = () => {
return vertices.length;
}
self.getVertex = (idx) => {
return vertices[idx];
}
self.setVertex = (idx, vertex) => {
vertices[idx] = vertex;
}
self.getVertices = () => {
return vertices;
}
self.setVertices = (data) => {
vertices = data;
}
self.getVerticesCount = () => {
return vertices.length;
}
self.insertVertex = (idx, newVertex) => {
vertices.forEach(vertex => {
if (vertex.getNumber() >= idx) {
vertex.setNumber(vertex.getNumber() + 1);
}
});
vertices.splice(idx, 0, newVertex);
}
self.dropVertex = (idx) => {
vertices.forEach(vertex => {
if (vertex.getNumber() >= idx) {
vertex.setNumber(vertex.getNumber() - 1);
}
});
vertices.splice(idx, 1);
}
self.resetVertices = () => {
vertices = [];
}
self.getElevationFromServer = async function (lon, lat, globalSettings) {
let elevation = "N/A";
if (globalSettings.mapProviderType == 'bing') {
let elevationEarthModel = $('#elevationEarthModel').prop("checked") ? "ellipsoid" : "sealevel";
const response = await fetch('http://dev.virtualearth.net/REST/v1/Elevation/List?points='+lat+','+lon+'&heights='+elevationEarthModel+'&key='+globalSettings.mapApiKey);
const myJson = await response.json();
elevation = myJson.resourceSets[0].resources[0].elevations[0];
}
else {
const response = await fetch('https://api.opentopodata.org/v1/aster30m?locations='+lat+','+lon);
const myJson = await response.json();
if (myJson.status == "OK" && myJson.results[0].elevation != null) {
elevation = myJson.results[0].elevation;
}
}
return elevation;
}
return self;
return self;
}
module.exports = { Geozone, GeozoneVertex, GeozoneType, GeozoneShapes, GeozoneFenceAction };