From fcbb5f6ec169b3ad3ea549d370ee0702ed06a9c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Rodrigo?= Date: Tue, 11 Jun 2019 19:07:29 +0200 Subject: [PATCH] Better select in analyser_merge_shop_FR & move mapping to json #338 --- analysers/analyser_merge_shop_FR.py | 30 +- merge_data/shop_FR.mapping.csv | 61 -- merge_data/shop_FR.mapping.json | 953 ++++++++++++++++++++++++++++ 3 files changed, 965 insertions(+), 79 deletions(-) delete mode 100644 merge_data/shop_FR.mapping.csv create mode 100644 merge_data/shop_FR.mapping.json diff --git a/analysers/analyser_merge_shop_FR.py b/analysers/analyser_merge_shop_FR.py index c9b0a8be4..e3191445d 100644 --- a/analysers/analyser_merge_shop_FR.py +++ b/analysers/analyser_merge_shop_FR.py @@ -22,6 +22,7 @@ from io import open # In python3 only, this import is not required from backports import csv # In python3 only just "import csv" +import json from .Analyser_Merge_Dynamic import Analyser_Merge_Dynamic, SubAnalyser_Merge_Dynamic from .Analyser_Merge import Source, CSV, Load, Mapping, Select, Generate from time import gmtime, strftime @@ -32,33 +33,26 @@ class Analyser_Merge_Shop_FR(Analyser_Merge_Dynamic): def __init__(self, config, logger = None): Analyser_Merge_Dynamic.__init__(self, config, logger) - with open("merge_data/shop_FR.mapping.csv") as mappingfile: - spamreader = csv.reader(mappingfile) - for row in spamreader: - if row[0][0] == '#': - continue - items, classs, level, title = row[0:4] - items = items.split('|') - level = int(level) - osmTags = filter(lambda a: a, map(lambda t: (t.split('=') + [None])[0:2] if t else None, row[4:])) - if len(osmTags) > 0: - self.classFactory(SubAnalyser_Merge_Shop_FR, classs.replace('.', ''), items, classs, level, title, dict(osmTags), dict(filter(lambda a: a[1], osmTags))) + mapping = 'merge_data/shop_FR.mapping.json' + mapingfile = json.loads(open(mapping).read()) + for r in mapingfile: + self.classFactory(SubAnalyser_Merge_Shop_FR, r['class'].replace('.', ''), r['missing_official'], r['missing_osm'], r['class'], r['level'], r['title'], r['match'], r['generate']) class SubAnalyser_Merge_Shop_FR(SubAnalyser_Merge_Dynamic): - def __init__(self, config, error_file, logger, items, classs, level, title, selectTags, generateTags): + def __init__(self, config, error_file, logger, missing_official, missing_osm, classs, level, title, selectTags, generateTags): classss = int(classs.replace('.', '0')[:-1]) * 100 + ord(classs[-1]) - 65 - self.missing_official = {"item": items[0], "class": classss+1, "level": level, "tag": ["merge"], "desc": T_(u"%s not integrated", title) } - #self.missing_osm = {"item": items[1], "class": classss+2, "level": level, "tag": ["merge"], "desc": T_f(u"{0} without tag \"{1}\" or invalid", title, 'ref:FR:SIRET') } - #self.possible_merge = {"item": items[0][0:-1]+"1", "class": classss+3, "level": level, "tag": ["merge"], "desc": T_(u"%s, integration suggestion", title) } - #self.update_official = {"item": items[0][0:-1]+"2", "class": classss+4, "level": level, "tag": ["merge"], "desc": T_(u"%s update", title) } + self.missing_official = {"item": missing_official, "class": classss+1, "level": level, "tag": ["merge"], "desc": T_(u"%s not integrated", title) } + #self.missing_osm = {"item": missing_osm, "class": classss+2, "level": level, "tag": ["merge"], "desc": T_f(u"{0} without tag \"{1}\" or invalid", title, 'ref:FR:SIRET') } + #self.possible_merge = {"item": missing_official[0:-1]+"1", "class": classss+3, "level": level, "tag": ["merge"], "desc": T_(u"%s, integration suggestion", title) } + #self.update_official = {"item": missing_official[0:-1]+"2", "class": classss+4, "level": level, "tag": ["merge"], "desc": T_(u"%s update", title) } dep_code = config.options.get('country').split('-')[1] SubAnalyser_Merge_Dynamic.__init__(self, config, error_file, logger, u"http://www.sirene.fr/sirene/public/static/open-data", u"Sirene", - CSV(Source(attribution = u"INSEE", millesime = "06/2018", gzip = True, + CSV(Source(attribution = u"INSEE", millesime = "06/2019", gzip = True, fileUrl = u"http://data.cquest.org/geo_sirene/v2019/last/dep/geo_siret_{0}.csv.gz".format(dep_code))), Load("longitude", "latitude", select = {"activitePrincipaleEtablissement": classs, "geo_type": "housenumber", "etatAdministratifEtablissement": "A"}, @@ -81,4 +75,4 @@ def __init__(self, config, error_file, logger, items, classs, level, title, sele # "-".join([fields["DDEBACT"][0:4], fields["DDEBACT"][4:6], fields["DDEBACT"][6:8]]) if fields["DDEBACT"] != "19000101" else # "-".join([fields["DCRET"][0:4], fields["DCRET"][4:6], fields["DCRET"][6:8]]) if fields["DCRET"] != "19000101" else # None}, - text = lambda tags, fields: {"en": ', '.join(filter(lambda f: f and f != 'None', [fields["enseigne1Etablissement"] or fields["denominationUsuelleEtablissement"]] + map(lambda k: fields[k], ["numeroVoieEtablissement", "indiceRepetitionEtablissement" ,"typeVoieEtablissement", "libelleVoieEtablissement", "complementAdresseEtablissement", "codePostalEtablissement", "libelleCommuneEtablissement"])))} ))) + text = lambda tags, fields: {"en": ', '.join(filter(lambda f: f and f != 'None', [fields["enseigne1Etablissement"] or fields["denominationUsuelleEtablissement"]] + list(map(lambda k: fields[k], ["numeroVoieEtablissement", "indiceRepetitionEtablissement" ,"typeVoieEtablissement", "libelleVoieEtablissement", "complementAdresseEtablissement", "codePostalEtablissement", "libelleCommuneEtablissement"]))))} ))) diff --git a/merge_data/shop_FR.mapping.csv b/merge_data/shop_FR.mapping.csv deleted file mode 100644 index 207b535c2..000000000 --- a/merge_data/shop_FR.mapping.csv +++ /dev/null @@ -1,61 +0,0 @@ -8310|7210,10.71C,3,Boulangerie et boulangerie-pâtisserie,shop=bakery,, -8310|7210,10.71D,3,Pâtisserie,shop=pastry,, -8310|7210,45.11Z,3,Commerce de voitures et de véhicules automobiles légers,shop=car,, -8310|7210,45.19Z,3,Commerce d'autres véhicules automobiles,shop=car,, -8310|7210,45.20A,3,Entretien et réparation de véhicules automobiles,shop=car_repair,, -8310|7210,45.32Z,3,Commerce de détail d'équipements automobiles,shop=car_parts,, -8310|7210,45.40Z,3,Commerce et réparation de motocycles,shop=motorcycle;motorcycle_repair,note=FIXME select a shop type, -8310|7210,47.11A,3,Commerce de détail de produits surgelés,shop=frozen_food,, -8310|7210,47.11C,3,Supérettes,shop=convenience,, -8310|7210,47.11D,3,Supermarchés,shop=supermarket,, -8310|7210,47.11F,3,Hypermarchés,shop=supermarket,, -8310|7210,47.19A,3,Grands magasins,shop=department_store,, -8310|7210,47.21Z,3,Commerce de détail de fruits et légumes en magasin spécialisé,shop=grocery,, -8310|7210,47.22Z,3,Commerce de détail de viandes et de produits à base de viande en magasin spécialisé,shop=butcher,, -8310|7210,47.23Z,3,"Commerce de détail de poissons, crustacés et mollusques en magasin spécialisé",shop=seafood,, -8310|7210,47.24Z,3,"Commerce de détail de pain, pâtisserie et confiserie en magasin spécialisé",shop=bakery,, -8310|7210,47.25Z,3,Commerce de détail de boissons en magasin spécialisé,shop=beverages,, -8310|7210,47.26Z,3,Commerce de détail de produits à base de tabac en magasin spécialisé,shop=tobacco,, -8310|7210,47.30Z,3,Commerce de détail de carburants en magasin spécialisé,amenity=fuel,, -8310|7210,47.41Z,3,"Commerce de détail d'ordinateurs, d'unités périphériques et de logiciels en magasin spécialisé",shop=computer,, -8310|7210,47.42Z,3,Commerce de détail de matériels de télécommunication en magasin spécialisé,shop=mobile_phone,, -8310|7210,47.43Z,3,Commerce de détail de matériels audio et vidéo en magasin spécialisé,shop=hifi,, -8310|7210,47.51Z,3,Commerce de détail de textiles en magasin spécialisé,shop=fabric,, -8310|7210,47.53Z,3,"Commerce de détail de tapis, moquettes et revêtements de murs et de sols en magasin spécialisé",shop=carpet,, -8310|7210,47.59A,3,Commerce de détail de meubles,shop=furniture,, -8310|7210,47.61Z,3,Commerce de détail de livres en magasin spécialisé,shop=books,, -8310|7210,47.62Z,3,Commerce de détail de journaux et papeterie en magasin spécialisé,shop=newsagent,, -8310|7210,47.63Z,3,Commerce de détail d'enregistrements musicaux et vidéo en magasin spécialisé,shop=music;video,note=FIXME select a shop type, -8310|7210,47.64Z,3,Commerce de détail d'articles de sport en magasin spécialisé,shop=sports,, -8310|7210,47.65Z,3,Commerce de détail de jeux et jouets en magasin spécialisé,shop=toys,, -8310|7210,47.71Z,3,Commerce de détail d'habillement en magasin spécialisé,shop=clothes,, -8310|7210,47.72A,3,Commerce de détail de la chaussure,shop=shoes,, -8310|7210,47.72B,3,Commerce de détail de maroquinerie et d'articles de voyage,shop=bag,, -8310|7210,47.73Z,3,Commerce de détail de produits pharmaceutiques en magasin spécialisé,amenity=pharmacy,, -8310|7210,47.75Z,3,Commerce de détail de parfumerie et de produits de beauté en magasin spécialisé,shop=perfumery,, -8310|7210,47.76Z,3,"Commerce de détail de fleurs, plantes, graines, engrais, animaux de compagnie et aliments pour ces animaux en magasin spécialisé",shop=florist;pet,note=FIXME select a shop type, -8310|7210,47.77Z,3,Commerce de détail d'articles d'horlogerie et de bijouterie en magasin spécialisé,shop=watches;jewelry,note=FIXME select a shop type, -8310|7210,47.78A,3,Commerces de détail d'optique,shop=optician,, -8310|7210,47.79Z,3,Commerce de détail de biens d'occasion en magasin,shop=second_hand,, -8310|7210,55.10Z,3,Hôtels et hébergement similaire,tourism=hotel,, -8310|7210,55.30Z,3,Terrains de camping et parcs pour caravanes ou véhicules de loisirs,tourism=camp_site,, -8310|7210,56.10A,3,Restauration traditionnelle,amenity=restaurant,, -8310|7210,56.10C,3,Restauration de type rapide,amenity=fast-food,, -8310|7210,56.30Z,3,Débits de boissons,amenity=bar;cafe;pub,note=FIXME select an amenity type, -8310|7210,59.14Z,3,Projection de films cinématographiques,amenity=cinema,, -8310|7210,71.11Z,3,Activités d'architecture ,office=architect,, -8310|7210,71.12A,3,Activité des géomètres,office=surveyor,, -8310|7210,75.00Z,3,Activités vétérinaires,amenity=veterinary,, -8310|7210,77.22Z,3,Location de vidéocassettes et disques vidéo,shop=video,, -8310|7210,78.10Z,3,Activités des agences de placement de main-d'œuvre ,office=employment_agency,, -8310|7210,79.11Z,3,Activités des agences de voyage,shop=travel_agency,, -8310|7210,86.10Z,3,Activités hospitalières,amenity=hospital,, -8310|7210,86.21Z,3,Activité des médecins généralistes,amenity=doctors,, -8310|7210,86.23Z,3,Pratique dentaire,amenity=dentist,, -8310|7210,87.30A,3,Hébergement social pour personnes âgées,amenity=social_facility,social_facility=group_home,social_facility:for=senior -8310|7210,87.30B,3,Hébergement social pour handicapés physiques,amenity=social_facility,social_facility=group_home,social_facility:for=disabled -8310|7210,87.90A,3,Hébergement social pour enfants en difficultés ,amenity=social_facility,social_facility=group_home,social_facility:for=child -8310|7210,87.90B,3,Hébergement social pour adultes et familles en difficultés et autre hébergement social ,amenity=social_facility,social_facility=group_home,social_facility:for=underprivileged -8310|7210,96.02A,3,Coiffure,shop=hairdresser,, -8310|7210,96.02B,3,Soins de beauté,shop=beauty,, -8310|7210,96.03Z,3,Services funéraires,shop=funeral_directors,, diff --git a/merge_data/shop_FR.mapping.json b/merge_data/shop_FR.mapping.json new file mode 100644 index 000000000..b9ba9c0b2 --- /dev/null +++ b/merge_data/shop_FR.mapping.json @@ -0,0 +1,953 @@ +[ + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "10.71C", + "level": 3, + "title": "Boulangerie et boulangerie-pâtisserie", + "match": [ + { + "shop": "bakery" + } + ], + "generate": { + "shop": "bakery" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "10.71D", + "level": 3, + "title": "Pâtisserie", + "match": [ + { + "shop": "pastry" + } + ], + "generate": { + "shop": "pastry" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "45.20A", + "level": 3, + "title": "Entretien et réparation de véhicules automobiles", + "match": [ + { + "shop": "car_repair" + } + ], + "generate": { + "shop": "car_repair" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "45.32Z", + "level": 3, + "title": "Commerce de détail d'équipements automobiles", + "match": [ + { + "shop": "car_parts" + } + ], + "generate": { + "shop": "car_parts" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "45.40Z", + "level": 3, + "title": "Commerce et réparation de motocycles", + "match": [ + { + "shop": "motorcycle" + }, + { + "shop": "motorcycle_repair" + } + ], + "generate": { + "shop": "motorcycle;motorcycle_repair", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.11A", + "level": 3, + "title": "Commerce de détail de produits surgelés", + "match": [ + { + "shop": "frozen_food" + } + ], + "generate": { + "shop": "frozen_food" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.11C", + "level": 3, + "title": "Supérettes", + "match": [ + { + "shop": "convenience" + } + ], + "generate": { + "shop": "convenience" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.11D", + "level": 3, + "title": "Supermarchés", + "match": [ + { + "shop": "supermarket" + } + ], + "generate": { + "shop": "supermarket" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.11F", + "level": 3, + "title": "Hypermarchés", + "match": [ + { + "shop": "supermarket" + } + ], + "generate": { + "shop": "supermarket" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.19A", + "level": 3, + "title": "Grands magasins", + "match": [ + { + "shop": "department_store" + } + ], + "generate": { + "shop": "department_store" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.21Z", + "level": 3, + "title": "Commerce de détail de fruits et légumes en magasin spécialisé", + "match": [ + { + "shop": "grocery" + }, + { + "shop": "farm" + }, + { + "shop": "greengrocer" + } + ], + "generate": { + "shop": "grocery;farm;greengrocer", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.22Z", + "level": 3, + "title": "Commerce de détail de viandes et de produits à base de viande en magasin spécialisé", + "match": [ + { + "shop": "butcher" + } + ], + "generate": { + "shop": "butcher" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.23Z", + "level": 3, + "title": "Commerce de détail de poissons, crustacés et mollusques en magasin spécialisé", + "match": [ + { + "shop": "seafood" + } + ], + "generate": { + "shop": "seafood" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.24Z", + "level": 3, + "title": "Commerce de détail de pain, pâtisserie et confiserie en magasin spécialisé", + "match": [ + { + "shop": "bakery" + } + ], + "generate": { + "shop": "bakery" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.25Z", + "level": 3, + "title": "Commerce de détail de boissons en magasin spécialisé", + "match": [ + { + "shop": "beverages" + } + ], + "generate": { + "shop": "beverages" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.26Z", + "level": 3, + "title": "Commerce de détail de produits à base de tabac en magasin spécialisé", + "match": [ + { + "shop": "tobacco" + } + ], + "generate": { + "shop": "tobacco" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.30Z", + "level": 3, + "title": "Commerce de détail de carburants en magasin spécialisé", + "match": [ + { + "amenity": "fuel" + } + ], + "generate": { + "amenity": "fuel" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.41Z", + "level": 3, + "title": "Commerce de détail d'ordinateurs, d'unités périphériques et de logiciels en magasin spécialisé", + "match": [ + { + "shop": "computer" + }, + { + "shop": "video_games" + } + ], + "generate": { + "shop": "computer;video_games", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.42Z", + "level": 3, + "title": "Commerce de détail de matériels de télécommunication en magasin spécialisé", + "match": [ + { + "shop": "mobile_phone" + } + ], + "generate": { + "shop": "mobile_phone" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.43Z", + "level": 3, + "title": "Commerce de détail de matériels audio et vidéo en magasin spécialisé", + "match": [ + { + "shop": "hifi" + } + ], + "generate": { + "shop": "hifi" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.51Z", + "level": 3, + "title": "Commerce de détail de textiles en magasin spécialisé", + "match": [ + { + "shop": "fabric" + }, + { + "shop": "fabric" + } + ], + "generate": { + "shop": "fabric;wool", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.53Z", + "level": 3, + "title": "Commerce de détail de tapis, moquettes et revêtements de murs et de sols en magasin spécialisé", + "match": [ + { + "shop": "carpet" + } + ], + "generate": { + "shop": "carpet" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.59A", + "level": 3, + "title": "Commerce de détail de meubles", + "match": [ + { + "shop": "furniture" + }, + { + "shop": "furniture" + } + ], + "generate": { + "shop": "furniture;kitchen", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.61Z", + "level": 3, + "title": "Commerce de détail de livres en magasin spécialisé", + "match": [ + { + "shop": "books" + } + ], + "generate": { + "shop": "books" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.62Z", + "level": 3, + "title": "Commerce de détail de journaux et papeterie en magasin spécialisé", + "match": [ + { + "shop": "newsagent" + } + ], + "generate": { + "shop": "newsagent" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.63Z", + "level": 3, + "title": "Commerce de détail d'enregistrements musicaux et vidéo en magasin spécialisé", + "match": [ + { + "shop": "music" + }, + { + "shop": "video" + } + ], + "generate": { + "shop": "music;video", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.64Z", + "level": 3, + "title": "Commerce de détail d'articles de sport en magasin spécialisé", + "match": [ + { + "shop": "sports" + }, + { + "shop": "outdoor" + } + ], + "generate": { + "shop": "sports;outdoor", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.65Z", + "level": 3, + "title": "Commerce de détail de jeux et jouets en magasin spécialisé", + "match": [ + { + "shop": "toys" + }, + { + "shop": "games" + } + ], + "generate": { + "shop": "toys;games", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.71Z", + "level": 3, + "title": "Commerce de détail d'habillement en magasin spécialisé", + "match": [ + { + "shop": "clothes" + } + ], + "generate": { + "shop": "clothes" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.72A", + "level": 3, + "title": "Commerce de détail de la chaussure", + "match": [ + { + "shop": "shoes" + } + ], + "generate": { + "shop": "shoes" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.72B", + "level": 3, + "title": "Commerce de détail de maroquinerie et d'articles de voyage", + "match": [ + { + "shop": "bag" + } + ], + "generate": { + "shop": "bag" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.73Z", + "level": 3, + "title": "Commerce de détail de produits pharmaceutiques en magasin spécialisé", + "match": [ + { + "amenity": "pharmacy" + } + ], + "generate": { + "amenity": "pharmacy" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.75Z", + "level": 3, + "title": "Commerce de détail de parfumerie et de produits de beauté en magasin spécialisé", + "match": [ + { + "shop": "perfumery" + } + ], + "generate": { + "shop": "perfumery" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.76Z", + "level": 3, + "title": "Commerce de détail de fleurs, plantes, graines, engrais, animaux de compagnie et aliments pour ces animaux en magasin spécialisé", + "match": [ + { + "shop": "florist" + }, + { + "shop": "pet" + } + ], + "generate": { + "shop": "florist;pet", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.77Z", + "level": 3, + "title": "Commerce de détail d'articles d'horlogerie et de bijouterie en magasin spécialisé", + "match": [ + { + "shop": "watches" + }, + { + "shop": "jewelry" + } + ], + "generate": { + "shop": "watches;jewelry", + "note": "FIXME select a shop type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.78A", + "level": 3, + "title": "Commerces de détail d'optique", + "match": [ + { + "shop": "optician" + } + ], + "generate": { + "shop": "optician" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "47.79Z", + "level": 3, + "title": "Commerce de détail de biens d'occasion en magasin", + "match": [ + { + "shop": "second_hand" + } + ], + "generate": { + "shop": "second_hand" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "55.10Z", + "level": 3, + "title": "Hôtels et hébergement similaire", + "match": [ + { + "tourism": "hotel" + } + ], + "generate": { + "tourism": "hotel" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "55.30Z", + "level": 3, + "title": "Terrains de camping et parcs pour caravanes ou véhicules de loisirs", + "match": [ + { + "tourism": "camp_site" + } + ], + "generate": { + "tourism": "camp_site" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "56.10A", + "level": 3, + "title": "Restauration traditionnelle", + "match": [ + { + "amenity": "restaurant" + } + ], + "generate": { + "amenity": "restaurant" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "56.10C", + "level": 3, + "title": "Restauration de type rapide", + "match": [ + { + "amenity": "fast_food" + } + ], + "generate": { + "amenity": "fast_food" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "56.30Z", + "level": 3, + "title": "Débits de boissons", + "match": [ + { + "amenity": "bar" + }, + { + "amenity": "cafe" + }, + { + "amenity": "pub" + } + ], + "generate": { + "amenity": "bar;cafe;pub", + "note": "FIXME select an amenity type" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "59.14Z", + "level": 3, + "title": "Projection de films cinématographiques", + "match": [ + { + "amenity": "cinema" + } + ], + "generate": { + "amenity": "cinema" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "71.11Z", + "level": 3, + "title": "Activités d'architecture", + "match": [ + { + "office": "architect" + } + ], + "generate": { + "office": "architect" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "71.12A", + "level": 3, + "title": "Activité des géomètres", + "match": [ + { + "office": "surveyor" + } + ], + "generate": { + "office": "surveyor" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "75.00Z", + "level": 3, + "title": "Activités vétérinaires", + "match": [ + { + "amenity": "veterinary" + } + ], + "generate": { + "amenity": "veterinary" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "77.22Z", + "level": 3, + "title": "Location de vidéocassettes et disques vidéo", + "match": [ + { + "shop": "video" + } + ], + "generate": { + "shop": "video" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "78.10Z", + "level": 3, + "title": "Activités des agences de placement de main-d'œuvre", + "match": [ + { + "office": "employment_agency" + } + ], + "generate": { + "office": "employment_agency" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "79.11Z", + "level": 3, + "title": "Activités des agences de voyage", + "match": [ + { + "shop": "travel_agency" + } + ], + "generate": { + "shop": "travel_agency" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "86.10Z", + "level": 3, + "title": "Activités hospitalières", + "match": [ + { + "amenity": "hospital" + } + ], + "generate": { + "amenity": "hospital" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "86.21Z", + "level": 3, + "title": "Activité des médecins généralistes", + "match": [ + { + "amenity": "doctors" + } + ], + "generate": { + "amenity": "doctors" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "86.23Z", + "level": 3, + "title": "Pratique dentaire", + "match": [ + { + "amenity": "dentist" + } + ], + "generate": { + "amenity": "dentist" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "87.30A", + "level": 3, + "title": "Hébergement social pour personnes âgées", + "match": [ + { + "amenity": "social_facility", + "social_facility": "group_home", + "social_facility:for": "senior" + } + ], + "generate": { + "amenity": "social_facility", + "social_facility": "group_home", + "social_facility:for": "senior" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "87.30B", + "level": 3, + "title": "Hébergement social pour handicapés physiques", + "match": [ + { + "amenity": "social_facility", + "social_facility": "group_home", + "social_facility:for": "disabled" + } + ], + "generate": { + "amenity": "social_facility", + "social_facility": "group_home", + "social_facility:for": "disabled" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "87.90A", + "level": 3, + "title": "Hébergement social pour enfants en difficultés", + "match": [ + { + "amenity": "social_facility", + "social_facility": "group_home", + "social_facility:for": "child" + } + ], + "generate": { + "amenity": "social_facility", + "social_facility": "group_home", + "social_facility:for": "child" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "87.90B", + "level": 3, + "title": "Hébergement social pour adultes et familles en difficultés et autre hébergement social", + "match": [ + { + "amenity": "social_facility", + "social_facility": "group_home", + "social_facility:for": "underprivileged" + } + ], + "generate": { + "amenity": "social_facility", + "social_facility": "group_home", + "social_facility:for": "underprivileged" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "96.02A", + "level": 3, + "title": "Coiffure", + "match": [ + { + "shop": "hairdresser" + } + ], + "generate": { + "shop": "hairdresser" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "96.02B", + "level": 3, + "title": "Soins de beauté", + "match": [ + { + "shop": "beauty" + } + ], + "generate": { + "shop": "beauty" + } + }, + { + "missing_official": 8310, + "missing_osm": 7210, + "class": "96.03Z", + "level": 3, + "title": "Services funéraires", + "match": [ + { + "shop": "funeral_directors" + } + ], + "generate": { + "shop": "funeral_directors" + } + } +]