scripts/mapping_geojson_to_osm_tags/mappings/engine.ts

326 lines
14 KiB
TypeScript
Raw Normal View History

2023-08-02 16:59:24 +02:00
import custom_utils from './utils'
2023-08-05 12:01:24 +02:00
import MappingConfigType from "./mapping-config.type";
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
2023-08-05 12:01:24 +02:00
constructor(mappingConfig: MappingConfigType) {
2023-08-02 13:20:50 +02:00
this.setConfig(mappingConfig)
}
2023-08-05 12:01:24 +02:00
setConfig(mappingConfig: MappingConfigType) {
2023-08-02 13:20:50 +02:00
this.mapping_config = mappingConfig
}
2023-08-05 12:01:24 +02:00
mapFeaturePoint(featurePointGeoJson: any) {
2023-08-02 13:20:50 +02:00
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 12:01:24 +02:00
isBooleanKey(pointKeyName: string): boolean {
2023-08-02 13:20:50 +02:00
return listOfBooleanKeys.indexOf(pointKeyName) !== -1
}
2023-08-05 15:11:22 +02:00
truthyValues = ['true', 'True', 'TRUE', '1', 'yes', 1]
falsyValues = ['false', 'False', 'FALSE', '0', 'no', 0]
2023-08-02 13:20:50 +02:00
2023-08-05 09:55:14 +02:00
/**
* reduce number of features
* @param offsetCount
* @param listOfFeatures
*/
2023-08-05 12:01:24 +02:00
filterFeaturesByOffset(offsetCount: number, listOfFeatures: any): Array<any> {
2023-08-02 13:20:50 +02:00
let filteredList = listOfFeatures
// TODO
return filteredList
}
2023-08-05 12:01:24 +02:00
// filterFeaturesByPropertyRegex(bboxConfig:any, listOfFeatures:any) {
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
2023-08-05 12:01:24 +02:00
filterFeaturesByPropertyRegex(propertyName: string, criteriaRegex: any, listOfFeatures: any) {
2023-08-05 12:05:52 +02:00
let filteredList = listOfFeatures.filter((feature: any) => {
2023-08-02 13:20:50 +02:00
return criteriaRegex.test(feature?.properties[propertyName])
})
return filteredList
}
/**
* retuns the converted element from mapping config if present, null otherwise
*/
2023-08-05 12:01:24 +02:00
mapElementFromConf(featurePoint: any): any {
2023-08-05 14:24:19 +02:00
// 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
2023-08-05 16:35:01 +02:00
let newProperties = {...this.mapping_config.default_properties_of_point}
2023-08-02 13:20:50 +02:00
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
2023-08-05 16:35:01 +02:00
basePoint.properties = {...this.mapping_config.default_properties_of_point}
2023-08-02 13:20:50 +02:00
// 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 14:24:19 +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-05 12:01:24 +02:00
convertProperty(pointKeyName: string, mappingKeys: any, featurePoint: any, newProperties: any) {
2023-08-05 13:45:31 +02:00
let originalValue = featurePoint.properties[pointKeyName]
2023-08-05 14:24:19 +02:00
let mappingValueObject: any = '';
2023-08-05 13:45:31 +02:00
2023-08-05 14:24:19 +02:00
if (mappingKeys.indexOf(pointKeyName) > 0) {
mappingValueObject = this.mapping_config.tags[pointKeyName]
debugLog('convertProperty: mappingValueObject ', mappingValueObject)
}
debugLog(' ------ convertProperty: pointKeyName', pointKeyName)
2023-08-05 12:05:52 +02:00
// debugLog('convertProperty: mappingKeys', mappingKeys)
2023-08-05 16:06:44 +02:00
if (this.mapping_config.add_not_mapped_tags_too && (mappingKeys.indexOf(pointKeyName) === -1)) {
/**
* add all unmapped tags is enabled
*/
newProperties[pointKeyName] = originalValue;
2023-08-02 13:20:50 +02:00
2023-08-05 16:06:44 +02:00
} else {
/**
* only use existing keys
*/
if (mappingKeys.indexOf(pointKeyName) > 0) {
let valueConvertedFromMapping = featurePoint.properties[pointKeyName]
let keyConvertedFromMapping = mappingKeys[mappingKeys.indexOf(pointKeyName)]
let mappingConfigOfTag = this.mapping_config.tags[pointKeyName]
2023-08-05 15:11:22 +02:00
2023-08-05 16:06:44 +02:00
debugLog('========== mappingConfigOfTag', mappingConfigOfTag)
debugLog('convertProperty: found element', pointKeyName, '=>', keyConvertedFromMapping, 'value : ', valueConvertedFromMapping)
let convertedValue = originalValue
2023-08-05 15:11:22 +02:00
2023-08-05 16:06:44 +02:00
let typeOfConfigForKey = typeof mappingConfigOfTag
let isStringValue = typeOfConfigForKey === 'string'
let isConfigMappingObject = typeOfConfigForKey === 'object'
2023-08-05 15:11:22 +02:00
2023-08-05 16:06:44 +02:00
debugLog('convertProperty: - typeofValue', typeOfConfigForKey)
debugLog('convertProperty: - pointKeyName', pointKeyName)
debugLog('convertProperty: - valueConvertedFromMapping', valueConvertedFromMapping)
debugLog('typeof valueConvertedFromMapping === \'string\'', typeOfConfigForKey)
2023-08-05 15:11:22 +02:00
2023-08-02 13:20:50 +02:00
2023-08-05 16:06:44 +02:00
debugLog('convertProperty: isStringValue?', valueConvertedFromMapping, isStringValue)
debugLog('convertProperty: isStringValue?', valueConvertedFromMapping, isStringValue)
2023-08-02 13:20:50 +02:00
2023-08-05 16:06:44 +02:00
debugLog('mappingConfigOfTag', mappingConfigOfTag)
debugLog('typeOfConfigForKey', typeOfConfigForKey)
/**
* conversion si la clé à une config d'une string, on ne change que la clé, pas la valeur
*/
if (isStringValue) {
debugLog('convertProperty: -- string value')
debugLog('convertProperty: -- string value')
2023-08-05 16:21:40 +02:00
debugLog('convertProperty: -- simple conversion : ', pointKeyName, '=> ', mappingConfigOfTag, '_', originalValue, '=>', valueConvertedFromMapping)
2023-08-05 16:06:44 +02:00
debugLog('convertProperty: -- convertedValue', convertedValue)
2023-08-02 13:20:50 +02:00
convertedValue = valueConvertedFromMapping
2023-08-05 16:06:44 +02:00
if (convertedValue) {
newProperties[mappingConfigOfTag] = convertedValue
}
} else {
debugLog('convertProperty: no string value')
2023-08-02 13:20:50 +02:00
}
2023-08-05 12:09:14 +02:00
2023-08-05 16:06:44 +02:00
if (isConfigMappingObject) {
let configObject = mappingConfigOfTag
2023-08-05 12:09:14 +02:00
2023-08-05 16:06:44 +02:00
debugLog('convertProperty: is config object', configObject)
let newKey: any = '' + pointKeyName
let remove_original_key = false;
2023-08-05 14:24:19 +02:00
2023-08-05 16:06:44 +02:00
if (configObject.key_converted) {
newKey = configObject.key_converted
2023-08-05 12:09:14 +02:00
2023-08-05 13:45:31 +02:00
}
2023-08-05 16:06:44 +02:00
if (configObject.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'
2023-08-05 16:21:40 +02:00
debugLog('truthy_value', originalValue)
2023-08-05 16:06:44 +02:00
if (this.truthyValues.indexOf(originalValue) !== -1) {
convertedValue = configObject.truthy_value
2023-08-05 12:09:14 +02:00
}
2023-08-05 16:06:44 +02:00
}
if (configObject.falsy_value) {
if (this.falsyValues.indexOf(originalValue) !== -1) {
convertedValue = configObject.falsy_value
2023-08-05 12:09:14 +02:00
}
2023-08-05 16:06:44 +02:00
}
2023-08-05 13:45:31 +02:00
2023-08-05 16:06:44 +02:00
/**
* conversion booléenne
*/
if (mappingValueObject.convert_to_boolean_value) {
debugLog('convertProperty: is boolean_value_conversion')
debugLog('convertProperty: ==========> original value', originalValue)
if (this.truthyValues.indexOf(originalValue) !== -1) {
convertedValue = 'yes'
2023-08-05 12:09:14 +02:00
}
2023-08-05 16:06:44 +02:00
if (this.falsyValues.indexOf(originalValue) !== -1) {
convertedValue = 'no'
2023-08-05 12:09:14 +02:00
}
2023-08-05 16:06:44 +02:00
} else {
debugLog('convertProperty: is NOT having boolean_value_conversion', mappingValueObject)
2023-08-05 15:11:22 +02:00
}
if (configObject.remove_original_key) {
remove_original_key = true
2023-08-05 12:09:14 +02:00
}
2023-08-05 16:06:44 +02:00
if (configObject.ignore_if_falsy && this.falsyValues.indexOf(originalValue) !== -1) {
remove_original_key = true
}
/**
* config pour une clé
* nous pouvons renseigner une string ou un objet décrivant les transformations à réaliser
*/
if (!remove_original_key && configObject.conditional_values) {
debugLog('convertProperty: conditional_values__________',
configObject.conditional_values)
let keysConditionnalValues: any = Object.keys(configObject.conditional_values)
let isFoundValue = keysConditionnalValues.indexOf(originalValue)
debugLog('isFoundValue', isFoundValue, originalValue)
debugLog('keysConditionnalValues', keysConditionnalValues)
2023-08-05 16:06:44 +02:00
2023-08-05 17:24:40 +02:00
if (isFoundValue > -1) {
2023-08-05 16:06:44 +02:00
let conditionnalConfig: any = configObject.conditional_values[keysConditionnalValues[isFoundValue]]
/** ----------------------
* gestion des valeurs conditionnelles
* ---------------------- */
debugLog('conditionnalConfig', conditionnalConfig)
2023-08-05 17:24:40 +02:00
if (conditionnalConfig.ignore_this_data) {
debugLog(`on ignore cette clé car sa valeur "${originalValue}" est à exclure: `, pointKeyName, '=>', newKey)
2023-08-05 17:24:40 +02:00
remove_original_key = true;
}
2023-08-05 16:06:44 +02:00
if (conditionnalConfig.tags_to_add) {
// on peut définir un ensemble de tags à rajouter
let tagKeys = Object.keys(conditionnalConfig.tags_to_add)
debugLog('conditionnalConfig.tags_to_add', conditionnalConfig.tags_to_add)
conditionnalConfig.tags_to_add.forEach((object: any, pair: any) => {
debugLog('object', object)
debugLog('pair', pair)
let key: any = Object.keys(object)
key = key[0]
let value = object[key]
debugLog('key', key)
debugLog('value', value)
newProperties[key] = value
})
}
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(originalValue) !== -1) {
convertedValue = conditionnalConfig.truthy_value
}
}
if (conditionnalConfig.falsy_value) {
if (this.falsyValues.indexOf(originalValue) !== -1) {
convertedValue = conditionnalConfig.falsy_value
}
}
if (conditionnalConfig.transform_function) {
// une transformation de la valeur
// apply transformation to value
convertedValue = conditionnalConfig.transform_function(originalValue)
}
// use the value converted
else if (conditionnalConfig.value_converted) {
convertedValue = conditionnalConfig.value_converted
}
}
}
2023-08-05 12:09:14 +02:00
2023-08-05 16:06:44 +02:00
debugLog('convertProperty: convertedValue ==========> {', newKey, ':', convertedValue, '}')
debugLog(' =============== remove_original_key',newKey, remove_original_key)
2023-08-05 16:06:44 +02:00
if (!remove_original_key && newKey && convertedValue && !configObject.ignore_this_data) {
2023-08-05 14:24:19 +02:00
2023-08-05 16:06:44 +02:00
debugLog('convertProperty: added')
2023-08-05 17:24:40 +02:00
newProperties[newKey] = convertedValue.trim()
2023-08-05 16:06:44 +02:00
}
2023-08-05 12:09:14 +02:00
}
}
2023-08-02 13:20:50 +02:00
}
2023-08-05 16:06:44 +02:00
2023-08-02 13:20:50 +02:00
}
}