Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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
Exemplo n.º 3
0
 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
Exemplo n.º 4
0
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"
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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")
Exemplo n.º 7
0
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"]
Exemplo n.º 8
0
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