def get_missing_housenumbers( self ) -> Tuple[List[Tuple[util.Street, List[util.HouseNumber]]], List[Tuple[ util.Street, List[util.HouseNumber]]]]: """ Compares ref and osm house numbers, prints the ones which are in ref, but not in osm. Return value is a pair of ongoing and done streets. Each of of these is a pair of a street name and a house number list. """ ongoing_streets = [] done_streets = [] osm_street_names = self.get_osm_streets() all_ref_house_numbers = self.__get_ref_housenumbers() for osm_street in osm_street_names: osm_street_name = osm_street.get_osm_name() ref_house_numbers = all_ref_house_numbers[osm_street_name] osm_house_numbers = self.get_osm_housenumbers(osm_street_name) only_in_reference = util.get_only_in_first(ref_house_numbers, osm_house_numbers) in_both = util.get_in_both(ref_house_numbers, osm_house_numbers) ref_street_name = get_ref_street_from_osm_street( self.get_config(), osm_street_name) street = util.Street(osm_street_name, ref_street_name, self.should_show_ref_street(osm_street_name)) if only_in_reference: ongoing_streets.append((street, only_in_reference)) if in_both: done_streets.append((street, in_both)) # Sort by length. ongoing_streets.sort(key=lambda result: len(result[1]), reverse=True) return ongoing_streets, done_streets
def get_additional_housenumbers(self) -> util.NumberedStreets: """ Compares ref and osm house numbers, prints the ones which are in osm, but not in ref. Return value is a list of streets. Each of of these is a pair of a street name and a house number list. """ additional = [] osm_street_names = self.get_osm_streets() all_ref_house_numbers = self.get_ref_housenumbers() streets_valid = self.get_street_valid() for osm_street in osm_street_names: osm_street_name = osm_street.get_osm_name() ref_house_numbers = all_ref_house_numbers[osm_street_name] osm_house_numbers = self.get_osm_housenumbers(osm_street_name) if osm_street_name in streets_valid.keys(): street_valid = streets_valid[osm_street_name] osm_house_numbers = \ [i for i in osm_house_numbers if not util.HouseNumber.is_invalid(i.get_number(), street_valid)] only_in_osm = util.get_only_in_first(osm_house_numbers, ref_house_numbers) ref_street_name = get_ref_street_from_osm_street( self.get_config(), osm_street_name) street = util.Street(osm_street_name, ref_street_name, self.should_show_ref_street(osm_street_name)) if only_in_osm: additional.append((street, only_in_osm)) # Sort by length. additional.sort(key=lambda result: len(result[1]), reverse=True) return additional
def test_addr_place(self) -> None: """Tests the case when addr:place is used.""" with util.CsvIO( open("tests/workdir/street-housenumbers-gh964.csv", "r")) as stream: actual = util.get_street_from_housenumber(stream) # This is picked up from addr:place because addr:street was empty. self.assertEqual(actual, [util.Street(osm_name="Tolvajos tanya")])
def test_happy(self) -> None: """Tests the happy path.""" relations = get_relations() relation_name = "gazdagret" relation = relations.get_relation(relation_name) only_in_osm = relation.get_additional_streets() self.assertEqual(only_in_osm, [util.Street('Only In OSM utca')]) # These is filtered out, even if it's OSM-only. osm_street_blacklist = relations.get_relation("gazdagret").get_config().get_osm_street_filters() self.assertEqual(osm_street_blacklist, ['Second Only In OSM utca'])
def get_additional_streets(self, sorted_result: bool = True ) -> List[util.Street]: """Tries to find additional streets in a relation.""" ref_streets = [ get_osm_street_from_ref_street(self.get_config(), street) for street in self.get_ref_streets() ] ref_street_objs = [util.Street(i) for i in ref_streets] osm_streets = self.get_osm_streets(sorted_result) osm_street_blacklist = self.get_config().get_osm_street_filters() only_in_osm = util.get_only_in_first(osm_streets, ref_street_objs) only_in_osm = [ i for i in only_in_osm if i.get_osm_name() not in osm_street_blacklist ] return only_in_osm
def get_osm_streets(self, sorted_result: bool = True) -> List[util.Street]: """Reads list of streets for an area from OSM.""" ret: List[util.Street] = [] with self.get_files().get_osm_streets_csv_stream() as sock: first = True for row in sock.get_rows(): if first: first = False continue # 0: @id, 1: name, 6: @type street = util.Street(osm_id=int(row[0]), osm_name=row[1]) if len(row) > 6: street.set_osm_type(row[6]) street.set_source(_("street")) ret.append(street) if os.path.exists(self.get_files().get_osm_housenumbers_path()): with self.get_files().get_osm_housenumbers_csv_stream() as sock: ret += util.get_street_from_housenumber(sock) if sorted_result: return sorted(set(ret)) return ret
def test_happy(self) -> None: """Tests the happy path.""" street = util.Street("foo", "bar") self.assertEqual(street.get_ref_name(), "bar") self.assertEqual(street.to_html().getvalue(), "foo<br />(bar)")