2

希望你们一切都好。

所以我正在开发一个时区iOS应用程序。该应用程序要求我们有一个人口众多的城市列表,并且当用户选择一个时,它会确定构造 NSTimeZone 对象(然后我们将其用于 NSDate 转换)所需的 Olson 时区 ID。

我已经能够获得城市列表及其对应的 lat 和 lng,我计划将其输入 Geoname 的 Timezone 服务端点,以确定每个城市的上述 Olson 时区 ID。

问题是我需要提出的请求数量巨大,我想知道是否没有更简单的解决方案来解决我的问题。任何建议/想法将不胜感激。

感谢大家!

4

2 回答 2

2

对于那些遇到同样问题的人,这就是我最终解决问题的方法。

我从 Geonames.org 下载了一个制表符分隔列表,其中包含一个城市列表,其中还包含每个城市的奥尔森时区 ID。您可以从 Geoname 的导出转储链接(见下文)下载一些不同的列表,但我选择了 city5000.zip 列表,以便获得一个相当全面的城市列表,而不会过于臃肿。

您可以在以下链接中找到有关列表的下载链接和信息:http: //download.geonames.org/export/dump/readme.txt

因为列表包含很多不必要的信息(例如 lat 和 lng 坐标),而且我需要数据为 .plist 格式以便在 iOS 应用程序中使用,所以我编写了一个简单的 Python 脚本从列表中提取城市名称和时区,根据城市名称按字母顺序对它们进行排序,然后转换为 .plist 格式。

对于那些感兴趣的人,python 脚本如下:

import json
import httplib
import os

cities = ()
rows = []
# Open up the tab delim list from Geonames.org
with open("cities15000.txt") as file:
    lines = file.readlines()

# Reading each line in the list
for line in lines:
    comps = line.split('\t')
    city = comps[1].strip()
    timezone = comps[17].strip()

    # Make sure there are no duplicates
    if not city in cities:  
        cities = cities + (city,)
        row = {'city':city,'timezone':timezone}
        rows = rows + [row,]

# Sort the rows based on the city name  
def cmp(a,b):
    if a['city'] > b['city']:
        return 1
    elif a['city'] == b['city']:
        return 0
    else:
        return -1
rows.sort(cmp)


# Convert the array to json and then to plist
jsonString = json.dumps(rows)

with open("cities.json", "w") as jsonFile:
    jsonFile.write(jsonString)
os.system('plutil -convert xml1 cities.json -o cities.plist')
于 2013-12-08T23:39:48.343 回答
1

您应该只构建一次城市/时区映射(在开发中),然后在应用程序中提供预构建的映射。然后,该应用程序永远不需要进行任何类型的 Internet 查找。

您还可以将文件放在您自己的服务器上,并让应用程序不时检查更新。

于 2013-12-06T02:20:41.297 回答