Adds first version for min & max | Needs review
This commit is contained in:
parent
2ba01713ef
commit
9c31a92abd
2 changed files with 101 additions and 29 deletions
|
@ -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;
|
||||||
|
@ -42,6 +44,16 @@ class RuleSet {
|
||||||
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue