diff --git a/tools/python/mwm/find_feature.py b/tools/python/mwm/find_feature.py index 87b88066d5..2115848f4b 100755 --- a/tools/python/mwm/find_feature.py +++ b/tools/python/mwm/find_feature.py @@ -10,6 +10,7 @@ if len(sys.argv) < 4: print(' t for inside types ("t hwtag" will find all hwtags-*)') print(' et for exact type ("et shop" won\'t find shop-chemist)') print(' n for names, case-sensitive ("n Starbucks" for all starbucks)') + print(' m for metadata keys ("m flats" for features with flats)') sys.exit(1) typ = sys.argv[2].lower() @@ -18,7 +19,7 @@ find = sys.argv[3].decode('utf-8') mwm = MWM(open(sys.argv[1], 'rb')) mwm.read_header() mwm.read_types(os.path.join(os.path.dirname(sys.argv[0]), '..', '..', '..', 'data', 'types.txt')) -for feature in mwm.iter_features(): +for feature in mwm.iter_features(metadata=True): found = False if typ == 'n' and 'name' in feature['header']: for value in feature['header']['name'].values(): @@ -30,5 +31,8 @@ for feature in mwm.iter_features(): found = True elif typ == 't' and find in t: found = True + elif typ == 'm' and 'metadata' in feature: + if find in feature['metadata']: + found = True if found: - print(json.dumps(feature, ensure_ascii=False)) + print(json.dumps(feature, ensure_ascii=False).encode('utf-8')) diff --git a/tools/python/mwm/mwm.py b/tools/python/mwm/mwm.py index 99addccf8d..bb4c941690 100644 --- a/tools/python/mwm/mwm.py +++ b/tools/python/mwm/mwm.py @@ -12,7 +12,9 @@ from datetime import datetime # - Find why polygon geometry is incorrect in iter_features() # - Find feature ids in the 'dat' section, or find a way to read the 'offs' section + class MWM: + # coding/multilang_utf8_string.cpp languages = ["default", "en", "ja", "fr", "ko_rm", "ar", "de", "int_name", "ru", "sv", "zh", "fi", "be", "ka", "ko", "he", "nl", "ga", "ja_rm", "el", "it", "es", "zh_pinyin", "th", "cy", "sr", "uk", "ca", "hu", @@ -20,12 +22,14 @@ class MWM: "af", "ja_kana", "lb", "pt", "hr", "fur", "vi", "tr", "bg", "eo", "lt", "la", "kk", "gsw", "et", "ku", "mn", "mk", "lv", "hi"] + # indexer/feature_meta.hpp metadata = ["0", "cuisine", "open_hours", "phone_number", "fax_number", "stars", "operator", "url", "website", "internet", "ele", "turn_lanes", "turn_lanes_forward", "turn_lanes_backward", "email", "postcode", "wikipedia", "maxspeed", "flats", "height", "min_height", - "denomination", "building_levels"] + "denomination", "building_levels", "test_id", "ref:sponsored", "price_rate", + "rating", "fuel", "routes"] def __init__(self, f): self.f = f @@ -137,6 +141,8 @@ class MWM: t = self.read_varuint() t = self.metadata[t] if t < len(self.metadata) else str(t) fields[t] = self.read_string() + if t == 'fuel': + fields[t] = fields[t].split('\x01') else: while True: t = self.read_uint(1) @@ -204,13 +210,18 @@ class MWM: RELATION = 0xC000000000000000 RESET = ~(NODE | WAY | RELATION) - def iter_features(self): + def iter_features(self, metadata=False): """Reads 'dat' section.""" if not self.has_tag('dat'): return # TODO: read 'offs'? + md = {} + if metadata: + md = self.read_metadata() self.seek_tag('dat') + ftid = -1 while self.inside_tag('dat'): + ftid += 1 feature = {} feature_size = self.read_varuint() next_feature = self.f.tell() + feature_size @@ -245,6 +256,10 @@ class MWM: header['house'] = self.read_numeric_string() feature['header'] = header + # Metadata + if ftid in md: + feature['metadata'] = md[ftid] + # Geometry geometry = {} if geom_type == MWM.GeomType.POINT or geom_type == MWM.GeomType.POINT_EX: