all-airports
Version:
Serves as an independent data scraping module, complete with ontology and full scraping ability for the airports of the world
377 lines (376 loc) • 18.6 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var csv = require("csvtojson");
var getUuid = require("uuid-by-string");
var funktologies_1 = require("funktologies");
var constants_1 = require("../constants/constants");
var globalStore_1 = require("../constants/globalStore");
var materialLookupTable = {
'\'CONCRETE\'': 'Concrete',
'ALUM': 'ALUMINUM',
'ALUMINUM': 'ALUMINUM',
'ASB': 'Asbestos Cement',
'ASFALT': 'Asphalt',
'ASP': 'Asphalt',
'ASPH': 'Asphalt',
'ASPHALT': 'Asphalt',
'ASPHALT CONCRETE': 'Concrete (Asphalt)',
'ASPHALT MIX': 'Asphalt (Mix)',
'ASPHALTIC CONCRETE': ' Concrete (Asphalt)',
'BIT': 'Bituminous asphalt or tarmac',
'BITUMEN': 'Bitumen',
'BITUMINOUS': 'Bitumen',
'BLACK CLAY': 'Clay (Black)',
'BLACK SILT': 'Silt (Black)',
'BRI': 'Bricks',
'BRICK': 'Bricks',
'BROWN CLAY': 'Clay (Brown)',
'BROWN CLAY GRAVEL': 'Gravel (Brown Clay)',
'BROWN GRAVEL': 'Gravel (Brown)',
'BROWN SILT CLAY': 'Clay (Brown Silt)',
'CALICHE': 'Cement (Caliche)',
'CINDERS': 'Gravel (Cinders)',
'CL': 'Clay',
'CLA': 'Clay',
'CLAY': 'Clay',
'COM': 'Composite',
'COMPACTED EARTH': 'Earth (Compacted)',
'CON': 'Concrete',
'CONC': 'Concrete',
'CONCRETE': 'Concrete',
'COP': 'Composite',
'COR': 'Coral (fine crushed coral reef structures)',
'CORAL': 'Coral (fine crushed coral reef structures)',
'CORAL SAND': 'Sand (Crushed Coral)',
'CRUSHED ROCK': 'Crushed Rock',
'CRUSHED STONE': 'Crushed Stone',
'DECK': 'Deck',
'DIRT': 'Dirt',
'DIRT(CALICHE)': 'Dirt (Caliche)',
'EARTH': 'Earth',
'FROZEN LAKE': 'Ice (Frozen Lake)',
'GRAAS': 'Grass',
'GRADED EARTH': 'Earth (Graded)',
'GRAIN': 'Grain',
'GRAS': 'Grass',
'GRASS': 'Grass',
'GRASS CORAL': 'Coral (Grass)',
'GRASS DIRT': 'Dirt (Grass)',
'GRASS OR EARTH NOT GRADED OR ROLLED': 'Earth/Grass (Not Graded or rolled)',
'GRASS RED SILTY CLAY': 'Clay (Grassed Red Silt)',
'GRASS RED SILTY SAND': 'Sand (Grassed Red Silt)',
'GRASSED BLACK CLAY': 'Clay (Grassed Black)',
'GRASSED BLACK CLAY SAND': 'Sand (Grassed Black Clay)',
'GRASSED BLACK CLAY SILT': 'Silt (Grassed Black Clay)',
'GRASSED BLACK SAND': 'Sand (Grassed Black)',
'GRASSED BLACK SILT': 'Silt (Grassed Black)',
'GRASSED BLACK SILT CLAY': 'Clay (Grassed Black Silt)',
'GRASSED BLACK SOIL': 'Soil (Grassed Black)',
'GRASSED BLACKCLAY': 'Clay (Grassed Black)',
'GRASSED BROWN CLAY': 'Clay (Grassed Brown)',
'GRASSED BROWN GRAVEL': 'Gravel (Grassed Brown)',
'GRASSED BROWN SANDY CLAY': 'Clay (Grassed Brown Sandy)',
'GRASSED BROWN SILT CLAY': 'Clay (Grassed Brown Silt)',
'GRASSED BROWN SILT LOAM': 'Loam (Grassed Brown Silt)',
'GRASSED BROWN SILTY CLAY': 'Clay (Grassed Brown Silt)',
'GRASSED CLAY': 'Clay (Grassed)',
'GRASSED CLAY SILT CLAY': 'Clay (Grassed Silt)',
'GRASSED GRAVEL': 'Gravel (Grassed)',
'GRASSED GREY CLAY': 'Clay (Grassed Grey)',
'GRASSED GREY GRAVEL': 'Gravel (Grassed Grey)',
'GRASSED GREY SAND': 'Sand (Grassed Grey)',
'GRASSED GREY SILT CLAY': 'Clay (Grassed Grey Silt)',
'GRASSED GREY SILT SAND': 'Sand (Grassed Grey Silt)',
'GRASSED LIMESTONE GRAVEL': 'Gravel (Grassed Limestone)',
'GRASSED RED CLAY': 'Clay (Grassed Red)',
'GRASSED RED SILT': 'Silt (Grassed Red)',
'GRASSED RED SILT CLAY': 'Clay (Grassed Red Silt)',
'GRASSED RED SILT SAND': 'Sand (Grassed Red Silt)',
'GRASSED RED SILTY CLAY': 'Clay (Grassed Red Silt)',
'GRASSED RED SILTY SAND': 'Sand (Grassed Red Silt)',
'GRASSED RIVER GRAVEL': 'Gravel (Grassed Gravel)',
'GRASSED SAND': 'Sand (Grassed)',
'GRASSED SANDY LOAM': 'Loam (Grassed sandy)',
'GRASSED SILT CLAY': 'Clay (Grassed Silt)',
'GRASSED WHITE GRAVEL': 'Gravel (Grassed White)',
'GRASSED WHITE LIME STONE': 'Limestone (Grassed White)',
'GRASSED YELLOW CLAY': 'Clay (Grassed Yellow)',
'GRASSED YELLOW GRAVEL': 'Gravel (Grassed Yellow)',
'GRASSED YELLOW SILT CLAY': 'Clay (Grassed Yellow Silt)',
'GRASSY': 'Grass',
'GRAV': 'Gravel',
'GRAVEL': 'Gravel',
'GRE': 'Earth/Grass (Graded or rolled)',
'GREY CLAY': 'Clay (Grey)',
'GREY GRAVEL': 'Gravel (Grey)',
'GREY SILT CLAY': 'Clay (Grey Silt)',
'GROUND': 'Earth',
'GRS': 'Grass',
'GRV': 'Gravel',
'GRVL': 'Gravel',
'GVL': 'Gravel',
'HARD CLAY': 'Clay (Hard)',
'HARD LOAM': 'Loam (Hard)',
'HARD MUD': 'Mud (Hard)',
'HARD SAND': 'Sand (HARD)',
'ICE': 'Ice',
'LANDING MATS': 'Marston Matting',
'LAT': 'Laterite',
'LIMESTONE': 'Limestone',
'LOOSE GRAVEL': 'Gravel (Loose)',
'MAC': 'Macadam',
'MAICILLO': 'Sand (Maicillo)',
'MARSTON MATTING': 'Marston Matting',
'MAT': 'Marston Matting',
'MATS': 'Marston Matting',
'MEMBRANES': 'Marston Matting',
'MET': 'Metal',
'METAL': 'Metal',
'MOSS': 'Earth (Moss)',
'NATURAL SOIL': 'Natural Soil',
'NEOPRENE': 'Neoprene',
'OILED DIRT': 'Dirt (Oiled)',
'OILED GRAVEL': 'Gravel (Oiled)',
'OILGRAVEL': 'Gravel (Oiled)',
'OLD ASP': 'Asphalt (Old)',
'OLIGRAVEL': 'Gravel (Oiled)',
'PACKED': 'Dirt (Packed)',
'PACKED DIRT': 'Dirt (Packed)',
'PACKED GRAVEL': 'Gravel (Packed)',
'PAD': 'Blast Pads',
'PAVED': 'Pavement',
'PAVEMENT': 'Pavement',
'PEM': 'Partially concrete, asphalt or bitumen-bound macadam',
'PER': 'Permanent surface, details unknown',
'PFC': 'Porous Friction Course',
'PIERCED STEEL PLANKING': 'Marston Matting',
'PSP': 'Marston Matting',
'RED CLAY': 'Clay (Red)',
'RED CLAY GRAVEL': 'Gravel (Red Clay)',
'RED GRAVEL': 'Gravel (Red)',
'RED SILT CLAY': 'Clay (Red Silt)',
'ROCK': 'Rock',
'ROCKY GRAVEL': 'Gravel (Rocky)',
'ROLLED EARTH': 'Earth (Rolled)',
'ROOF': 'Rooftop',
'ROOF-TOP': 'Rooftop',
'ROOF/TOP': 'Rooftop',
'ROOFTOP': 'Rooftop',
'SAN': 'Sand',
'SAND': 'Sand',
'SAND GRASS': 'Sand (Grass)',
'SANDY SOIL': 'Soil (Sandy)',
'SHELLS': 'Shells',
'SLAG': 'Slag',
'SMT': 'Sommerfeld Tracking',
'SN': 'Sand',
'SNO': 'Snow',
'SNOW': 'Snow',
'SOD': 'Sod',
'SOFT GRAVEL': 'Gravel (Soft)',
'SOFT SAND': 'Sand (Soft)',
'SOIL': 'Soil',
'STEEL': 'Steel',
'STONE': 'Stone',
'STONE DUST': 'Stone (Dust)',
'TARMAC': 'Tarmac',
'TOP': 'Rooftop',
'TREATED': 'Treated',
'TREATED GRAVEL': 'Gravel (Treated)',
'TREATED SAND': 'Sand (Treated)',
'TRTD': 'Treated',
'TRTD GRVL': 'Gravel (Treated)',
'TURF': 'Turf',
'U': 'Unknown',
'UNK': 'Unknown',
'UNKNOWN': 'Unknown',
'UNPAVED': 'Unknown (Unpaved)',
'WATER': 'Water',
'WHITE GRAVEL': 'Gravel (White)',
'WOOD': 'Wood',
'YELLOW GRAVEL': 'Gravel (Yellow)',
};
var conditionLookupTable = {
'F': 'Fair',
'G': 'Good',
'P': 'Poor',
'f': 'Fair',
'g': 'Good',
'p': 'Poor'
};
function getRunwaysFromOurAirports() {
return __awaiter(this, void 0, void 0, function () {
var runwayData, jsonifiedData;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
runwayData = [];
return [4 /*yield*/, csv({
headers: ['id', 'refId', 'ident', 'length', 'width', 'surfMat', 'lighted', 'closed'],
noheader: false
}).fromFile('src/assets/runways-ourairports.csv')];
case 1:
jsonifiedData = _a.sent();
jsonifiedData.forEach(function (datum) { return runwayData.push(CSV(datum.id, datum.refId, datum.ident, datum.length, datum.width, datum.surfMat, datum.lighted, datum.closed)); });
Object.values(runwayData).forEach(function (runway) {
if (!runway.length || !runway.width || !runway.ident) {
return;
}
var airportId = constants_1.consts.ONTOLOGY.INST_AIRPORT + getUuid(runway.ident);
var airport = globalStore_1.store.airports[airportId];
// If an airport doesn't already exist in the store for this runway,
// we can't attach the runway to anything.
if (airport && runway.length && runway.width) {
var airportObjProperties = airport.objectProperties;
var runMap_1 = funktologies_1.getRelation(airportObjProperties, constants_1.consts.ONTOLOGY.HAS_RUNWAY);
var rId = constants_1.consts.ONTOLOGY.INST_RUNWAY + getUuid(runway.ident);
if (!runMap_1) {
var objectProp = {};
if (globalStore_1.store.runways[rId]) {
objectProp[constants_1.consts.ONTOLOGY.HAS_RUNWAY] = globalStore_1.store.runways[rId];
}
else {
objectProp = funktologies_1.entityMaker(constants_1.consts.ONTOLOGY.HAS_RUNWAY, constants_1.consts.ONTOLOGY.ONT_RUNWAY, rId, "Runway for " + (airport.datatypeProperties[constants_1.consts.ONTOLOGY.DT_NAME] || runway.ident));
globalStore_1.store.runways[rId] = objectProp[constants_1.consts.ONTOLOGY.HAS_RUNWAY];
}
runMap_1 = objectProp[constants_1.consts.ONTOLOGY.HAS_RUNWAY];
airport.objectProperties.push(funktologies_1.entityRefMaker(constants_1.consts.ONTOLOGY.HAS_RUNWAY, objectProp));
}
runMap_1.datatypeProperties[constants_1.consts.ONTOLOGY.DT_LENGTH] = Number(runway.length);
runMap_1.datatypeProperties[constants_1.consts.ONTOLOGY.DT_WIDTH] = Number(runway.width);
runMap_1.datatypeProperties[constants_1.consts.ONTOLOGY.DT_UNIT] = 'ft';
if (runway.surfMat) {
runway.surfMat = runway.surfMat.replace(',', ' - ');
// Catches edge case where single letters specifiy condition of the runway material.
var hyphenList = runway.surfMat.split('-').map(function (sm) { return sm.trim(); });
var lastDescriptor = hyphenList[hyphenList.length - 1];
var hasCondition = (lastDescriptor && lastDescriptor.length === 1) || null;
var condition = '';
if (hasCondition) {
condition = conditionLookupTable[lastDescriptor];
}
// Ensure synonyms of same material aren't counted as extra
var surfaceMaterials_1 = runway.surfMat.split('/').map(function (sm) { return sm.trim(); });
// The longer list is
if (hyphenList.length > 1) {
if (surfaceMaterials_1.length > 1) {
surfaceMaterials_1 = [];
hyphenList.forEach(function (item) { return surfaceMaterials_1.push.apply(surfaceMaterials_1, item.split('/').map(function (sm) { return sm.trim(); })); });
}
else {
surfaceMaterials_1 = hyphenList;
}
}
var convertedSurList_1 = [];
if (!hasCondition) {
surfaceMaterials_1.forEach(function (mat) {
convertedSurList_1.push(materialLookup(mat));
});
convertedSurList_1 = convertedSurList_1.filter(function (x) { return !!x; });
// Remove undefined, and duplications
var fistSurf_1 = convertedSurList_1.shift();
if (fistSurf_1) {
convertedSurList_1 = convertedSurList_1.filter(function (x) { return x !== fistSurf_1; });
convertedSurList_1.unshift(fistSurf_1);
}
}
if (!convertedSurList_1.length) {
return;
}
if (convertedSurList_1[0] === 'ROOF' || convertedSurList_1.length === 1) {
makeSurfaceMaterial(airport, runMap_1, runway.ident, materialLookup(runway.surfMat), false, condition);
}
else {
convertedSurList_1.forEach(function (mat) {
makeSurfaceMaterial(airport, runMap_1, runway.ident, mat, true);
});
}
}
}
});
return [2 /*return*/];
}
});
});
}
exports.getRunwaysFromOurAirports = getRunwaysFromOurAirports;
;
function makeSurfaceMaterial(airport, runMap, runwayId, sMat, isComposite, condition) {
if (!sMat) {
return;
}
var runwayObjProperties = runMap.objectProperties;
var mapSurfMat = funktologies_1.getRelation(runwayObjProperties, constants_1.consts.ONTOLOGY.HAS_SURFACE_MATERIAL);
var smId = constants_1.consts.ONTOLOGY.INST_SURFACE_MATERIAL + getUuid(runwayId) + getUuid(sMat);
if (!mapSurfMat) {
var surfMatObjProp = {};
if (globalStore_1.store.surfaceMaterials[smId]) {
surfMatObjProp[constants_1.consts.ONTOLOGY.HAS_SURFACE_MATERIAL] = globalStore_1.store.surfaceMaterials[smId];
}
else {
surfMatObjProp = funktologies_1.entityMaker(constants_1.consts.ONTOLOGY.HAS_SURFACE_MATERIAL, constants_1.consts.ONTOLOGY.ONT_SURFACE_MATERIAL, smId, "Surface Material for the runway at " + (airport.name || runwayId));
globalStore_1.store.surfaceMaterials[smId] = surfMatObjProp[constants_1.consts.ONTOLOGY.HAS_SURFACE_MATERIAL];
}
mapSurfMat = surfMatObjProp[constants_1.consts.ONTOLOGY.HAS_SURFACE_MATERIAL];
runMap.objectProperties.push(funktologies_1.entityRefMaker(constants_1.consts.ONTOLOGY.HAS_SURFACE_MATERIAL, surfMatObjProp));
}
if (condition) {
mapSurfMat.datatypeProperties[constants_1.consts.ONTOLOGY.DT_CONDITION] = condition;
}
mapSurfMat.datatypeProperties[constants_1.consts.ONTOLOGY.DT_IS_COMPOSITE] = isComposite;
mapSurfMat.datatypeProperties[constants_1.consts.ONTOLOGY.DT_MATERIAL] = sMat;
}
function materialLookup(abbrev) {
// if (!materialLookupTable[abbrev.toUpperCase()]) {
// store.debugLogger(`3, ${abbrev} ~ ${materialLookupTable[abbrev.toUpperCase()]}`);
// }
return materialLookupTable[abbrev.toUpperCase()] || abbrev || '';
}
function CSV(id, refId, ident, length, width, surfMat, lighted, closed) {
return {
closed: !!closed,
id: id,
ident: ident,
length: length,
lighted: !!lighted,
refId: refId,
surfMat: surfMat,
width: width
};
}
;
;