Source code for sentier_peakachu.utils_location
import warnings
import polars as pl
from sentier_data_tools import GeonamesIRI
[docs]
BASE_URL = "https://sws.geonames.org/"
[docs]
LOOKUP_FILE = "../data/iso_iri_table.csv"
[docs]
LOOKUP_SEPARATOR = "\t"
[docs]
def get_geonames_iri_from_iso_code(iso_code: str) -> GeonamesIRI:
"""
Lookup the geoname identifier for a given ISO code using a CSV lookup table.
Parameters
----------
iso_code : str
The ISO country code. It can be either a two-digit ISO 3166-1 alpha-2 code
or a three-digit ISO 3166-1 alpha-3 code.
Returns
-------
GeonamesIRI
The IRI of the location identifier.
Raises
------
ValueError
If the `iso_code` is not two or three characters long or if no matching geoname identifier is found.
"""
if len(iso_code) not in [2, 3]:
raise ValueError("Please provide a two-digit or three-digit ISO code")
lookup = pl.scan_csv(LOOKUP_FILE, separator=LOOKUP_SEPARATOR)
column = "ISO3" if len(iso_code) == 3 else "ISO2"
query = f"SELECT geonameid FROM self WHERE {column} = '{iso_code}'"
res = lookup.sql(query).collect()
if res.is_empty():
warnings.warn(f"ISO code {iso_code} not found")
return None
geoname_id = res.item(0, 0)
iri = BASE_URL + str(geoname_id) + "/"
return GeonamesIRI(iri)