scripts/mapping_geojson_to_osm_tags/mappings/engine.ts

221 lines
8.9 KiB
TypeScript
Raw Normal View History

2023-08-02 16:59:24 +02:00
import custom_utils from './utils'
2023-08-02 13:20:50 +02:00
const {debugLog} = custom_utils
2023-08-05 09:55:14 +02:00
let listOfBooleanKeys = [
"prise_type_ef",
"prise_type_2",
"prise_type_combo_ccs",
"prise_type_chademo",
"gratuit",
"paiement_acte",
"paiement_cb",
"cable_t2_attache"
]
2023-08-02 13:20:50 +02:00
export default class {
2023-08-05 09:55:14 +02:00
mapping_config: any = {}
2023-08-02 13:20:50 +02:00
constructor(mappingConfig) {
this.setConfig(mappingConfig)
}
setConfig(mappingConfig) {
this.mapping_config = mappingConfig
}
mapFeaturePoint(featurePointGeoJson) {
2023-08-05 09:55:14 +02:00
let geoJSONConvertedPoint: any = {}
2023-08-02 13:20:50 +02:00
geoJSONConvertedPoint.properties = {...this.mapping_config.default_properties_of_point}
geoJSONConvertedPoint.type = featurePointGeoJson.type
geoJSONConvertedPoint.geometry = featurePointGeoJson.geometry
2023-08-05 11:52:25 +02:00
// let props = featurePointGeoJson.properties
2023-08-02 13:20:50 +02:00
2023-08-05 11:52:25 +02:00
// props.forEach((key, value) => {
//
// })
2023-08-02 13:20:50 +02:00
return geoJSONConvertedPoint
}
/**
* TODO convert to mapping config property to transform_truthy
* @param pointKeyName
* @returns {boolean}
*/
2023-08-05 09:55:14 +02:00
isBooleanKey(pointKeyName): boolean {
2023-08-02 13:20:50 +02:00
return listOfBooleanKeys.indexOf(pointKeyName) !== -1
}
truthyValues = ['true', 'True', 'TRUE', '1', 1]
falsyValues = ['false', 'False', 'FALSE', '0', 0]
2023-08-05 09:55:14 +02:00
/**
* reduce number of features
* @param offsetCount
* @param listOfFeatures
*/
filterFeaturesByOffset(offsetCount: number, listOfFeatures): Array<any> {
2023-08-02 13:20:50 +02:00
let filteredList = listOfFeatures
// TODO
return filteredList
}
2023-08-05 09:55:14 +02:00
// filterFeaturesByPropertyRegex(bboxConfig, listOfFeatures) {
2023-08-05 11:52:25 +02:00
// debugLog('bboxConfig', bboxConfig)
2023-08-05 09:55:14 +02:00
// let filteredList = listOfFeatures
// // TODO
// return filteredList
// }
2023-08-02 13:20:50 +02:00
filterFeaturesByPropertyRegex(propertyName, criteriaRegex, listOfFeatures) {
let filteredList = listOfFeatures.filter(feature => {
return criteriaRegex.test(feature?.properties[propertyName])
})
return filteredList
}
/**
* retuns the converted element from mapping config if present, null otherwise
*/
2023-08-05 11:52:25 +02:00
mapElementFromConf(featurePoint: any):any {
debugLog('mapElementFromConf: mapElementFromConf',featurePoint)
2023-08-02 13:20:50 +02:00
if (!this.mapping_config) {
throw new Error('no config was loaded in the mapping engine. use setConfig(my_mapping_config) on this instance of mapping engine before using this.')
}
2023-08-05 11:52:25 +02:00
debugLog('mapElementFromConf: config_name', this.mapping_config.config_name)
2023-08-02 13:20:50 +02:00
let mappingKeys = Object.keys(this.mapping_config.tags)
let featurePointPropertiesKeys = Object.keys(featurePoint.properties)
2023-08-05 11:52:25 +02:00
debugLog('mapElementFromConf: ============= keys mappingKeys:', this.mapping_config.tags.length, mappingKeys.length)
debugLog('mapElementFromConf: ============= keys featurePointPropertiesKeys :', featurePoint.properties.length, featurePointPropertiesKeys.length)
2023-08-02 13:20:50 +02:00
let newProperties = Object.create(this.mapping_config.default_properties_of_point)
2023-08-05 11:52:25 +02:00
2023-08-02 13:20:50 +02:00
// reinit properties of current point
let basePoint = Object.create(featurePoint)
basePoint.type = featurePoint.type
basePoint.geometry = featurePoint.geometry
// apply new properties if found in mapping config
featurePointPropertiesKeys.forEach(pointKeyName => {
2023-08-05 11:52:25 +02:00
debugLog('mapElementFromConf: convert', pointKeyName)
2023-08-02 13:20:50 +02:00
this.convertProperty(pointKeyName, mappingKeys, featurePoint, newProperties)
})
basePoint.properties = newProperties
2023-08-05 11:52:25 +02:00
debugLog('mapElementFromConf: basePoint', basePoint)
2023-08-02 13:20:50 +02:00
return basePoint
}
2023-08-05 11:52:25 +02:00
/**
* convertit une propriété en une autre selon la config de mapping
* @param pointKeyName
* @param mappingKeys
* @param featurePoint
* @param newProperties
*/
2023-08-02 13:20:50 +02:00
convertProperty(pointKeyName, mappingKeys, featurePoint, newProperties) {
2023-08-05 11:52:25 +02:00
debugLog('convertProperty: pointKeyName', pointKeyName)
debugLog('convertProperty: mappingKeys', mappingKeys)
2023-08-02 13:20:50 +02:00
if (!mappingKeys.indexOf(pointKeyName) !== -1) {
2023-08-05 11:52:25 +02:00
debugLog('convertProperty: found element', pointKeyName, '=>', this.mapping_config[pointKeyName], 'value : ', featurePoint.properties[pointKeyName])
2023-08-02 13:20:50 +02:00
let convertedValue = ''
let valueConvertedFromMapping = featurePoint.properties[pointKeyName]
let typeofValue = typeof valueConvertedFromMapping
let isStringValue = typeofValue === 'string'
2023-08-05 11:52:25 +02:00
debugLog('convertProperty: - typeofValue', typeofValue)
debugLog('convertProperty: - pointKeyName', pointKeyName)
debugLog('convertProperty: - valueConvertedFromMapping', valueConvertedFromMapping)
2023-08-02 13:20:50 +02:00
// debugLog('typeof featurePoint.properties[pointKeyName] === \'string\'', typeofValue)
let isConfigMappingObject = typeofValue === 'string'
2023-08-05 11:52:25 +02:00
debugLog('convertProperty: isStringValue?', isStringValue)
2023-08-02 13:20:50 +02:00
if (isStringValue) {
2023-08-05 11:52:25 +02:00
debugLog('convertProperty: -- string value')
2023-08-02 13:20:50 +02:00
if (this.isBooleanKey(pointKeyName)) {
let lowerValue = (valueConvertedFromMapping + '').toLowerCase()
2023-08-05 11:52:25 +02:00
debugLog('convertProperty: isBooleanKey: lowerValue', lowerValue)
2023-08-02 13:20:50 +02:00
convertedValue = this.truthyValues.indexOf(lowerValue) ? 'yes' : 'no'
} else {
convertedValue = valueConvertedFromMapping
}
2023-08-05 11:52:25 +02:00
debugLog('convertProperty: -- convertedValue', convertedValue)
2023-08-02 13:20:50 +02:00
if (convertedValue) {
newProperties[this.mapping_config[pointKeyName]] = convertedValue
}
2023-08-05 11:52:25 +02:00
}
2023-08-05 09:55:14 +02:00
2023-08-05 11:52:25 +02:00
else if(isConfigMappingObject){
debugLog('convertProperty: is config object')
}
else{
debugLog('convertProperty: no string value')
2023-08-02 13:20:50 +02:00
}
2023-08-05 11:52:25 +02:00
// TODO handle config object for complex mapping
// else if (isConfigMappingObject) {
// let newKey = ''
// let configObject = valueConvertedFromMapping
//
// if (configObject.key_converted) {
// newKey = configObject.key_converted
// }
//
// /**
// * gestion des valeurs conditionnelles
// * nous pouvons renseigner une string ou un objet décrivant les transformations à réaliser
// */
// if (configObject.conditional_values) {
// let keysConditionnalValues = Object.keys(configObject.conditional_values)
// let isFoundValue = keysConditionnalValues.indexOf(valueConvertedFromMapping)
// if (isFoundValue !== -1) {
// let conditionnalConfig :any = keysConditionnalValues[isFoundValue]
//
// if (conditionnalConfig.tags_to_add) {
// // on peut définir un ensemble de tags à rajouter
// newProperties.push(...conditionnalConfig.tags_to_add)
// }
// if (conditionnalConfig.truthy_value) {
// // convertir la valeur, si elle est truthy, la transformer en ce que donne la propriété truthy_value
// // exemple: le jeu de données dit que la colonne cable_t2_attache vaut "True", mais on veut le convertir en "1".
// // on met donc truthy_value: '1'
// if (this.truthyValues.indexOf(valueConvertedFromMapping) !== -1) {
// convertedValue = conditionnalConfig.truthy_value
// }
// }
// if (conditionnalConfig.falsy_value) {
// if (this.falsyValues.indexOf(valueConvertedFromMapping) !== -1) {
// convertedValue = conditionnalConfig.falsy_value
// }
// }
// if (conditionnalConfig.transform_function) {
// // une transformation de la valeur
// // apply transformation to value
// convertedValue = conditionnalConfig.transform_function(valueConvertedFromMapping)
// }
// // use the value converted
// else if (conditionnalConfig.value_converted) {
// convertedValue = conditionnalConfig.value_converted
// }
// }
// }
//
// if (newKey && !configObject.ignore_this_data) {
// newProperties[newKey] = convertedValue
// }
// }
2023-08-02 13:20:50 +02:00
}
}
}