def get_osm_housenumbers(self, street_name: str) -> List[util.HouseNumber]: """Gets the OSM house number list of a street.""" if not self.__osm_housenumbers: # This function gets called for each & every street, make sure we read the file only # once. house_numbers: Dict[str, List[util.HouseNumber]] = {} with self.get_files().get_osm_housenumbers_csv_stream() as sock: first = True columns: Dict[str, int] = {} for row in sock.get_rows(): if first: first = False for index, label in enumerate(row): columns[label] = index continue if not row: continue street = row[columns["addr:street"]] if not street and "addr:place" in columns: street = row[columns["addr:place"]] for house_number in row[columns["addr:housenumber"]].split( ';'): if street not in house_numbers: house_numbers[street] = [] house_numbers[street] += normalize( self, house_number, street, self.get_street_ranges()) for key, value in house_numbers.items(): self.__osm_housenumbers[key] = util.sort_numerically( set(value)) if street_name not in self.__osm_housenumbers: self.__osm_housenumbers[street_name] = [] return self.__osm_housenumbers[street_name]
def __get_ref_housenumbers(self) -> Dict[str, List[util.HouseNumber]]: """Gets house numbers from reference, produced by write_ref_housenumbers().""" ret = {} # type: Dict[str, List[util.HouseNumber]] lines = [] # type: List[str] with self.get_files().get_ref_housenumbers_stream("r") as sock: for line in sock.readlines(): line = line.strip() lines.append(line) street_ranges = self.get_street_ranges() streets_invalid = self.get_street_invalid() for osm_street_name in self.get_osm_streets(): house_numbers = [] # type: List[util.HouseNumber] ref_street_name = self.get_ref_street_from_osm_street( osm_street_name) prefix = ref_street_name + " " street_invalid = [] # type: List[str] if osm_street_name in streets_invalid.keys(): street_invalid = streets_invalid[osm_street_name] for line in lines: if line.startswith(prefix): house_number = line.replace(prefix, '') if util.HouseNumber.is_invalid(house_number, street_invalid): continue house_numbers += normalize(self, house_number, osm_street_name, street_ranges) ret[osm_street_name] = util.sort_numerically(set(house_numbers)) return ret
def __get_ref_housenumbers(self) -> Dict[str, List[util.HouseNumber]]: """Gets house numbers from reference, produced by write_ref_housenumbers().""" ret: Dict[str, List[util.HouseNumber]] = {} lines: List[str] = [] with self.get_files().get_ref_housenumbers_stream("r") as sock: for line in sock.readlines(): line = line.strip() lines.append(line) street_ranges = self.get_street_ranges() streets_invalid = self.get_street_invalid() for osm_street in self.get_osm_streets(): osm_street_name = osm_street.get_osm_name() house_numbers: List[util.HouseNumber] = [] ref_street_name = get_ref_street_from_osm_street( self.get_config(), osm_street_name) prefix = ref_street_name + "\t" street_invalid: List[str] = [] if osm_street_name in streets_invalid.keys(): street_invalid = streets_invalid[osm_street_name] # Simplify invalid items by default, so the 42a markup can be used, no matter what # is the value of housenumber-letters. street_invalid = self.__normalize_invalids( osm_street_name, street_invalid) for line in lines: if line.startswith(prefix): house_number = line.replace(prefix, '') normalized = normalize(self, house_number, osm_street_name, street_ranges) normalized = \ [i for i in normalized if not util.HouseNumber.is_invalid(i.get_number(), street_invalid)] house_numbers += normalized ret[osm_street_name] = util.sort_numerically(set(house_numbers)) return ret
def __get_ref_housenumbers(self) -> Dict[str, List[util.HouseNumber]]: """Gets house numbers from reference, produced by write_ref_housenumbers().""" ret: Dict[str, List[util.HouseNumber]] = {} lines: List[str] = [] with self.get_files().get_ref_housenumbers_stream("r") as sock: for line in sock.readlines(): line = line.strip() lines.append(line) street_ranges = self.get_street_ranges() streets_invalid = self.get_street_invalid() for osm_street_name in self.get_osm_streets(): house_numbers: List[util.HouseNumber] = [] ref_street_name = self.get_ref_street_from_osm_street( osm_street_name) prefix = ref_street_name + "\t" street_invalid: List[str] = [] if osm_street_name in streets_invalid.keys(): street_invalid = streets_invalid[osm_street_name] for line in lines: if line.startswith(prefix): house_number = line.replace(prefix, '') normalized = normalize(self, house_number, osm_street_name, street_ranges) normalized = \ [i for i in normalized if not util.HouseNumber.is_invalid(i.get_number(), street_invalid)] house_numbers += normalized ret[osm_street_name] = util.sort_numerically(set(house_numbers)) return ret
def get_osm_housenumbers(self, street_name: str) -> List[util.HouseNumber]: """Gets the OSM house number list of a street.""" if not self.__osm_housenumbers: # This function gets called for each & every street, make sure we read the file only # once. house_numbers: Dict[str, List[util.HouseNumber]] = {} with self.get_files().get_osm_housenumbers_stream( mode="r") as sock: first = True for line in sock.readlines(): if first: first = False continue tokens = line.strip().split('\t') if len(tokens) < 3: continue street = tokens[1] for house_number in tokens[2].split(';'): if street not in house_numbers: house_numbers[street] = [] house_numbers[street] += normalize( self, house_number, street, self.get_street_ranges()) for key, value in house_numbers.items(): self.__osm_housenumbers[key] = util.sort_numerically( set(value)) if street_name not in self.__osm_housenumbers: self.__osm_housenumbers[street_name] = [] return self.__osm_housenumbers[street_name]
def test_alpha(self) -> None: """Tests just suffixes.""" ascending = util.sort_numerically([ util.HouseNumber('a', ''), util.HouseNumber('c', ''), util.HouseNumber('b', '') ]) self.assertEqual([i.get_number() for i in ascending], ['a', 'b', 'c'])
def test_numbers(self) -> None: """Tests numbers.""" ascending = util.sort_numerically([ util.HouseNumber('1', ''), util.HouseNumber('20', ''), util.HouseNumber('3', '') ]) self.assertEqual([i.get_number() for i in ascending], ['1', '3', '20'])
def test_alpha_suffix(self) -> None: """Tests numbers with suffixes.""" ascending = util.sort_numerically([ util.HouseNumber('1a', ''), util.HouseNumber('20a', ''), util.HouseNumber('3a', '') ]) self.assertEqual([i.get_number() for i in ascending], ['1a', '3a', '20a'])
def get_osm_housenumbers(self, street_name: str) -> List[util.HouseNumber]: """Gets the OSM house number list of a street.""" house_numbers = [] # type: List[util.HouseNumber] with self.get_files().get_osm_housenumbers_stream(mode="r") as sock: first = True for line in sock.readlines(): if first: first = False continue tokens = line.strip().split('\t') if len(tokens) < 3: continue if tokens[1] != street_name: continue house_numbers += normalize(self, tokens[2], street_name, self.get_street_ranges()) return util.sort_numerically(set(house_numbers))