如何查找天气预报城市ID?

6
final String FORECAST_BASE_URL =
        "http://api.openweathermap.org/data/2.5/forecast/daily?";
final String QUERY_PARAM = "q";

你好。我正在制作一款天气预报应用程序。但是当我使用“http://openweathermap.org”的API时,我遇到了困难,如何获取城市代码或ID“q”?我试图找到城市ID,但是我找不到。
按城市ID调用的示例代码:
api.openweathermap.org/data/2.5/forecast/daily?id=524901

我听说“q”也用于“id”。我的意思是

api.openweathermap.org/data/2.5/forecast/daily?q=524901

也有可能。我希望能够像这样做。

那么,如何找到城市ID呢? 有人知道吗?


1
你已经有解决方案了吗? - zyunchen
4个回答

4
这里有一个类似的问题在OpenWeatherMap支持中心被提出。这是链接 OpenWeatherMap
此外,这是城市和它们各自ID的列表链接(只需CTRL + F查找您想要的城市):List of Cities & IDs

4
两个链接都失效了...最后一个有效的页面链接似乎是http://web.archive.org/web/20180619015316/http://openweathermap.org/help/city_list.txt,来自于http://web.archive.org/web/20180601000000*/https://openweathermap.org/help/city_list.txt。 - FranzHuber23

3
完整的CityID列表可以从这个链接下载: http://bulk.openweathermap.org/sample/city.list.json.gz 你可以手动搜索这个文件(解压后),也可以像这样从shell中搜索: grep -i "london" city.list.json 关于“q”和“id”查询标签:您可以使用“q”标签按城市(和国家)搜索,例如: http://api.openweathermap.org/data/2.5/forecast/daily?q=London,GB (请注意,国家代码不一定是必需的)
只要没有关于城市的疑问,那么这种方式就行得通。但如果同一个国家有多个同名城市,则可以使用CityID在上面链接的列表中查找正确的标识符后指定某个城市,例如: http://api.openweathermap.org/data/2.5/forecast/daily?id=2643743 这也会返回伦敦的天气,但确保您不会意外地获取美国肯塔基州或俄亥俄州的伦敦的天气,如果您选择不使用“q”标签中的国家代码。

有没有API可以下载城市列表,而不是下载静态文件? - gammay
@gammay 我不确定你具体需要什么,但如果你在问是否有一个API调用可以返回包含OpenWeatherMap已知的所有城市的响应,则没有(据我所知)。城市列表应该很少更改,因此下载一次列表对于大多数脚本来说应该足够了。如果你能详细说明你需要完成什么任务,我可能能够提供进一步的帮助。 - Anson VanDoren
你回答了我的问题。谢谢。我不认为只下载一次城市列表就足够了,因为城市/国家名称会发生变化(虽然不是很频繁)。此外,我的观点是旧名称和新名称都应该起作用,因为人们可能会使用任何一个。 - gammay
@gammay 这个文件非常大,压缩后的大小也很惊人;以 JSON/XML 文本响应的方式接收将是不可行的。 - matt
分页可以使用。国家列表 - 城市等。 - gammay
有没有一些选项只过滤特定的国家?比如说获取德国所有可用的城市? - FranzHuber23

2
看起来你的应用需要在用户输入城市名称时搜索城市。你可以通过在某种类型的主机上运行 OpenWeatherMap 城市查找器 服务器(在Heroku上,在Docker主机上,或者可能从Digital Ocean购买自己最便宜的VM,每月仅需5美元),然后使用 OWM City Finder 客户端 访问该服务器并将用户输入的任何字符串解析成GPS和ID的城市JSON数组。
OWM City Finder 服务器无需设置,只需在目标机器上运行以下命令即可。
docker run --rm -ti -p25314:25314 mvysny/owm-city-finder-server:0.1

要测试服务器并查询城市,只需运行:

最初的回答:

$ curl localhost:25314/city?query=helsinki
[{"id":658226,"name":"Helsinki","country":"FI","coord":{"lon":24.93417,"lat":60.17556}},{"id":658225,"name":"Helsinki","country":"FI","coord":{"lon":24.93545,"lat":60.169521}},{"id":658224,"name":"Helsinki","country":"FI","coord":{"lon":21.438101,"lat":60.60778}}]

你可以直接从你的应用程序访问REST,或者你可以使用提供的客户端来更轻松地访问。 点击此处了解更多信息。"Original Answer"翻译成"最初的回答"。

1
如果您想从城市获取城市ID,而不需要运行自己的容器或Web服务器,您也可以使用我为此目的提供的API(Weather City API):https://api.interlinked.us/。这比尝试使用笨重的JSON文件要好得多。 - InterLinked
嗨伙计,这是一个非常出色的举措。如何获取@InterLinked API的API密钥? - undefined
@mzdogan 你需要在网站上注册,然后为你的账户创建一个API密钥。 - undefined

1
使用openweathermap,您需要创建一个帐户这里。 之后,您可以生成一个API密钥,该密钥将用于地址栏... 就像这样:
http://api.openweathermap.org/data/2.5/forecast?id=524901&APPID=*******************************

只需用生成的密钥替换星号即可


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接