node-red-contrib-tak-registration
Version:
A Node-RED node to register to TAK and to help wrap files as datapackages to send to TAK
248 lines (244 loc) • 7.5 kB
JavaScript
import CoordinateList from './CoordinateList'
import Coordinate from './Coordinate'
import MathUtil from '../math/MathUtil'
import System from '../../../../java/lang/System'
import Comparator from '../../../../java/util/Comparator'
import Envelope from './Envelope'
export default class CoordinateArrays {
static get ForwardComparator () { return ForwardComparator }
static get BidirectionalComparator () { return BidirectionalComparator }
static get coordArrayType () { return new Array(0).fill(null) }
interfaces_ () {
return []
}
getClass () {
return CoordinateArrays
}
static isRing (pts) {
if (pts.length < 4) return false
if (!pts[0].equals2D(pts[pts.length - 1])) return false
return true
}
static ptNotInList (testPts, pts) {
for (var i = 0; i < testPts.length; i++) {
var testPt = testPts[i]
if (CoordinateArrays.indexOf(testPt, pts) < 0) return testPt
}
return null
}
static scroll (coordinates, firstCoordinate) {
var i = CoordinateArrays.indexOf(firstCoordinate, coordinates)
if (i < 0) return null
var newCoordinates = new Array(coordinates.length).fill(null)
System.arraycopy(coordinates, i, newCoordinates, 0, coordinates.length - i)
System.arraycopy(coordinates, 0, newCoordinates, coordinates.length - i, i)
System.arraycopy(newCoordinates, 0, coordinates, 0, coordinates.length)
}
static equals () {
if (arguments.length === 2) {
const coord1 = arguments[0]
const coord2 = arguments[1]
if (coord1 === coord2) return true
if (coord1 === null || coord2 === null) return false
if (coord1.length !== coord2.length) return false
for (var i = 0; i < coord1.length; i++) {
if (!coord1[i].equals(coord2[i])) return false
}
return true
} else if (arguments.length === 3) {
const coord1 = arguments[0]
const coord2 = arguments[1]
const coordinateComparator = arguments[2]
if (coord1 === coord2) return true
if (coord1 === null || coord2 === null) return false
if (coord1.length !== coord2.length) return false
for (let i = 0; i < coord1.length; i++) {
if (coordinateComparator.compare(coord1[i], coord2[i]) !== 0) return false
}
return true
}
}
static intersection (coordinates, env) {
var coordList = new CoordinateList()
for (var i = 0; i < coordinates.length; i++) {
if (env.intersects(coordinates[i])) coordList.add(coordinates[i], true)
}
return coordList.toCoordinateArray()
}
static hasRepeatedPoints (coord) {
for (var i = 1; i < coord.length; i++) {
if (coord[i - 1].equals(coord[i])) {
return true
}
}
return false
}
static removeRepeatedPoints (coord) {
if (!CoordinateArrays.hasRepeatedPoints(coord)) return coord
var coordList = new CoordinateList(coord, false)
return coordList.toCoordinateArray()
}
static reverse (coord) {
var last = coord.length - 1
var mid = Math.trunc(last / 2)
for (var i = 0; i <= mid; i++) {
var tmp = coord[i]
coord[i] = coord[last - i]
coord[last - i] = tmp
}
}
static removeNull (coord) {
let nonNull = 0
for (let i = 0; i < coord.length; i++) {
if (coord[i] !== null) nonNull++
}
const newCoord = new Array(nonNull).fill(null)
if (nonNull === 0) return newCoord
let j = 0
for (let i = 0; i < coord.length; i++) {
if (coord[i] !== null) newCoord[j++] = coord[i]
}
return newCoord
}
static copyDeep () {
if (arguments.length === 1) {
const coordinates = arguments[0]
const copy = new Array(coordinates.length).fill(null)
for (let i = 0; i < coordinates.length; i++) {
copy[i] = new Coordinate(coordinates[i])
}
return copy
} else if (arguments.length === 5) {
const src = arguments[0]
const srcStart = arguments[1]
const dest = arguments[2]
const destStart = arguments[3]
const length = arguments[4]
for (let i = 0; i < length; i++) {
dest[destStart + i] = new Coordinate(src[srcStart + i])
}
}
}
static isEqualReversed (pts1, pts2) {
for (let i = 0; i < pts1.length; i++) {
const p1 = pts1[i]
const p2 = pts2[pts1.length - i - 1]
if (p1.compareTo(p2) !== 0) return false
}
return true
}
static envelope (coordinates) {
var env = new Envelope()
for (let i = 0; i < coordinates.length; i++) {
env.expandToInclude(coordinates[i])
}
return env
}
static toCoordinateArray (coordList) {
return coordList.toArray(CoordinateArrays.coordArrayType)
}
static atLeastNCoordinatesOrNothing (n, c) {
return c.length >= n ? c : []
}
static indexOf (coordinate, coordinates) {
for (var i = 0; i < coordinates.length; i++) {
if (coordinate.equals(coordinates[i])) {
return i
}
}
return -1
}
static increasingDirection (pts) {
for (var i = 0; i < Math.trunc(pts.length / 2); i++) {
var j = pts.length - 1 - i
var comp = pts[i].compareTo(pts[j])
if (comp !== 0) return comp
}
return 1
}
static compare (pts1, pts2) {
var i = 0
while (i < pts1.length && i < pts2.length) {
var compare = pts1[i].compareTo(pts2[i])
if (compare !== 0) return compare
i++
}
if (i < pts2.length) return -1
if (i < pts1.length) return 1
return 0
}
static minCoordinate (coordinates) {
var minCoord = null
for (var i = 0; i < coordinates.length; i++) {
if (minCoord === null || minCoord.compareTo(coordinates[i]) > 0) {
minCoord = coordinates[i]
}
}
return minCoord
}
static extract (pts, start, end) {
start = MathUtil.clamp(start, 0, pts.length)
end = MathUtil.clamp(end, -1, pts.length)
var npts = end - start + 1
if (end < 0) npts = 0
if (start >= pts.length) npts = 0
if (end < start) npts = 0
var extractPts = new Array(npts).fill(null)
if (npts === 0) return extractPts
var iPts = 0
for (var i = start; i <= end; i++) {
extractPts[iPts++] = pts[i]
}
return extractPts
}
}
class ForwardComparator {
compare (o1, o2) {
var pts1 = o1
var pts2 = o2
return CoordinateArrays.compare(pts1, pts2)
}
interfaces_ () {
return [Comparator]
}
getClass () {
return ForwardComparator
}
}
class BidirectionalComparator {
compare (o1, o2) {
var pts1 = o1
var pts2 = o2
if (pts1.length < pts2.length) return -1
if (pts1.length > pts2.length) return 1
if (pts1.length === 0) return 0
var forwardComp = CoordinateArrays.compare(pts1, pts2)
var isEqualRev = CoordinateArrays.isEqualReversed(pts1, pts2)
if (isEqualRev) return 0
return forwardComp
}
OLDcompare (o1, o2) {
var pts1 = o1
var pts2 = o2
if (pts1.length < pts2.length) return -1
if (pts1.length > pts2.length) return 1
if (pts1.length === 0) return 0
var dir1 = CoordinateArrays.increasingDirection(pts1)
var dir2 = CoordinateArrays.increasingDirection(pts2)
var i1 = dir1 > 0 ? 0 : pts1.length - 1
var i2 = dir2 > 0 ? 0 : pts1.length - 1
for (var i = 0; i < pts1.length; i++) {
var comparePt = pts1[i1].compareTo(pts2[i2])
if (comparePt !== 0) return comparePt
i1 += dir1
i2 += dir2
}
return 0
}
interfaces_ () {
return [Comparator]
}
getClass () {
return BidirectionalComparator
}
}