Files
flightgear-airports-old/src/renderer/utils/apt.js
T
2020-05-24 20:54:56 +02:00

350 lines
11 KiB
JavaScript

/* eslint-disable */
const lineReader = require('readline');
const zlib = require('zlib');
var icao;
function aptForEach(array, apt, features, callback) {
logger('info', "AsyncForEach Len " + array.length);
for (let index = 0; index < array.length; index++) {
try {
apt = callback(array[index], index, apt);
logger('info', "Index : " + index + " Result : " + apt);
} catch (error) {
logger('error', error);
}
}
saveAirport(features, apt).then(t => {
postMessage(['progress', array.length]);
logger('info', `Stored : ${apt.icao}` );
if( apt.last ) {
postMessage('DONE');
}
});
}
this.boundingBox = null;
var scanMethods = {
1: (l, apts, apt) => {
try {
logger('info', 'Airport:', l);
apt.icao = l[4];
apt.name = l.slice(5).join(' ').replace('\t', ' ');
apt.type = 'airport'
return apt;
} catch (error) {
reject(error);
}
},
14: (l, apts, apt) => {
logger('info', 'Viewport:', l);
try {
updateBoundingBox(apt, l[1], l[2]);
return apt;
} catch (error) {
reject(error);
}
},
16: (l, apts, apt) => {
logger('info', 'Seaplane:', l);
apt.icao = l[4];
apt.name = l.slice(5).join(' ').replace('\t', ' ');
apt.type = 'seaplane'
resolve(apt);
},
17: (l, apts, apt) => {
logger('info', 'Heliport:', l);
apt.icao = l[4];
apt.name = l.slice(5).join(' ').replace('\t', ' ');
apt.type = 'heliport'
},
18: (l, apts, apt) => {
logger('info', 'Airport light beacon:', l);
try {
updateBoundingBox(apt, l[1], l[2]);
return apt;
} catch (error) {
reject(error);
}
},
19: (l, apts, apt) => {
logger('info', 'Windsock:', l);
try {
updateBoundingBox(apt, l[1], l[2]);
return apt;
} catch (error) {
reject(error);
}
},
111: (l, apts, apt) => {
logger('info', 'Node :', l);
try {
updateBoundingBox(apt, l[1], l[2]);
return apt;
} catch (error) {
reject(error);
}
},
112: (l, apts, apt) => {
logger('info', 'Node :', l);
try {
updateBoundingBox(apt, l[1], l[2]);
return apt;
} catch (error) {
reject(error);
}
},
113: (l, apts, apt) => {
logger('info', 'Node :', l);
try {
updateBoundingBox(apt, l[1], l[2]);
return apt;
} catch (error) {
reject(error);
}
},
99: (l) => {
logger('info', 'Finished');
}
};
function updateBoundingBox(apt, lat, lon) {
if (lat > 90 || lat < -90) {
logger('debug', `${lat} out of bounds`);
}
if (!apt.boundingBoxCenter || isNaN(apt.boundingBoxCenter[0]) || isNaN(apt.boundingBoxCenter[1])) {
apt.boundingBoxCenter = [lon, lat];
} else {
var avgLon = (Number(lon) + Number(apt.boundingBoxCenter[0])) / 2;
var avgLat = (Number(lat) + Number(apt.boundingBoxCenter[1])) / 2;
apt.boundingBoxCenter = [avgLon, avgLat];
}
}
async function saveAirport(features, apt) {
var promise = new Promise(function (resolve, reject) {
var transaction = features.transaction("airports", "readwrite");
var objectStore = transaction.objectStore("airports");
var index = objectStore.index('icaoIndex');
if (!apt || !apt.icao) {
return;
}
var objectGetRequest = index.get(apt.icao);
objectGetRequest.onsuccess = function (event) {
logger('info', 'objectGetRequest', event);
var feature = event.target.result;
if (!feature) {
feature = {
"type": "Feature",
'properties': { 'icao': icao, 'name': '', 'twr': false, 'threshold': false, 'flights': 0, airlines: [] },
'geometry': {
"type": "Point"
}
};
}
feature.properties.name = apt.name;
feature.properties.icao = apt.icao;
feature.properties.type = apt.type;
feature.geometry.coordinates = apt.boundingBoxCenter;
logger('info', "Storing Airport : " + feature.properties.icao + " Name : " + feature.properties.name);
// Create another request that inserts the item back into the database
var updateAirportRequest = objectStore.put(feature);
// Log the transaction that originated this request
logger('info', "The transaction that originated this request is " + updateAirportRequest);
// When this new request succeeds, run the displayData() function again to update the display
updateAirportRequest.onsuccess = function (event) {
logger('info', "Stored Name : " + event.target.result);
resolve(event.target.result);
};
updateAirportRequest.onerror = function (event) {
logger('info', "Error ", event);
reject(event);
};
};
objectGetRequest.onerror = function (event) {
logger('info', "Error ", event);
reject(event);
};
});
return promise;
}
async function saveName(features, icao, name) {
var promise = new Promise(function (resolve, reject) {
var transaction = features.transaction("airports", "readwrite");
var objectStore = transaction.objectStore("airports");
var index = objectStore.index('icaoIndex');
var objectGetRequest = index.get(icao);
objectGetRequest.onsuccess = function (event) {
logger('info', 'objectGetRequest', event);
var feature = event.target.result;
if (!feature) {
feature = {
"type": "Feature",
'properties': { 'icao': icao, 'name': '', 'twr': false, 'threshold': false, 'flights': 0, airlines: [] },
'geometry': {
"type": "Point"
}
};
}
feature.properties.name = name;
feature.properties.icao = icao;
logger('info', "Storing ICAO : " + feature.properties.icao + " Name : " + name);
// Create another request that inserts the item back into the database
var updateAirportRequest = objectStore.put(feature);
// Log the transaction that originated this request
logger('info', "The transaction that originated this request is " + updateAirportRequest);
// When this new request succeeds, run the displayData() function again to update the display
updateAirportRequest.onsuccess = function (event) {
logger('info', "Stored Name : " + event.target.result);
resolve(event.target.result);
};
updateAirportRequest.onerror = function (event) {
logger('info', "Error ", event);
reject(event);
};
};
objectGetRequest.onerror = function (event) {
logger('info', "Error ", event);
reject(event);
};
});
return promise;
}
async function saveCoordinates(features, icao, boundingBoxCenter) {
var promise = new Promise(function (resolve, reject) {
var transaction = features.transaction("airports", "readwrite");
var objectStore = transaction.objectStore("airports");
var index = objectStore.index('icaoIndex');
var objectStoreRequest = index.get(icao);
objectStoreRequest.onsuccess = function (event) {
logger('info', 'objectStoreRequest', event);
var feature = event.target.result;
if (!feature) {
feature = {
"type": "Feature",
'properties': { 'icao': icao, 'name': '', 'twr': false, 'threshold': false, 'flights': 0, airlines: [] },
'geometry': {
"type": "Point"
}
};
}
feature.geometry.coordinates = boundingBoxCenter;
logger('info', "ICAO : " + feature.properties.icao);
// Create another request that inserts the item back into the database
var updateAirportRequest = objectStore.put(feature);
// Log the transaction that originated this request
logger('info', "The transaction that originated this request is " + updateAirportRequest);
// When this new request succeeds, run the displayData() function again to update the display
updateAirportRequest.onsuccess = function (event) {
logger('info', "Stored Position : " + event.target.result);
resolve("Stored Position : " + event.target.result);
};
updateAirportRequest.onerror = function (event) {
logger('info', "Error ", event);
reject(event);
};
};
objectStoreRequest.onerror = function (event) {
logger('info', "Error ", event);
reject(event);
};
});
return promise;
}
async function scanAPTIntoDB(f, features) {
var promise = new Promise(function (resolve, reject) {
try {
var i;
var count = 0;
var postMessage = this.postMessage;
var lines = [];
require('fs').createReadStream(f).pipe(zlib.createGunzip())
.on('data', function (chunk) {
for (i = 0; i < chunk.length; ++i)
if (chunk[i] == 10) count++;
})
.on('end', function () {
postMessage(['max', count*2]);
console.log('Line Count', count);
lineReader.createInterface({
input: fs.createReadStream(f).pipe(zlib.createGunzip())
}).on('line', function (line) {
lines.push(line);
var fields = line.split(/[ ]+/);
if (fields[0] == '99') {
logger('info', "End Reading");
}
}).on('error', function (err) {
logger('info', err);
lr.close();
}).on('close', async function () {
logger('info', "End File Read");
var currentAirport = [];
var currentIcao = null;
try {
lines.forEach((line, index) => {
var fields = line.split(/[ ]+/);
if ([1, 16, 17, 99].indexOf(Number(fields[0])) >= 0) {
var apt = { icao: currentIcao, last: Number(fields[0])===99 }
var bla = aptForEach(currentAirport, apt, features, (line, index, apt) => {
//await waitFor(5000);
try {
var fields = line.split(/[ ]+/);
// var fields = line.match('([0-9]+)');
if (fields != null) {
var scanMethod = scanMethods[fields[0]];
if (scanMethod != null) {
var text = scanMethod(fields, features, apt);
logger('info', `Scanned ${fields[0]}`, text);
resolve(text);
} else {
resolve('Ignored ' + line);
}
}
return apt;
} catch (error) {
logger('error', error);
reject(error);
}
});
postMessage(['progress', currentAirport.length]);
currentIcao = fields[4]
currentAirport = [];
}
currentAirport.push(line);
});
logger('info', "Finished");
// postMessage('DONE');
} catch (error) {
logger('error', "Crashed");
logger('error', error);
postMessage('DONE');
}
});
});
} catch (error) {
console.error(error);
reject(error);
this.postMessage('DONE');
}
});
}
// export default { scan, name }