geojson2gtfs
Version:
A tiny nodeJs cli app to transform geoJson files (describing an onDemand informal public transport routes) to its corresponding GTFS entities.
64 lines (55 loc) • 2.25 kB
JavaScript
const nodeGeocoderClient = require('./reverseGeoCodeClients/node-geocoder-client');
const geoCodeXyzClient = require('./reverseGeoCodeClients/geocodexyz-client');
const objectFieldsFilter = require('../geoJsonObjectUtils/objectFieldsFilter');
const settingsHandler = require('../settingsHandler/settingsHandler');
const colorprint = require("colorprint");
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function getAddressFromResponse(obj, fields) {
let receivedAddresses = objectFieldsFilter(obj, fields);
if (receivedAddresses.length === 0 ) return 'S/N';
if (receivedAddresses[0] === undefined) return 'S/N';
return receivedAddresses[0];
}
module.exports = async function coordsArrayToDirectionsArray(coords) {
let totalSize = coords.length;
let direction;
let directions = [];
let coord, lati, long;
let response;
if (!settingsHandler.getSettings().geocoderOptions) {
colorprint.error('Geocoder options have not been declared in settings file. S/N addresses will be used \n');
}
for (let index=0; index<coords.length; index++) {
coord = coords[index];
long = coord[0];
lati = coord[1];
try {
if (settingsHandler.getSettings().geocoderOptions) {
// response = await geoCodeXyzClient(lati, long);
response = await nodeGeocoderClient(lati, long);
direction = getAddressFromResponse(
response,
[
'addr-street', 'staddress', // geocode.xyz endpoint fields
'streetName', // geocoder npm fields
'neighbourhood', 'road' // locationIQ endpoint fields
]
);
}
else {
direction = 'S/N';
}
}
catch(error){
direction = 'S/N';
}
finally {
directions.push(direction);
colorprint.info(`${direction}: ${index+1}/${totalSize} coords processed`);
await timeout(700); // we have to wait at least one second to make the next req
}
}
return directions;
}