希望你们一切顺利。
所以我正在开发一个时区iOS应用程序。该应用程序要求我们有一个高人口城市列表,当用户选择一个城市时,它确定构建NSTimeZone对象所需的Olson时区ID(然后我们将其用于NSDate转换)。
我已经能够获得一个城市列表及其相应的lat和lng,我计划将其提供给Geoname的Timezone服务端点,以确定每个城市的上述Olson时区ID。
问题是我需要做的请求数量巨大,我想知道我的问题是否有更简单的解决方案。任何建议/想法将不胜感激。
谢谢大家!
答案 0 :(得分:2)
对于那些遇到同样问题的人,以下是我最终解决问题的方法。
我从Geonames.org下载了一个包含城市列表的标签分隔列表,其中还包含每个城市的Olson时区ID。您可以从Geoname的导出转储链接(如下所示)下载一些不同的列表,但我使用cities5000.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')
答案 1 :(得分:1)
您应该只构建一次城市/时区映射(在开发中),然后使用应用程序提供预构建的映射。然后,应用程序永远不需要进行任何类型的Internet查找。
您也可以将文件放在自己的服务器上,让应用程序偶尔检查一下更新。