def coords_for_street_name(street_name, placename=None, placename_hints=[]): """ Return coordinates for an Icelandic street name as a tuple. As some street names exist in more than one place, we try to narrow it down to a single street if possible. Street coordinates are the coordinates of the lowest house number. """ addresses = iceaddr_lookup(street_name, placename=placename, limit=100) if not addresses: return None # Find all places containing street_name places = set(a.get("stadur_nf") for a in addresses) addr = None # Only exists in one place if len(places) == 1: addr = addresses[0] elif placename_hints: # See if placename hints can narrow it down for pn in placename_hints: addresses = iceaddr_lookup(street_name, placename=pn) places = set(a.get("stadur_nf") for a in addresses) if len(places) == 1: addr = addresses[0] break return coords_from_addr_info(addr)
def street_desc(street_nom: str, street_num: int, locality_nom: str) -> str: """ Generate description of being on a particular (Icelandic) street with correct preposition and case + locality e.g. 'á Fiskislóð 31 í Reykjavík'. """ street_dat = None locality_dat = None # Start by looking up address in staðfangaskrá to get # the dative case of street name and locality. # This works better than BÍN lookup since not all street # names are present in BÍN. addrinfo = iceaddr_lookup(street_nom, placename=locality_nom, limit=1) if len(addrinfo): street_dat = addrinfo[0]["heiti_tgf"] if locality_nom and locality_nom == addrinfo[0]["stadur_nf"]: locality_dat = addrinfo[0]["stadur_tgf"] # OK, if staðfangaskrá can't help us, try to use BÍN to # get dative version of name. Some names given by Google's # API are generic terms such as "Göngustígur" and the like. if not street_dat: street_dat = nom2dat(street_nom) if not locality_dat: locality_dat = nom2dat(locality_nom) # Create street descr. ("á Fiskislóð 31") street_comp = iceprep_for_street(street_nom) + " " + street_dat if street_num: street_comp += " " + str(street_num) # Append locality if available ("í Reykjavík") if locality_dat: ldesc = iceprep_for_placename(locality_nom) + " " + locality_dat street_comp += " " + ldesc return street_comp
def lookup(pn): a = iceaddr_lookup( addr["street"], number=addr.get("number"), letter=addr.get("letter"), placename=pn, limit=2, ) return a[0] if len(a) == 1 else None
def location_description(loc: Dict) -> str: """ Return a natural language description string (in Icelandic) for a given location. Argument is a dictionary with at least "name" and "kind" keys. """ if "kind" not in loc or "name" not in loc: return "staðarheiti" name = loc["name"] kind = loc["kind"] if kind == "continent": return "heimsálfa" if name in ICE_REGIONS: return "landshluti" if name not in NEVER_US_STATE: sc = code_for_us_state(name) if sc: return f"fylki í Bandaríkjunum ({sc})" if kind == "country": desc = "landsvæði" c = loc.get("continent") if c is None and "country" in loc: c = continent_for_country(loc["country"]) if c in ISO_TO_CONTINENT: cname = ISO_TO_CONTINENT[c] desc = "land í {0}u".format(cname[:-1]) return desc if kind == "address": return "heimilisfang" if kind == "street": if loc.get("country") == ICELAND_ISOCODE: # Icelandic address info = iceaddr_lookup(name, limit=200) if info: places = set([i["stadur_tgf"] for i in info]) # Disambugiate placename for description if we can if len(places) == 1: p = places.pop() return f"gata {iceprep_for_placename(p)} {p}" return "gata á Íslandi" return "gata" if kind == "placename": return "örnefni" return "staðarheiti"
def test_address_lookup(): """ Test address lookup using various known addresses. """ ADDR_TO_POSTCODE = [ ["Öldugata", 4, "Reykjavík", 101], ["öldugötu", 12, "hafnarfirði", 220], ["Tómasarhaga", 12, "Reykjavík", 107], ["smiðjuvegur", 22, None, 200], ] for a in ADDR_TO_POSTCODE: res = iceaddr_lookup(a[0], number=a[1], placename=a[2]) assert res and res[0]["postnr"] == a[3] res = iceaddr_lookup("Brattagata", number=4, letter="b") assert res and res[0]["postnr"] == 310 and res[0]["stadur_nf"] == "Borgarnes" POSTCODE_TO_PLACENAME = [ ["Öldugata", 4, 101, "Reykjavík", "Höfuðborgarsvæðið", "Þéttbýli"], [ "dagverðardalur", 11, 400, "Ísafjörður", "Vesturland og Vestfirðir", "Þéttbýli", ], ["Höfðabraut", 3, 805, "Selfoss", "Suðurland og Reykjanes", "Þéttbýli"], ] for p in POSTCODE_TO_PLACENAME: print("iceaddr_lookup('{0}', number={1}, postcode={2}".format(p[0], p[1], p[2])) res = iceaddr_lookup(p[0], number=p[1], postcode=p[2]) assert res[0]["stadur_nf"] == p[3] assert res[0]["svaedi_nf"] == p[4] assert res[0]["tegund"] == p[5] assert len(iceaddr_lookup("Stærri-Árskógi", postcode=621)) > 0 assert len(iceaddr_lookup("Grundarstíg")) > 10 assert len(iceaddr_lookup("Grundarstíg", limit=2)) == 2
def test_address_lookup_does_not_need_letter(): assert iceaddr_lookup("Laugavegur", number=151) assert iceaddr_lookup("Laugavegur", number=151, letter="r") assert not iceaddr_lookup("Laugavegur", number=151, letter="e")
def test_address_lookup_can_find_places_of_interest(): results = iceaddr_lookup("Harpa", postcode=101) assert results assert results[0]["heiti_nf"] == "Austurbakki" assert results[0]["husnr"]
def test_address_lookup_matches_number_range_and_no_number(): results = iceaddr_lookup("Vesturgata", number=6, placename="Reykjavík") assert results assert results[0]["vidsk"] == "6-8" assert results[0]["husnr"] is None