You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:42:38