@geoapify/un-locode
Version:
A Node.js library for querying United Nations Location Code (UN/LOCODE) data
88 lines (87 loc) • 2.52 kB
JavaScript
import * as path from 'path';
import csvToJson from 'convert-csv-to-json';
const loadedFiles = new Map();
const fileExpiryTime = 1000 * 60 * 60 * 24; // 24 hours
export function query(countryCode, locationCode) {
clearOldFiles();
let file = loadDataFile(countryCode);
if (!file) {
return null;
}
let item = findItemInFile(file, locationCode);
if (item) {
const codeData = {
country: item.country,
location: item.location,
locationName: item.nameWoDiacritics,
subdivision: item.subdivision,
status: item.status,
functionCodes: convertToFunctionArray(item.function)
};
if (item.lat && item.lon) {
codeData.coordinates = {
lat: parseFloat(item.lat),
lon: parseFloat(item.lon)
};
}
if (!codeData.subdivision) {
delete codeData.subdivision;
}
return codeData;
}
else {
return null;
}
}
function loadDataFile(countryName) {
if (loadedFiles.has(countryName)) {
return loadedFiles.get(countryName).data;
}
const fileName = countryName + '.csv';
const filePath = path.join(__dirname, 'data', fileName);
try {
//const fileContents = await fs.readFile(filePath, 'utf-8');
const data = csvToJson.fieldDelimiter(',').supportQuotedField(true).getJsonFromCsv(filePath);
data.forEach(item => {
if (item['geocoded'] === 'true') {
item['geocoded'] = true;
}
else {
delete item['geocoded'];
}
});
addFile(countryName, data);
return data;
}
catch (error) {
return null;
}
}
function findItemInFile(file, locationCode) {
return file.find(item => item.location === locationCode);
}
function clearOldFiles() {
loadedFiles.forEach((value, key) => {
if (value.loadDate.getTime() + fileExpiryTime < Date.now()) {
loadedFiles.delete(key);
}
});
}
function addFile(countryName, data) {
loadedFiles.set(countryName, {
loadDate: new Date(),
data: data
});
}
function convertToFunctionArray(functionCode) {
if (!functionCode) {
return [];
}
let result = [];
for (let i = 0; i < functionCode.length; i++) {
if (functionCode.charAt(i) !== '-') {
result.push(functionCode.charAt(i));
}
}
return result;
}