Adds first version for min & max | Needs review

This commit is contained in:
pgm-chardelv1 2021-07-19 16:12:00 +02:00
parent 2ba01713ef
commit 9c31a92abd
2 changed files with 101 additions and 29 deletions

View file

@ -1,3 +1,4 @@
/** /**
* RuleSet Class * RuleSet Class
* Constructor * Constructor
@ -30,6 +31,7 @@ class RuleSet {
const [ const [
[program, keys], values [program, keys], values
] = Object.entries(initValues); ] = Object.entries(initValues);
console.log(program)
if (program === '$multiply') { if (program === '$multiply') {
this.scoreValues = keys; this.scoreValues = keys;
@ -41,6 +43,16 @@ class RuleSet {
this.order = keys; this.order = keys;
const match = this.getFirstMatchScore(tags); const match = this.getFirstMatchScore(tags);
return `"${this.name.slice(8)}":"${match}"`; return `"${this.name.slice(8)}":"${match}"`;
} else if (program === '$min') {
this.scoreValues = keys;
const minVal = this.getMinValue(tags);
return `"${this.name.slice(8)}":"${minVal}"`;
} else if (program === '$max') {
this.scoreValues = keys;
const maxVal = this.getMaxValue(tags);
return `"${this.name.slice(8)}":"${maxVal}"`;
} else { } else {
console.error(`Error: Program ${program} is not implemented yet. ${JSON.stringify(keys)}`); console.error(`Error: Program ${program} is not implemented yet. ${JSON.stringify(keys)}`);
@ -74,8 +86,10 @@ class RuleSet {
getFirstMatchScore (tags) { getFirstMatchScore (tags) {
let matchFound = false; let matchFound = false;
let match = ""; let match = "";
let i = 0;
for (let key of this.order) { for (let key of this.order) {
i++;
for (let entry of Object.entries(tags)) { for (let entry of Object.entries(tags)) {
const [tagKey, tagValue] = entry; const [tagKey, tagValue] = entry;
@ -111,6 +125,47 @@ class RuleSet {
return null; return null;
} }
getMinValue (tags) {
const minArr = this.scoreValues.map(part => {
if (typeof(part) === 'object') {
return this.getMin(part, tags)
} else {
return parseInt(part);
}
});
let absMin = Math.min(...minArr);
return absMin;
}
getMin (part, tags) {
let min;
const [ group ] = Object.entries(part);
const [,compareVals] = group;
const minArr = Object.values(compareVals).map(v => parseInt(v));
min = Math.min(...minArr);
return min;
}
getMaxValue (tags) {
const maxArr = this.scoreValues.map(part => {
if (typeof(part) === 'object') {
return this.getMax(part, tags)
} else {
return parseInt(part);
}
});
let absMax = Math.max(...maxArr);
return absMax;
}
getMax (part, tags) {
let max;
const [ group ] = Object.entries(part);
const [,compareVals] = group;
const maxArr = Object.values(compareVals).map(v => parseInt(v));
max = Math.max(...maxArr);
return max;
}
} }

View file

@ -9,12 +9,12 @@ import RuleSet from './RuleSet.js';
* Example tags * Example tags
*/ */
const tags1 = { const tags1 = {
"highway": "residential", // 1 "highway": "residential", // 1 // Expect "yes"
"surface": "paved", // 0.99 "surface": "paved", // 0.99
} }
const tags2 = { const tags2 = {
"bicycle": "yes", "bicycle": "yes", // Expect "yes"
"cycleway": "lane", "cycleway": "lane",
"highway": "secondary", "highway": "secondary",
"maxspeed": "50", "maxspeed": "50",
@ -22,68 +22,73 @@ const tags2 = {
const tags3 = { const tags3 = {
"cyclestreet": "yes", "cyclestreet": "yes",
"highway": "residential", "highway": "residential", // Expect "yes"
"maxspeed": "30", "maxspeed": "30",
"surface": "asphalt" "surface": "asphalt"
} }
const tags4 = { const tags4 = {
"highway": "track", "highway": "track", // Expect "yes"
"surface": "asphalt", "surface": "asphalt",
"incline": "10%" "incline": "10%"
} }
const tags5 = { const tags5 = {
"access": "no", "access": "no", // Expect "no"
"bicycle": "official", "bicycle": "official",
"area": "yes" "area": "yes"
} }
const tags6 = {
"surface":"dirt",
"highway":"track",
/*
"surface":"paved",
"highway":"path"
*/
}
/** /**
* Interpret JsonFile w/ Tags * Interpret JsonFile w/ Tags
* @param definitionFile {any} JSON input defining the score distribution * @param definitionFile {any} JSON input defining the score distribution
* @param tags {any} OSM tags as key/value pairs * @param tags {any} OSM tags as key/value pairs
*/ */
const interpret = (definitionFile, tags) => { const interpret = (definitionFile, tags) => {
const rawData = fs.readFileSync(definitionFile); const { name, $default, $multiply, $min, value} = ruleSet;
const ruleSet = JSON.parse(rawData);
const { name, $default, $multiply, value} = ruleSet;
if (!!value) { if (!!value) {
const currentSet = new RuleSet(name, $default, value); const currentSet = new RuleSet(name, $default, value);
console.log(currentSet.runProgram(tags)); console.log(currentSet.runProgram(tags));
} else { } else if (!!$multiply) {
const currentSet = new RuleSet(name, $default, {$multiply}); const currentSet = new RuleSet(name, $default, {$multiply});
// currentSet.toString(); console.log(currentSet.runProgram(tags));
} else if (!!$min) {
const currentSet = new RuleSet(name, $default, {$min});
console.log(currentSet.runProgram(tags)); console.log(currentSet.runProgram(tags));
} }
}; };
/* /*
console.info('Comfort') console.info('Comfort')
interpret("../Examples/bicycle/aspects/bicycle.comfort.json", tags1); interpret("./.routeExamples/bicycle.comfort.json", tags1);
interpret("../Examples/bicycle/aspects/bicycle.comfort.json", tags2); interpret("./.routeExamples/bicycle.comfort.json", tags2);
interpret("../Examples/bicycle/aspects/bicycle.comfort.json", tags3); interpret("./.routeExamples/bicycle.comfort.json", tags3);
interpret("../Examples/bicycle/aspects/bicycle.comfort.json", tags4); interpret("./.routeExamples/bicycle.comfort.json", tags4);
console.log('*******************') console.log('*******************')
console.info('Safety') console.info('Safety')
interpret("../Examples/bicycle/aspects/bicycle.safety.json", tags1); interpret("./.routeExamples/bicycle.safety.json", tags1);
interpret("../Examples/bicycle/aspects/bicycle.safety.json", tags2); interpret("./.routeExamples/bicycle.safety.json", tags2);
interpret("../Examples/bicycle/aspects/bicycle.safety.json", tags3); interpret("./.routeExamples/bicycle.safety.json", tags3);
interpret("../Examples/bicycle/aspects/bicycle.safety.json", tags4); interpret("./.routeExamples/bicycle.safety.json", tags4);
console.log('*******************') */ console.log('*******************') */
console.info('Legal Access') /* console.info('Legal Access')
interpret("../Examples/bicycle/aspects/bicycle.legal_access.json", tags1); interpret("./.routeExamples/bicycle.legal_access.json", tags1);
interpret("../Examples/bicycle/aspects/bicycle.legal_access.json", tags2); interpret("./.routeExamples/bicycle.legal_access.json", tags2);
interpret("../Examples/bicycle/aspects/bicycle.legal_access.json", tags3); interpret("./.routeExamples/bicycle.legal_access.json", tags3);
interpret("../Examples/bicycle/aspects/bicycle.legal_access.json", tags4); interpret("./.routeExamples/bicycle.legal_access.json", tags4);
interpret("../Examples/bicycle/aspects/bicycle.legal_access.json", tags5); interpret("./.routeExamples/bicycle.legal_access.json", tags5); */
// console.log('*******************')
// !TODO: Add default value = "no" as a fallback. Fix logic
console.log('*******************')
/* console.info('Speed Factor') /* console.info('Speed Factor')
interpret("./.routeExamples/bicycle.speed_factor.json", tags1); interpret("./.routeExamples/bicycle.speed_factor.json", tags1);
@ -92,4 +97,16 @@ interpret("./.routeExamples/bicycle.speed_factor.json", tags3);
interpret("./.routeExamples/bicycle.speed_factor.json", tags4); interpret("./.routeExamples/bicycle.speed_factor.json", tags4);
console.log('*******************') */ console.log('*******************') */
console.info('Test min')
/* interpret("./.routeExamples/bicycle.min_test.json", tags1);
interpret("./.routeExamples/bicycle.min_test.json", tags2);
interpret("./.routeExamples/bicycle.min_test.json", tags3);
interpret("./.routeExamples/bicycle.min_test.json", tags4); */
// interpret("./.routeExamples/bicycle.min_test.json", tags6);
const rawData = fs.readFileSync("./.routeExamples/bicycle.min_test.json");
const ruleSet = JSON.parse(rawData);
interpret(ruleSet, tags6);
console.log('*******************')
export default interpret; export default interpret;