如何从Geonames获取官方本地语言地名及关联国家官方语言
从Geonames提取官方本地语言地名
现有实现背景
你当前通过以下Python函数获取地点的ISO国家码及别名列表:
def countrycode_from_id(geonameId, username): base_url = "http://api.geonames.org/getJSON" params = { "geonameId": geonameId, # 地点的geonameId "username": username, # 你的Geonames用户名 } response = requests.get(base_url, params=params, timeout=10) data = response.json() # 获取国家码 country_code = data.get("countryCode") altnameslist = data["alternateNames"] return country_code, altnameslist
调用示例:
country, altnames = countrycode_from_id(1275339, "username")
返回的altnames是包含如下结构的列表:
{'name': 'Bombay', 'lang': 'it', 'isHistoric': True}
问题1:获取ISO国家码与官方语言的关联
可以使用Geonames的countryInfoJSON接口,直接通过ISO国家码查询对应国家的官方语言。实现示例:
def get_official_languages(country_code, username): base_url = "http://api.geonames.org/countryInfoJSON" params = { "country": country_code, "username": username } response = requests.get(base_url, params=params, timeout=10) data = response.json() # 提取官方语言,多个语言用逗号分隔,拆分后返回列表 if data.get("geonames"): lang_str = data["geonames"][0].get("languages", "") return [lang.split("-")[0] for lang in lang_str.split(",")] return []
调用这个函数就能得到对应国家的官方语言代码列表,比如传入"IN"会返回["hi", "en"](印地语和英语)。
问题2:直接获取官方语言版本的首选地名
有两种可靠的方法:
方法1:调用getJSON时指定目标语言
在调用getJSON接口时,添加lang参数指定官方语言,接口会优先返回该语言的地名。修改原有函数:
def get_localized_name(geonameId, username, target_lang): base_url = "http://api.geonames.org/getJSON" params = { "geonameId": geonameId, "username": username, "lang": target_lang # 指定目标语言 } response = requests.get(base_url, params=params, timeout=10) data = response.json() # 返回该语言下的名称,若不存在则返回默认名称 return data.get("name") or data.get("alternateNames", [])
方法2:从别名列表筛选官方语言的首选名称
结合问题1获取的官方语言,在altnameslist中筛选带有isPreferredName: True标记的条目:
def filter_preferred_local_names(altnameslist, official_langs): preferred_names = [] for name in altnameslist: # 筛选官方语言且是首选名称的条目,排除历史名称 if name.get("lang") in official_langs and name.get("isPreferredName") and not name.get("isHistoric"): preferred_names.append(name["name"]) return preferred_names
整合示例
把两个问题的解决方案整合起来,一次性获取官方语言的首选地名:
import requests def get_official_local_name(geonameId, username): # 第一步:获取国家码和别名列表 country_code, altnameslist = countrycode_from_id(geonameId, username) if not country_code: return None # 第二步:获取官方语言 official_langs = get_official_languages(country_code, username) if not official_langs: return None # 第三步:筛选首选本地名称 preferred_names = filter_preferred_local_names(altnameslist, official_langs) # 如果有首选名称返回第一个,否则尝试用lang参数直接获取 if preferred_names: return preferred_names[0] else: return get_localized_name(geonameId, username, official_langs[0])
调用示例:
local_name = get_official_local_name(1275339, "username") # 印度孟买的官方语言首选名称会返回"Mumbai"
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

