精华内容
下载资源
问答
  • 天气预报本地准时宝产品(以下简称"天气预报本地准时宝"或“我们”)非常重视保护用户的个人隐私,为了您更好地使用天气预报本地准时宝及改进用户体验, 我们需要在使用过程中获取用户相应的个人信息。天气预报本地...

    在这里插入图片描述

    天气预报本地准时宝隐私政策
    本政策更新并生效于:2021年3月8日

    天气预报本地准时宝产品(以下简称"天气预报本地准时宝"或“我们”)非常重视保护用户的个人隐私,为了您更好地使用天气预报本地准时宝及改进用户体验, 我们需要在使用过程中获取用户相应的个人信息。天气预报本地准时宝将按照法律、法规的相关要求,进行获取、管理和保护措施,从而确保您的个人信息安全可 控。 为此,我们制定本《天气预报本地准时宝隐私政策》。本政策仅适用于天气预报本地准时宝产品,以便您了解我们如何收集、使用、共享、转让、披露、保 护及存储您的个人信息。在使用前请您认真仔细阅读本政策,如有任何疑问,可以通过“用户反馈”或本政策“九、如何联系我们”中的联系方式和我们进行反馈沟通。 如您是未满18周岁(或当地法律规定的年龄)的未成年人,请您在监护人的陪同下仔细阅读并充分理解本政策,并在征得监护人的同意后使用我们的服务或向我们提供 信息。您若使用或继续使用天气预报本地准时宝,代表您已经阅读并同意本政策所述的全部内容。如您不同意本政策中的任何条款,您应立即终止使用我们的产品和服务。

    我们会遵循本政策所述目的收集、使用您的个人信息,且不会仅因您同意本政策而采用强制捆绑的方式收集个人信息。当您使用或开启相关功能或服务时,为实现功能、 服务所必需,我们会收集、使用您的相关信息。除为实现产品基本业务功能或根据法律法规要求所必需的必要信息,您可以选择拒绝提供且不影响产品的其他功能或服务。

    本政策适用于所有我们提供的产品和服务,包括但不限于天气预报本地准时宝官网、天气预报本地准时宝App、微信公众号、快应用等。基于此目的,我们将向您解释 我们对信息的收集和使用方式,以及您可采用何种方式来保护您的个人信息。本政策包括了以下内容:

    一、 我们如何收集和使用您的个人信息
    二、 我们如何使用Cookie和同类技术
    三、 我们如何共享、转让、公开披露您的个人信息
    四、 我们如何存储和保护您的个人信息
    五、 您如何管理您的个人信息
    六、关于未成年使用的个人信息保护
    七、第三方链接及其产品与服务
    八、本政策的变更和修订
    九、如何联系我们
    一、我们如何收集和使用您的个人信息

    (一)个人信息的收集使用
    天气预报本地准时宝将严格遵守本政策及其更新所载明的内容来收集和使用您的个人信息。您的个人信息将仅用于收集时即已确定并且经过您同意的目的,如有除此之外的任何其他用途,我们都会提前征得您的同意。

    1、为了给您提供天气信息服务,在使用天气预报本地准时宝时,我们会征询您是否同意获取设备位置信息、是否允许访问您的设备上的照片、媒体内容和文件信息、是否允许获取设备信息,如果不允许会影响您准 确获取天气预报信息、背景图的展示和同城内容的阅览。
    2、在使用过程中,我们可能会收集您使用的设备信息(包括设备型号、设备唯一标识符、操作系统、分辨率、电信运营商、设备参数)及网络信息、IP地址。为了更好地了解用户使用习惯及给用户提供更好的操作体验, 我们可能会收集用户使用软件行为的操作记录。
    3、在使用意见反馈时,我们可能需要您上传使用日志、位置天气信息内容,提供手机号码、邮箱或者其他个人联系方式,以上信息便于我们更好地跟踪您反馈的问题并及时解决。当您加入天气预报本地准时宝"用 户体验改进计划"时,我们会根据需要匿名统计您对产品各项功能的使用情况,从而收集您对天气预报本地准时宝官网、产品和服务的使用习惯相关信息。此外当系统发生非正常退出和崩溃时,我们会收集便于诊断问题 的手机当前环境信息。

    (二)用户权限的获取
    为了提供更精准的天气产品服务和最佳的产品体验,我们在使用时,需要您授予相应的用户权限。各权限以弹框的形式出现,需要您的授权同意,我们方能获取相应的权限。获取权限后,您才能享受相应的功能或服务。 需要的权限具体如下:

    WRITE_EXTERNAL_STORAGE:写入外部存储卡,用于写入城市背景图、小插件和图片存储使用。
    READ_EXTERNAL_STORAGE:读取外置存储卡,用于读取城市背景图、小插件和图片存储使用。
    READ_PHONE_STATE:读取手机状态和身份,根据用户信息提供相应的差异化数据服务和内容显示。
    ACCESS_FINE_LOCATION:获取精准位置,提供详细位置所在的天气服务。
    ACCESS_COARSE_LOCATION:获取粗略位置服务,获取城市的天气数据需要。
    CAMERA:相机权限,用于拍摄照片,发布动态内容。

    (三)无须征得授权同意的情形
    请您知悉,以下情形中,我们收集、使用个人信息无须征得您的授权同意:

    1、与国家安全、国防安全有关的;
    2、与公共安全、公共卫生、重大公共利益有关的;
    3、与犯罪侦查、起诉、审判和判决执行等有关的;
    4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
    5、您自行向社会公众公开的个人信息;
    6、从合法公开披露的信息中收集的您的个人信息,如合法的新闻报道、政府信息公开等渠道;
    7、根据您的要求签订合同所必需的;
    8、用于维护所提供的产品/服务的安全稳定运行所必需的,例如发现、处置产品/服务的故障;
    9、为合法的新闻报道所必需的;
    10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;
    11、法律法规规定的其他情形。
    二、我们如何使用Cookie和同类技术

    为了提供更好的体验服务,我们会在您的计算机或移动设备上存储名为Cookies的小数据文件,Cookies用于判断您的登录状态、数据安全、广告宣传和偏好信息用途。我们使用Cookie和同类技术主要为了实现以下功能或服务:

    1、我们可能会设置认证与保障安全性的Cookie或匿名标识符,使我们确认您是否安全登录服务,或者是否遇到盗用、欺诈及其他不法行为。这些技术会帮助我们改进服务效率,提升登录和响应速度,还可 以帮助您省去重复填写个人信息、输入搜索内容、简化操作步骤和流程,帮助您获得更轻松的访问体验。
    2、我们还会使用Cookie技术和同类技术了解您的偏好和使用习惯,进行数据分析,改善产品服务、推荐您感兴趣的信息或功能,并优化您对广告的选择。

    我们不会将Cookies用于本政策所述目的以外的任何用途,目前大多数浏览器均有清除Cookies功能,您可以在浏览器中进行相应的功能设置。如您清除或关闭Cookies,可能会造成部分相应功能或服务无法正常使用。
    三、我们如何共享、转让、公开披露您的个人信息

    (一)共享
    未经您本人同意,我们不会向天气预报本地准时宝以外的任何第三方公开分享您的个人信息,但是下列情形除外:

    1、已经取得您的明确同意或授权;
    2、根据相关的法律法规规定,纠纷争议解决的需要、或者司法、行政机关提出的强制性要求;
    3、为了保障产品和服务提供的完整性和顺利性,我们可能会与相关的合作伙伴共享个人数据,但我们只会共享必要的个人信息,且受本政策中所 声明目的约束。我们的合作伙伴不能也无权将您的个人信息用于其他任何用途;第三方合作伙伴的身份和共享个人信息的目的、使用方式及类型具 体可见:《第三方合作伙伴及共享信息说明》。

    (二)转让
    如果我们发生重组、合并或出售,则在将我们收集的一切个人信息进行转让之前,我们会继续按照现行的隐私政策约束来保证其秘密性并通知所有受到影 响的用户。同时我们会要求新的持有您个人信息的公司、组织继续受本政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。

    (三)公开披露
    我们仅会在以下情况下,公开披露您的个人信息:

    1、获得您的明确同意后;
    2、基于法律或合理依据的公开披露:在法律法规及强制性的行政执法或司法要求所必须提供您个人信息的情况下,我们可能会 根据所要求的个人信息类型和披露方式公开披露您的个人信息。在符合法律法规的前提下,当我们收到上述披露信息的请求时, 我们会要求出具相应的法律文件,如传票或调查函。
    3、我们认为为遵守适用的法律法规、维护社会公共利益、或保护我们或我们的关联公司、我们的客户、其他用户或雇员的人身和 财产安全、合法权益或公共安全及利益所合理必需的;及根据天气预报本地准时宝服务条款及政策中的相关规定,或者我们认为 必要的其他情形。
    四、我们如何存储和保护您的个人信息

    (一)我们如何存储您的个人信息

    1、我们会根据法律法规的规定,将境内产生和收集的个人信息存储在中华人民共和国境内。目前,我们不会将上述信息传输至境外,如果我们需要向境外传输您的个人信息,我们会遵循相关法律法规并事先征求您的同意。
    2、我们仅在为实现本政策所述目的所必需的和法律法规及监管规定的期限内保存您的个人信息。超出保存期限后,我们会根据相关法律法规的要求删除您的个人信息或进行匿名化处理。
    3、当您成功注销账号后,在无特殊法律法规要求的情况下,我们会尽快删除您的个人信息或进行匿名化处理。
    4、如果发生终止服务或运营等情形,我们会及时停止继续收集您的个人信息并以逐一送达或公告的形式向您通知。无

    (二)我们如何保护您的个人信息

    我们已采取符合业界标准的安全防护措施努力为天气预报本地准时宝的用户提供保护,以免我们保存的信息在未经授权的情况下被访问、公开披露、使用、 修改、损坏、丢失泄漏或其他形式的非法处理。为此,我们特别采取了以下措施:

    1、我们使用HTTPS、SSL等多种加密技术对数据在上传、传输、交换等全过程进行加密,确保整个过程中数据的安全性。同时某些加密数据的具体内容,除用 户自己,其他人都无权访问。
    2、我们建立合规的管理制度和流程,我们会审查信息收集、存储和处理方面的做法(包括物理性安全措施),以避免系统遭到各种未经授权的访问。
    3、我们严格限制访问信息的人员范围和权限,只允许那些为了帮助我们处理个人信息而需要知晓这些信息的天气预报本地准时宝员工、授权代为处理服务 公司的人员访问个人信息,而且他们需要履行严格的合同保密义务。如果其未能履行这些义务,就可能会被追究法律责任或被终止其与天气预报本地准时宝 的关系。
    4、为应对个人信息泄露、损毁和丢失等可能出现的风险,我们制定了多项制度与管控措施,明确了安全事件、安全漏洞的分类分级标准及相应的处理流程。 同时我们也为安全事件建立了专门的应急响应团队,按照安全事件处置规范要求,对不同安全事件启动安全预案,进行止损、分析、定位、制定补救措施、 联合相关部门进行回溯和打击。
    5、若不幸发生我们所获取并储存的数据安全受到危害的情形,或由于外部行为(例如黑客攻击)使用户的非公开信息被披露给不相关的第三方,我们将启 动应急预案,组织应急响应团队启动信息安全事件处置流程以降低事故对用户的影响,并上报通知监管部门,同时我们将按照法律法规的要求及时向您告知: 安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们会及时以邮件、短信、 推送通知等方式告知您事件的相关情况。当难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。
    6、尽管已经采取了上述合理有效措施,并已经遵守了相关法律规定要求的标准,但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业, 即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全,但我们仍将尽力确保您个人信息的安全性。请您理解,您为接入我们的服务所使用的系 统和通讯网络,有可能因为我们可控范围之外的因素而出现问题。因此,我们强烈建议您采取积极措施保护个人信息的安全,包括但不限于使用复杂密码、定 期修改密码、不将自己的账号密码等个人信息向他人透露。
    7、我们谨此特别提醒您,本政策提供的个人信息保护措施仅适用于天气预报本地准时宝及相关服务。一旦您离开天气预报本地准时宝,浏览或使用其他 网站、服务及内容资源,我们即没有能力及义务保护您在天气预报本地准时宝及相关服务之外的软件、网站提交的任何个人信息,无论您登录、浏览或使用 上述软件、网站是否基于天气预报本地准时宝的链接或引导。

    五、您如何管理您的个人信息

    (一)访问、更正个人信息

    我们对于您的个人信息进行保护的同时,您也有权利对自己的相关信息进行查询、编辑和删除。您可以通过下列途径进行相应的查询、编辑和删除操作:

    1、账号信息,您可以在“我”的界面登录您的账号,进入“个人信息”界面编辑您的个人头像、昵称、生日、城市、职业、收货地址等个人资料。
    2、在首页的生活指数“订阅管理”界面,您可以对性别、星座进行设置,也可以根据喜好自定义所需的生活指数频道。
    3、您可以在登录后,进入“我的足迹”界面对您发布的动态进行删除、管理等操作。

    (二)删除个人信息

    符合以下情形时,您可以要求我们删除的您的个人信息:
    1、我们违反法律法规的规定,收集、使用个人信息的;
    2、我们违反了与您的约定,收集、使用个人信息的;
    3、我们违反法律法规规定或违反与您的约定向第三方共享、转让个人信息的,我们将立即停止共享、转让的行为,并通知第三方及时删除;
    4、我们违反法律法规规定或与您的约定,公开披露个人信息的,我们将立即停止公开披露的行为,并发布通知要求相关接收方删除相应的信息;
    5、我们终止服务或运营时;
    6、在以下情形时,您的请求可能不被受理,我们会同时跟您说明原因:

    (1)您非个人信息主体或您的权利人身份无法被验证时;
    (2)您的请求超出您的权利范围,或者您重复提起同一请求时;
    (3)如果涉及的信息与我们在纠纷中要做出的赔偿或者获得的补偿有关,披露信息很可能会损害我们的利益时;
    (4)如果保留信息只是出于统计和研究的目的,而且统计和研究结果的公布不会披露个人身份信息时;
    (5)其他法律规定的情形。

    若我们决定响应您的删除要求,我们还将同时通知从我们获得您个人信息的实体,要求其及时删除,除非法律法规另有规定或这些实体已经获得您的独立授权。
    当您从我们的服务中删除信息后,由于适用法律和安全技术的原因,我们可能不会立即在备份系统中删除相应的信息。我们将安全地存储您的个人信息并将其进一步隔 离,使其在我们提供的产品内保持不可被检索、访问的状态,直至备份可以删除或实现匿名化处理。

    (三)撤回同意或授权

    如您同意授权获取您的位置信息、存储、通话状态和移动网络信息、相机、悬浮窗或其他权限,我们提供了收集个人信息授权的撤回方式,您可以在“设 置”界面中的“权限管理”界面进行设置处理。但是,您撤回授权的操作不会影响此前基于您的授权所进行的信息收集及使用。

    (四)注销账号

    当您不再使用我们的产品和服务时,您有权选择对自己的账号信息进行注销。注销的步骤如下:在您登录账号后,点击“设置”图标进入“账号安全”功 能页面,选择“注销账号”即可进行注销。需要提醒您的是,注销上述账号的行为是不可逆的,届时天气预报本地准时宝将停止为您提供产品和服务, 您也将无法恢复使用天气预报本地准时宝提供的产品和服务且自动放弃已有的权益,建议您谨慎操作。

    六、关于未成年使用的个人信息保护

    1、天气预报本地准时宝产品主要面向成年人,但对于使用天气预报本地准时宝产品与服务的未成年人,我们很清楚采取额外 预防措施保护其隐私和安全的重要性。我们将不满18周岁(或当地法律规定的年龄)的任何人均视为未成年人。如果您是未成年人, 在您使用我们的产品与服务或向我们提供您的个人信息前,应当事先征得您监护人的同意。若您是未成年人的监护人,您在同意所 监护的未成年人使用我们的产品与服务或向我们提供个人信息前,应详细阅读并理解本政策的所有内容。
    2、对于经监护人同意而收集的未成年人个人信息,我们只会在法律允许、监护人明确同意或者保护未成年人所必要的情况下使用或披露。 如果您的监护人不同意您按照本政策使用我们的产品与服务或向我们提供信息,请您立即停止使用天气预报本地准时宝并及时通知我们。
    3、如果您是未成年人的监护人,当您需要访问、修改或删除与所监护的未成年人有关的个人信息时,请按照“九、如何联系我们”中介绍的方式与 我们联系。
    4、如果我们发现自己在未事先获得可证实的监护人同意的情况下收集了未成年人的个人信息,则会设法尽快删除相关内容。

    七、本隐私政策的变更和修订

    天气预报本地准时宝可能使用或提供来自第三方的产品或服务,所有含有第三方网站、产品与服务的链接仅为方便用户而提供。我们对此类 第三方无控制权,无法对链接内容提供任何明示和暗示的保证,此类链接也不视为我们对链接内容的推荐或授权;我们无法控制第三方的隐私 或数据保护政策,此类第三方也不受到本政策的约束。
    您需自行独立判断您与此类链接的互动行为。在向第三方提交个人信息之前,请您阅读并参考这些第三方的隐私政策,我们对此不承担任何责任。

    八、本政策的变更和修订

    1、由于业务的发展和为了给您提供更加优质的产品和服务,本政策也会随之更新。未经您明示同意,我们不会削弱您按照本政策所应享有的权利, 除非通过您提供的电子邮件地址向您发送通知或发布网站公告。
    2、本政策变更和修订时,我们将会在天气预报本地准时宝App中向您提供弹窗提示的方式,提醒您有关本政策的任何变更和修订。针对本政策的 重大变更,我们还会通过向您发送单独的电子邮件、短信通知等更为显著的方式进行通知,确保您知晓变更事宜。在前述情况下,若您继续使用我们 的服务,即表示同意接受修订后的本政策。本政策所指的重大变更包括但不限于:

    (1)我们的服务模式发生重大变化。如处理个人信息的目的、处理个人信息的类型、个人信息的使用方式等;
    (2)我们在业务调整、破产并购等方面发生重大变化。
    (3)个人信息共享、转让或公开披露的主要对象发生变化;
    (4)您参与个人信息处理方面的权利及其行使方式发生重大变化;

    九、如何联系我们

    您对本政策和您个人信息相关的任何疑问、建议或反馈,可以通过“我”的界面中的“意见反馈”界面或下列方式进行反馈,我们会在15个工作日内回复处理意见或结果。

    公司名称:北京微言科技有限公司

    展开全文
  • 基于Android开发的天气预报app(源码下载)

    万次阅读 多人点赞 2017-05-25 20:37:35
    基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows10系统下进行开发。主要实现了:1、定位城市天气显示;2、城市编辑功能(增、删、改、查)以及对应天气显示...

    基于AndroidStudio环境开发的天气app

    由于需要源码的人特别多,我特地花时间修复了旧的天气接口无法使用的问题并开源了源码,需要的自取。

    • 源码地址:https://github.com/LuoPeiQin/DongWeather
    • 发现很多人有了源码地址,还是在下面留言要源码,应该是新手不会下载和打开GitHub的源码,所以特地写了一篇下载并打开源码教程的文章,帮助大家下载源码并打开和运行
    • 如果觉得对你有帮助,麻烦帮忙点个赞,谢谢!

    主要实现了:
    1、定位城市天气显示;
    2、城市编辑功能(增、删、改、查)以及对应天气显示信息的改变;
    3、天气信息的Widget窗口显示(城市的编辑功能可以远程的更新Widget窗口信息的显示)
    4、下拉刷新、天气显示界面左右滑动、城市拖拽等小模块

    一、 开发需求分析

    1、开发环境搭建 - AndroidStudio

    安装步骤:
    (1)下载。建议在官网下载,因为国内很多映射文件多少都是有点年代的,还是下载最新的比较好,也免去更新的麻烦。不过国内由于网络限制,上Android官网需要翻墙。AndroidStudio下载地址:https://developer.android.google.cn/studio/index.html里面是最新版本的AndroidStudio。
    (2)安装,下载完成之后没有特别要求的话默认选择一直next就好了,一般的话只需要改下安装路径,避免C盘空间不够。因为AndroidStudio自带了JDK和Android SDK,所以Android完成后就可以直接进行开发了。
    

    2、城市信息获取的api

    城市信息这里我直接使用的是Android前辈搭建的一个服务器获取的,数据链接是http://guolin.tech/api/china,访问返回的是JSON数据类型的省份信息(JSON数据类型的解析后面会再详细说明),需要返回城市时只需要在本链接后加上“/对应省份id”即可获取到相应的城市信息,县市信息也是一样的,原链接加上“/对应省份id/对应城市id”即可。
    这里其实也可以从其它天气服务商提供的api接口获取城市信息。

    3、天气信息获取的api

    天气信息的获取我使用的是和风天气提供的免费的api,和风天气每天有提供4000次免费的基础天气查询,用来做开发测试是足够用的了。而且和风天气api接口返回的JSON数据类型也比较简单,作为Android初学者做项目是比较好的。想使用该接口只需要简单注册一个账号就可以了(对返回数据的处理我后面再详细说明)。老手的话可以在网上搜索别的服务商提供的免费接口,现在网上的免费接口少了很多,不过有还是有的。

    4、定位信息获取的api

    我这里使用的是百度提供的免费api接口http://lbsyun.baidu.com/apiconsole/key,因为Android原生定位API在国产手机中一般被阉割了,或者国内网络限制的原因,使用Android原生定位API一般是很难获取到定位信息的,跟手机厂商和网络环境都有关系。所以这边为了避免这种情况的不确定因素,我选择了使用百度提供的免费地位接口,在国内,百度和高德定位服务做得都还是不错的。使用百度定位api接口同样需要注册一个百度开发者账号,因为这不是本篇文章的重点。这边具体的操作就不再说明了。

    二、 系统设计分析

    1、天气信息界面显示设计

    首先先上效果图:
    天气主界面图

    接下来我介绍一下天气显示信息中用到的一些设计:
    首先是功能实现上的:
    1)首先背景图片是每天会更新的,是从必应网上获取到的背景图片。
    2)下拉刷新功能。
    3)天气显示信息左右活动切换已选择要显示的城市。
    4)通过点击右上角的编辑按钮进入城市管理功能。
    5)导航组件功能。
    6)小时天气小时超出屏幕宽度时的当前页面左右滑动。

    其次是具体显示上的(分为一个城市的天气信息一个页面,每个页面又有七个模块)我们从上往下分析:
    1)最上部分是城市名的显示和编辑按钮。
    2)然后是导航原点显示。
    3)其次是当前温度,当天天气和当天最低最高温的显示。(1)(2)部分都是用户比较关心的问题,所以我们放在最前面。
    4)接下来是将来的小时预告,由于和风天气返回的数据只有当天每三小时的天气预告,所以这边的显示实现得比较差,不过我这里做的是兼容可以扩展的,不管数据多少都可以显示。如果将来需要更改数据源,这里的操作将非常简单 。
    5)接着显示的是接下来几天的天气的大体介绍,这里显示的数据同样受限于获取到的数据。
    6)再接着是一些生活指数的显示,由于我艺术细胞不太好,所以这里的图片显示有点丑。。你们可以根据自己的喜好去更改图片。
    7)最后就是一些生活建议的显示了。

    2、已选择城市信息界面显示设计

    先上图吧
    城市编辑显示1
    城市编辑显示2

    这里主要是有点击编辑前后的区别

    下面我们来一一说明:
    点击编辑前
    布局主要分成三个部分:
    1、最上方的:
    *左侧返回按钮,回到天气显示界面
    *中间固定的“城市管理”四个字
    *右侧的编辑按钮,点击之后就可以对城市进行增、删、和更改位置了
    2、中间部分:
    *中间部分是已选择城市信息的显示
    3、最下方部分:
    *最下面是一个添加城市的按钮,点击之后进入城市添加功能

    点击编辑后
    1、最上方的:
    *左侧取消按钮,即放弃本次编辑后的结果,回到非编辑界面
    *中间固定的“城市管理”四个字
    *右侧的保存按钮,即保存本次编辑的结果并回到非编辑界面
    2、中间部分:
    *中间部分是已选择城市信息的显示,与编辑前不同的是增加了左侧拖动改变顺序的按钮和右侧的删除城市按钮
    3、最下方部分:
    *最下面是一个添加城市的按钮,点击之后进入城市添加功能

    所用到的功能点
    1、dragListView:可拖拽的listview
    2、Android自带数据库
    3、重叠按钮的实现
    以上功能模块下面我都会一一说明

    3、添加城市信息界面显示设计

    先上图:
    添加城市显示图1
    添加城市显示图2

    说明
    这里的实现比较简单,就是使用ListView去显示省、市、县三个级别的城市,根据选择的城市去网络或者本地加载数据,然后显示。

    4、Widget设计

    同样先上图
    widget显示设计

    说明
    这里的实现显示上比较简单,但是功能逻辑和实现上相对复杂。

    显示上的设计
    1、背景图片:widget的背景图片同样是网络上下载并且每天会自动更换的,不同的是为了保证用户滑动界面时的流畅性,这里做了图片缩放处理之后再显示。
    2、中间固定文字“当前天气”
    3、下面是一个ListView用来显示简略的已选择城市的信息

    功能上的设计
    1、服务listView改变的server进程
    2、contentProvider提供跨进程间的数据通信
    3、图片下载的异步线程和图片缩放实现
    4、异步线程与UI线程通过handler实现通信

    5、界面转换设计

    有界面转换实现的:
    1、点开app进入到城市天气信息显示界面
    2、点击编辑按钮进入到城市管理界面
    3、城市管理界面中点击添加按钮进入到城市添加界面
    4、城市管理界面中点击返回按钮回到城市天气信息显示界面
    5、添加城市界面中添加完成或者点击返回按钮回到城市天气信息显示界面

    6、系统总体和局部流程设计(流程图)

    这里写图片描述

    由于时间原因,这边就先绘制一个流程图了,别的流程图等后面有时间了再绘制

    三、 系统功能模块实现(代码部分)

    前面介绍了那么多,现在终于到了重点了,前面讲述的功能我在这里都将为大家一一说明。
    首先给大家看一下工程目录的截图:
    工程目录图

    项目总体流程思路

    接下来我根据项目的实现过程来给大家介绍整个项目的总体流程

    1、天气app最重要的是获取城市列表和天气信息,所以首先要解决的问题是在网络上找到合适的api接口,并根据服务商提供的数据转换成自己需要显示的数据。
    2、有了需要的显示信息之后,我们需要自己去设计怎么显示,怎么让用户去有一个好的体验。我的设计是在使用三个Activity去和用户交互,参照我的项目截图,其中WeatherActivity作为启动活动,用于显示天气信息,提供的是多页带导航栏可左右滑动的效果。ChooseAreaActivity是管理城市的活动,用于添加、删除、改变要显示天气信息的城市列表。AddCountyActivity是用于添加城市的活动。
    3、实现了这些基本的城市管理和天气显示之后,接下来就是进阶功能了,首先我们实现百度定位功能,根据定位结果加载当前城市天气。
    4、实现widget功能。

    这个项目总体的思路就是这样的,接下来我们一步一步的去说明

    #城市和天气信息获取模块

    1、获取城市信息

    数据链接http://guolin.tech/api/china,访问返回的是JSON数据类型的省份信息,需要返回城市时只需要在本链接后加上“/对应省份id”即可获取到相应的城市信息,县市信息也是一样的,原链接加上“/对应省份id/对应城市id”即可。
    大家点击网址可以得到这样的响应:
    这里写图片描述
    这里得到的是一个JSON数据,以下是对它的解析代码:

    JSONArray jsonArray = new JSONArray(response);
                    for (int i = 0; i < jsonArray.length(); ++i) {
                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        Province province = new Province();
                        province.setProvinceCode(jsonObject.getInt("id"));
                        province.setProvinceName(jsonObject.getString("name"));
                        province.save();
                    }
            这里的后几行代码是我使用LItepal存储数据到数据库的操作,response变量就是访问网址得到的原JSON数据。
            网上关于JSON的解析方法很多,这边不再说得过多。
            这边还需要说明的是怎么去网上获取JSON数据。
            首先要说明的是网络操作是不能在UI线程里进行的,否则会程序崩溃。所以这里必须用的异步线程去处理网络加载的问题,并且在加载线程事使用一个进度条来给予用户交互。
            以下是网络加载的代码:
            ```java
            public static void sendRequestOkHttpForGet(final String adress,final MyCallBack myCallBack) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpURLConnection connection = null;
                    try {
                        URL url = new URL(adress);
                        connection = (HttpURLConnection) url.openConnection();
                        connection.setRequestMethod("GET");
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        InputStream in = connection.getInputStream();
                        String response = convertStreamToString(in);
                        //回调接口函数,让主线程处理
                        //成功
                        myCallBack.onResponse(response);
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                        //失败
                        myCallBack.onFailure(e);
                    } catch (ProtocolException e) {
                        e.printStackTrace();
                        myCallBack.onFailure(e);
                    } catch (IOException e) {
                        e.printStackTrace();
                        myCallBack.onFailure(e);
                    } finally {
                        if (null != connection) {
                            connection.disconnect();
                        }
                    }
                }
            }).start();
       其中第一个参数是要访问的网络的地址,第二个参数是一个回调接口。
            public interface MyCallBack {
    
            void onFailure(IOException e);
    
            void onResponse(String response) throws IOException;
    }
    
    	第一个参数没有什么好说的(就是我们刚刚使用的 ),第二个参数是异步线程经常会用到的一个和主线程交互的手段。在调用函数时传入一个回调接口的指针,当异步线程完成相应的耗时操作之后,再使用该指针调用回调函数即可实现异步线程与主线程的交互了。
    	城市列表的信息的获取到这里就算结束了。
    

    2、获取天气信息

    获取天气信息的网络操作是和获取城市信息的操作是一样的,使用上面那个网络异步函数即可,如果觉得不好,也可以使用网络开源项目包装的网络访问接口,比如说OKHttp。不同的是天气信息的JSON数据要比城市信息的JSON数据复杂得多。
    这里提供连接给大家感受一下深圳天气
    这里写图片描述
    这里是用Chrome的JSON-handle解析之后的结果。可以看到还是比较复杂的。所以这里我们采用GSON方式来解析JSON,方便我们后面对数据的操作。
    GSON方式是把JSON数据解析成相应的对象的一种方式,主要步骤如下:
    1、根据JSON数据建立不同的类,JSON数据的每一个结点对应一个类,并且根据不同的结点的复杂程度选择是否还要使用内部类。
    2、@SerializedName(“JSON中的结点名”)需要转换成的节点名;
    使用关键字把一些JSON数据中意义晦涩的名词转换成类中名字可以见名知意的属性。
    3、JSON数据转换成对象实例

    JSONObject jsonObject = new JSONObject(response);
                    JSONArray jsonArray = jsonObject.getJSONArray("HeWeather5");
                    String weateherContent = jsonArray.getJSONObject(0).toString();
                    return new Gson().fromJson(weateherContent, 类名.class);
    

    最后,我们把得到的对象的数据对应的添加到要显示的活动的布局当中就可以了。

    #城市和天气信息显示模块

    3、天气信息的显示

    这里相对麻烦一点,因为天气信息的显示中我们做了比较多的功能

    获取背景图片和图片的更新

    这里我使用的是必应主页提供的背景图片作为天气信息显示的背景图片http://guolin.tech/api/bing_pic这个链接是获取必应每日背景图片下载链接的,可以通过该链接获取图片下载地址,然后再去下载。
    由于下载图片是耗时的网络操作,所以我们这里需要使用一个异步线程去下载图片,然后在下载好之后再通知UI线程去加载。
    具体代码:

    		public void updateBingPic() {
            String requestBingPic = "http://guolin.tech/api/bing_pic";
            OkHttp.sendRequestOkHttpForGet(requestBingPic, new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    e.printStackTrace();
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String bingPic = response.body().string();
                    SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(WeatherActivity.this).edit();
                    editor.putString("bing_pic", bingPic);
                    editor.apply();
                }
            });
        }
    

    这个是获取图片下载地址的代码,变量bingPic的内容就是下载链接
    if (bingPic != null) {
    Glide.with(WeatherActivity.this).load(bingPic).into(bingPicIv);
    }
    当它不为空时,我们使用Glide去下载并加载图片到天气显示背景。Glide 是 Google 员工的开源项目, Google I/O 上被推荐使用Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。

    天气显示信息左右活动切换已选择要显示的城市(ViewPager)

    ViewPager是android扩展包v4包中的类,主要功能是实现view页面的左右切换。在本项目中,就是一个view包含一个城市的天气信息,然后view又加入到ViewPager中。
    这里说一下ViewPager的使用步骤,ViewPager的实现与ListView有很多相似之处,主要步骤如下:
    1、创建或设置数据源。
    2、根据数据源创建或配置好相应的适配器。
    3、在布局文件中加入ViewPager控件,并在程序给控件设置步骤2中的适配器。
    4、给控件添加监听器。
    PS:其实Android中很多包含多View的控件都是通过以上步骤实现的,很相似,只要我们认真的掌握了其中的一种,那么别的也就很容易去上手了。

    下拉刷新功能

    本项目中的下拉刷新功能是使用SwipeRefreshLayout控件实现的,实现的步骤很简单:
    1、在布局文件中实现下拉刷新功能的地方添加android.support.v4.widget.SwipeRefreshLayout控件,这里推荐使用v4包,因为能够支持低版本的Android手机。
    2、在程序中定义并设置相应属性(样式等等)和监听器。
    3、设置事件的相应响应和启动下拉刷新和结束下拉刷新。

    通过点击右上角的编辑按钮进入城市管理功能

    这里的实现就很基础了,简单讲一下步骤:
    1、在布局文件定义按钮
    2、在程序中找到按钮并设置监听器
    3、在响应事件中做进入城市功能活动的逻辑

    导航组件功能

    本项目的导航栏功能是用Selector实现,Selector主要是用来改变各种view控件的默认背景的。实现步骤如下:
    1、xml文件定义
    ?xml version=“1.0” encoding=“utf-8” ?>
    selector xmlns:android=“http://schemas.android.com/apk/res/android”>
    !-- 默认时的背景图片–>
    item android:drawable="@drawable/pic1" />
    !-- 没有焦点时的背景图片 -->
    item android:state_window_focused=“false”
    android:drawable="@drawable/pic1" />
    !-- 非触摸模式下获得焦点并单击时的背景图片 -->
    item android:state_focused=“true” android:state_pressed=“true” android:drawable= “@drawable/pic2” />
    !-- 触摸模式下单击时的背景图片–>
    item android:state_focused=“false” android:state_pressed=“true” android:drawable="@drawable/pic3" />
    !–选中时的图片背景–>
    item android:state_selected=“true” android:drawable="@drawable/pic4" />
    !–获得焦点时的图片背景–>
    item android:state_focused=“true” android:drawable="@drawable/pic5" />
    /selector>

    2、使用
    LinearLayout layout = (LinearLayout)findViewById(R.id.vp_guide_layout);
    LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(20, 20);
    mParams.setMargins(0, 0, 0, 0);//设置小圆点左右之间的间隔

        guideShapeViewArrayList.clear();
        layout.removeAllViews();
        ImageView imageView = new ImageView(this);
        imageView.setLayoutParams(mParams);
        imageView.setImageResource(R.drawable.guide_shape_select);
    

    小时天气小时超出屏幕宽度时的当前页面左右滑动(RecycleListView)

    RecycleListView是Android官方出品的一个可以代替甚至超越ListView的东西。RecycleListView的实现比不优化的ListView麻烦一些,但是功能上比ListView要更强大,因为他的显示不仅可以竖屏,还可以横屏。
    实现步骤:
    1、准备数据源
    2、根据数据源设置适配器
    static class ViewHolder extends RecyclerView.ViewHolder {
    TextView hourlyTimeTV;
    ImageView hourlyWeatherImageV;
    TextView hourlyTemperatureTV;

        public ViewHolder(View view){
            super(view);
            hourlyTimeTV = (TextView) view.findViewById(R.id.hourly_time_tv);
            hourlyWeatherImageV = (ImageView) view.findViewById(R.id.hourly_weather_iv);
            hourlyTemperatureTV = (TextView) view.findViewById(R.id.hourly_temperature_tv);
        }
    }
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hourly_forecast_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        HourlyWeather hourlyWeather = hourlyWeatherList.get(position);
        holder.hourlyTimeTV.setText(hourlyWeather.hourlyTime + "时");
        holder.hourlyWeatherImageV.setImageBitmap(hourlyWeather.hourlyImageBit);
        holder.hourlyTemperatureTV.setText(hourlyWeather.hourlyTemperature + "º");
    }
    
    @Override
    public int getItemCount() {
        return hourlyWeatherList.size();
    }
    

    要实现RecyclerView.Adapter主要是要实现三个函数
    onCreateViewHolder()
    onBindViewHolder()
    getItemCount()

    3、在布局文件定义RecycleView控件,并在代码中为控件设置以上适配器。
    4、选择是否要设置监听器。

    有没有发现和ListView,ViewPager的实现步骤很相似呢。

    布局圆角功能

    布局圆角主要是为了让布局中的控件看起来美观一些。
    实现很简单
    1、在drawable中定义xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="#8000" />
        <corners
            <android:topLeftRadius="10dp"
            <android:topRightRadius="10dp"
            <android:bottomRightRadius="10dp"
            <android:bottomLeftRadius="10dp"/>
    </shape>
    

    2、在需要引入圆角的布局文件中引入本配置作为背景

    android:background="@drawable/corners_bg"
    

    4、城市信息的显示

    这里相对麻烦一点,因为城市信息的显示中我们做了比较多的功能,下面线总体介绍项目使用到的功能模块,然后再一一说明:
    1、活动切换按钮,这里就不再重复说明了。
    2、添加城市。
    3、可拖拽的ListView(DragListView)的城市信息实现
    本模块我们主要讲解DragListview的实现:
    这里写图片描述
    这里实现的主要功能有:删除城市、城市排序切换。
    实现步骤:
    1、准备数据源
    2、设置适配器

    public class CountiesAdapter extends BaseAdapter {
            private Context context;
            //适配器的数据源 selectedCityList
            private List<SelectedCounty> items;
    
            public CountiesAdapter(Context context,List<SelectedCounty> selectedCityList){
                this.context = context;
                this.items = selectedCityList;
                LogUtil.d(TAG, "CountiesAdapter: selectedCityList size:" + selectedCityList.size());
                LogUtil.d(TAG, "CountiesAdapter: selectedCityList items size:" + items.size());
            }
    
            @Override
            public int getCount() {
                return items.size();
            }
    
            @Override
            public Object getItem(int arg0) {
                return items.get(arg0);
            }
    
            @Override
            public long getItemId(int arg0) {
                return arg0;
            }
    
            public void remove(int arg0) {//删除指定位置的item
                items.remove(arg0);
                this.notifyDataSetChanged();//不要忘记更改适配器对象的数据源
            }
    
            public void insert(SelectedCounty item, int arg0) {
                items.add(arg0, item);
                this.notifyDataSetChanged();
            }
    
            public void change(List<SelectedCounty> selectedCityList) {
                items = selectedCityList;
                this.notifyDataSetChanged();
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                SelectedCounty item = (SelectedCounty)getItem(position);
                ViewHolder viewHolder;
                if(null == convertView){
                    viewHolder = new ViewHolder();
                    convertView = LayoutInflater.from(context).inflate(R.layout.drag_listview_item, null);
                    viewHolder.dragMoveIv = (ImageView) convertView.findViewById(R.id.drag_move_iv);
                    viewHolder.dragCountyNameTv = (TextView) convertView.findViewById(R.id.drag_county_name_tv);
                    viewHolder.drag_click_remove = (ImageView) convertView.findViewById(R.id.drag_click_remove);
                    moveImageViewList.add(viewHolder.dragMoveIv);
                    deleteImageViewList.add(viewHolder.drag_click_remove);
                    convertView.setTag(viewHolder);
                }else{
                    viewHolder = (ViewHolder) convertView.getTag();
                }
                //是否点击了edit按钮,
                if (isEditClick) {
                    if (!WeatherActivity.isLocationCountyRemove && null != WeatherActivity.locationCountyWeatherId && 0 == position ) {
                        viewHolder.drag_click_remove.setVisibility(View.GONE);
                    } else {
                        viewHolder.dragMoveIv.setVisibility(View.VISIBLE);
                        viewHolder.drag_click_remove.setVisibility(View.VISIBLE);
                    }
                }else {
                    viewHolder.dragMoveIv.setVisibility(View.GONE);
                    viewHolder.drag_click_remove.setVisibility(View.GONE);
                }
                viewHolder.dragCountyNameTv.setText(item.getCountyName());
                return convertView;
            }
    
            class ViewHolder {
                ImageView dragMoveIv;
                TextView dragCountyNameTv;
                ImageView drag_click_remove;
            }
        }
    

    别的地方和ListView是一样的,不同的是多了一个remove和insert函数

    public void remove(int arg0) {//删除指定位置的item
                items.remove(arg0);
                this.notifyDataSetChanged();//不要忘记更改适配器对象的数据源
            }
    
            public void insert(SelectedCounty item, int arg0) {
                items.add(arg0, item);
                this.notifyDataSetChanged();
            }
    

    3、控件绑定适配器
    这里也有区别:首先要定义两个函数:

    //监听器在手机拖动停下的时候触发
        private DragSortListView.DropListener onDrop =
                new DragSortListView.DropListener() {
                    @Override
                    public void drop(int from, int to) {//from to 分别表示 被拖动控件原位置 和目标位置
                        //如果定位城市存在,则去除定位城市的操作
                        if (!WeatherActivity.isLocationCountyRemove && null != WeatherActivity.locationCountyWeatherId) {
                            if (0 == from || 0 == to) {
                                return;
                            }
                        }
                        if (from != to) {
                            SelectedCounty item = (SelectedCounty)countiesAdapter.getItem(from);//得到listview的适配器
                            countiesAdapter.remove(from);//在适配器中”原位置“的数据。
                            countiesAdapter.insert(item, to);//在目标位置中插入被拖动的控件。
                            isSwapCounty = true;
                        }
                    }
                };
        //删除监听器,点击左边差号就触发。删除item操作。
        private DragSortListView.RemoveListener onRemove =
                new DragSortListView.RemoveListener() {
                    @Override
                    public void remove(int which) {
                        delCountyId.add(selectedCityList.get(which).getId());
                        delCountyIndex.add(which);
                        countiesAdapter.remove(which);
                        Log.d(TAG, "onClick: remove position:" + which);
                    }
                };
    

    然后绑定适配器时这两个函数也一起绑定

    //水平滑动显示
            hourlyRecycler = (RecyclerView) currentView.findViewById(R.id.hourly_recycler);
            layoutManager = new LinearLayoutManager(currentView.getContext());
            layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
            hourlyRecycler.setLayoutManager(layoutManager);
            hourlyWeatherAdapter = new HourlyWeatherAdapter(hourlyWeatherList);
            hourlyRecycler.setAdapter(hourlyWeatherAdapter);
    

    有问题或要 者建议的可以在评论留言,需要源码的也可以留言,我看到了都会及时回复的。
    未完待续。。。。。。


    展开全文
  • 免费天气预报接口

    2014-11-15 10:22:56
    使用java实现本地天气预报信息显示 首先该接口是调用 中国天气网的接口数据,也就是中国气象局的数据。我这里采用的访问地址是: http://www.weather.com.cn/data/cityinfo/ 城市代码为101010100 (北京)...

    以下文章属于原创,转载请标明出处 http://www.pm-road.com/index.php/2014/08/27/81/

    使用java实现本地天气预报信息显示

    首先该接口是调用 中国天气网的接口数据,也就是中国气象局的数据。我这里采用的访问地址是:

    http://www.weather.com.cn/data/cityinfo/      城市代码为101010100  (北京)

    然后:写后台代码:

    1:先写一个天气预报的接口:IWeatherAPI 

    里面包括方法:

    public interface IWeatherAPI {
    /**
    * 从host获得相应的city 天气字符串
    * @return
    */
    public String getWeatherStr() throws Exception;
    /**
    * 从host获得相应的city 天气字符串
    * @param host 请求服务地址
    * @param city 得到哪个城市的天气
    * @return
    */
    public String getWeatherStr(String host,String city) throws Exception;
    /**
    * 得到服务器地址
    * @return
    */
    public String getHost();
    /**
    * 获取哪个城市
    * @return
    */
    public String getCity();
    }

     

    其中实现方法为:

    public class WeatherAPIImpl implements IWeatherAPI {
    /*
    * 得到相应城市的天气
    * @see com.otitan.tgs.api.IWeatherAPI#getWeatherStr(java.lang.String, java.lang.String)
    */
    @Override
    public String getWeatherStr() throws Exception {
    return getWeatherStr(getHost(),getCity());
    }

    /*
    * 得到相应城市的天气
    * @see com.otitan.tgs.api.IWeatherAPI#getWeatherStr(java.lang.String, java.lang.String)
    */
    @Override
    public String getWeatherStr(String host, String city) throws Exception {
    try {
    InputStream is = WebServiceUtil.get(host+city+”.html”);
    String weather = WebServiceUtil.streamToStr(is,”UTF-8″);
    is.close();
    return weather;
    } catch (ClientProtocolException e) {
    e.printStackTrace();
    Logs.error(“获取天气预报接口请求失败,请确认对方主机是否连接正常”);
    throw e;
    } catch (URISyntaxException e) {
    e.printStackTrace();
    throw e;
    } catch (IOException e) {
    e.printStackTrace();
    throw e;
    }
    }

    /*
    * 得到请求服务器
    * @see com.otitan.tgs.api.IWeatherAPI#getHost()
    */
    @Override
    public String getHost() {

    String host = Util.KONG;
    try{
    host = Util.loadProperties().getString(“weather_host”);
    }catch (Exception e) {
    Logs.error(“获取天气预报接口主机失败”);
    }
    return host;
    }

    /*
    * 得到要请求的城市
    * @see com.otitan.tgs.api.IWeatherAPI#getCity()
    */
    @Override
    public String getCity() {
    String city = Util.KONG;
    try{
    city = Util.loadProperties().getString(“city”);
    }catch (Exception e) {
    Logs.error(“获取天气预报城市失败”);
    }
    return city;
    }

    }

     

    其中有一个WebServiceUtil   类,此类的方法如下:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.URI;
    import java.net.URISyntaxException;

    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.mime.MultipartEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import java.security.cert.X509Certificate;

    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.conn.ClientConnectionManager;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.scheme.SchemeRegistry;

    public class WebServiceUtil {

    /**
    * 发送请求
    *
    * @param url
    *            请求服务器
    * @param parameters
    *            请求参数
    * @return inputStream 返回该流后,调用者必须关闭该流
    * @throws Exception
    */
    public static InputStream post(String url, MultipartEntity parameters)
    throws Exception {

    HttpClient client = new DefaultHttpClient();
    HttpPost postrequest = new HttpPost(url);
    try {
    if (parameters != null) {
    postrequest.setEntity(parameters);
    }
    HttpResponse postresponse = client.execute(postrequest);
    InputStream is = postresponse.getEntity().getContent();
    return is;
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    throw e;
    } catch (ClientProtocolException e) {
    e.printStackTrace();
    throw e;
    } catch (IOException e) {
    e.printStackTrace();
    throw e;
    } catch (Exception e) {
    e.printStackTrace();
    throw e;
    }
    }
    /**
    * httpsPost请求
    *
    * @param url
    *            请求服务器
    * @param parameters
    *            请求参数
    * @return inputStream 返回该流后,调用者必须关闭该流
    * @throws Exception
    */
    public static InputStream httpspost(String url, MultipartEntity parameters)
    throws Exception {

    HttpClient client = new DefaultHttpClient();
    client = wrapClient(client);
    HttpPost postrequest = new HttpPost(url);
    try {
    if (parameters != null) {
    postrequest.setEntity(parameters);
    }
    HttpResponse postresponse = client.execute(postrequest);
    InputStream is = postresponse.getEntity().getContent();
    return is;
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    throw e;
    } catch (ClientProtocolException e) {
    e.printStackTrace();
    throw e;
    } catch (IOException e) {
    e.printStackTrace();
    throw e;
    } catch (Exception e) {
    e.printStackTrace();
    throw e;
    }
    }

    /**
    * get 请求
    *
    * @param url
    * @return InputStream
    * @throws URISyntaxException
    * @throws ClientProtocolException
    * @throws IOException
    */
    public static InputStream get(String url) throws URISyntaxException,
    ClientProtocolException, IOException {
    // 定义HttpClient
    HttpClient client = new DefaultHttpClient();
    // 实例化HTTP方法
    HttpGet request = new HttpGet();
    request.setURI(new URI(url));
    HttpResponse response = client.execute(request);
    InputStream is = response.getEntity().getContent();
    return is;
    }

    /**
    * httpsget 请求 防止有证书的
    *
    * @param url
    * @return InputStream
    * @throws URISyntaxException
    * @throws ClientProtocolException
    * @throws IOException
    */
    public static InputStream httpsget(String url) throws URISyntaxException,
    ClientProtocolException, IOException {
    // 定义HttpClient
    HttpClient client = new DefaultHttpClient();
    client = wrapClient(client);
    // 实例化HTTP方法
    HttpGet request = new HttpGet();
    request.setURI(new URI(url));
    HttpResponse response = client.execute(request);
    InputStream is = response.getEntity().getContent();
    return is;
    }

    /**
    * 将流转换成字符串
    *
    * @param is
    * @param code  字符编码
    * @return 返回字符串之后,必须关闭流
    * @throws IOException
    */
    public static String streamToStr(InputStream is,String code) throws IOException {
    StringBuilder sb = new StringBuilder();
    try {
    if (is != null) {
    BufferedReader reader = new BufferedReader(
    new InputStreamReader(is, code));
    String line;
    while ((line = reader.readLine()) != null) {
    sb.append(line);
    }
    }
    return sb.toString();
    } catch (IOException e) {
    throw e;
    }
    }

    /**
    * 获取可信任https链接,以避免不受信任证书出现peer not authenticated异常
    *
    * @param base
    * @return
    */
    public static HttpClient wrapClient(HttpClient base) {
    try {
    SSLContext ctx = SSLContext.getInstance(“TLS”);
    X509TrustManager tm = new X509TrustManager() {
    public void checkClientTrusted(X509Certificate[] xcs,
    String string) {
    }

    public void checkServerTrusted(X509Certificate[] xcs,
    String string) {
    }

    public X509Certificate[] getAcceptedIssuers() {
    return null;
    }
    };
    ctx.init(null, new TrustManager[] { tm }, null);
    SSLSocketFactory ssf = new SSLSocketFactory(ctx);
    ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    ClientConnectionManager ccm = base.getConnectionManager();
    SchemeRegistry sr = ccm.getSchemeRegistry();
    sr.register(new Scheme(“https”, ssf, 443));

    return new DefaultHttpClient(ccm, base.getParams());
    } catch (Exception ex) {
    ex.printStackTrace();
    return null;
    }
    }

    }

     

    其中也包括一个Util 类,方法如下:其中的loadProperties  是加载配置文件的方法

    public class Util {

    public static final String KONG = “”;
    public static final String KONGGE = ” “;
    public static final String NULL = “null”;
    public static final String YEARMONTHDAY = “yyyy-MM-dd”;
    public static final String INDEXDATE = “yyyy/MM/dd”;
    public static final String HOURMINSECOND = “yyyy-MM-dd HH:mm:ss”;
    public static final String DOUHAO = “,”;
    public static final int PAGECOUNT = 35;//火车站点用于每页显示的数量
    /**
    * 判断字符串是否为空
    * @param arg
    * @return
    */
    public static boolean isEmpty(String arg){
    if(arg == null || NULL.equals(arg) || KONG.equals(arg.trim())){
    return true;
    }else{
    return false;
    }
    }

    /**
    * 将字符串转换成时间对象
    * @param sourceStr
    * @param format
    * @return
    * @throws ParseException
    */
    public static Date strToDate(String sourceStr,String format) throws ParseException{
    return new SimpleDateFormat(format).parse(sourceStr);
    }

    /**
    * 将时间类型转换成相应的字符串
    * @param date
    * @param format
    * @return
    */
    public static String dateToStr(Date date,String format){
    if(date == null){
    return KONG;
    }else{
    return new SimpleDateFormat(format).format(date);
    }
    }

    /**
    * 加载配置文件 config.properties
    * @return
    */
    public static ResourceBundle loadProperties() {

    ResourceBundle rb = ResourceBundle.getBundle(“config”, Locale.getDefault());
    return rb;
    }

    /**
    * 将iso字符转换成utf8
    * 用于乱码
    * @param iso
    * @return
    */
    public static String isoToUtf8(String iso){

    if(!isEmpty(iso)){
    try {
    String utf = new String(iso.getBytes(“ISO8859-1″),”UTF-8″);
    return utf;
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    Logs.error(“转换字符错误”);
    return KONG;
    }
    }else{
    return KONG;
    }
    }
    /**
    * main
    * @param args
    */
    public static void main(String[] args) {
    }

    /**
    * 获取当前的时间字符串
    * @return
    */
    public static String getSystemTime() {
    return format( new Date(), HOURMINSECOND );
    }
    /**
    * 将指定的时间按照指定的格式转换为字符串
    * @param d
    * @param format
    * @return
    */
    public static String format( Date d, String format ) {
    SimpleDateFormat sdf = new SimpleDateFormat(format);
    return sdf.format(d);
    }
    }

     

    配置文件:config.properties

    ###############配置文件##################
    #############天气预报接口配置############
    #weather_host=http://www.weather.com.cn/data/sk/
    weather_host=http://www.weather.com.cn/data/cityinfo/
    #三亚城市代码
    #city=101310201
    #北京城市代码
    city=101010100

    接下来调用WeatherAPIImpl类的 getWeatherStr()方法,就可以返回天气预报的字符串,返回的字符串为一个json对象的字符串,

    而前台拿到json字符串之后,便可以进行解析即可。我是这样进行解析的:

    var weatherObj = eval(json);//json为返回的天气字符串
    if(weatherObj[0]){

    var weather = weatherObj[0].weatherinfo;
    var info = weather.weather;//天气
    var hightemp = weather.temp1;//温度
    var lowtemp = weather.temp2;//温度
    var pic = weather.img1;
    var css = pic.split(“.gif”)[0];//得到相应的天气图标css,然后把中国天气网的天气背景图片下载下来,放到本地用于展示
    if(css.length ==2){
    var cssfirst = css.substr(0,1);
    var csssecond = css.substr(1);
    css = cssfirst+”0″+csssecond;
    }
    $(“#weatherimg”).addClass(“jpg80″).addClass(css);
    $(“#weather”).html(info+”&nbsp;&nbsp;最高温度:”+hightemp+”&nbsp;&nbsp;最低温度”+lowtemp);
    }else{
    $(“#weather”).html(“天气接口获取失败”);
    }

     

    以下是自己解析后的css样式 :
    .jpg80 {
    background-image: url(“../../img/weather/blue80.jpg”);//该图片从中国天气网下载而来
    height: 80px;
    width: 80px;
    }
    .d00 {
    background-position: 0 0;
    }
    .d01 {
    background-position: -80px 0;
    }
    .d02 {
    background-position: -160px 0;
    }
    .d03 {
    background-position: -240px 0;
    }
    .d04 {
    background-position: -320px 0;
    }
    .d05 {
    background-position: -400px 0;
    }
    .d06 {
    background-position: -480px 0;
    }
    .d07 {
    background-position: -560px 0;
    }
    .d08 {
    background-position: -640px 0;
    }
    .d09 {
    background-position: 0 -80px;
    }
    .d10 {
    background-position: -80px -80px;
    }
    .d11 {
    background-position: -160px -80px;
    }
    .d12 {
    background-position: -240px -80px;
    }
    .d13 {
    background-position: -320px -80px;
    }
    .d14 {
    background-position: -400px -80px;
    }
    .d15 {
    background-position: -480px -80px;
    }
    .d16 {
    background-position: -560px -80px;
    }
    .d17 {
    background-position: -640px -80px;
    }
    .d18 {
    background-position: 0 -160px;
    }
    .d19 {
    background-position: -80px -160px;
    }
    .d20 {
    background-position: -160px -160px;
    }
    .d21 {
    background-position: -240px -160px;
    }
    .d22 {
    background-position: -320px -160px;
    }
    .d23 {
    background-position: -400px -160px;
    }
    .d24 {
    background-position: -480px -160px;
    }
    .d25 {
    background-position: -560px -160px;
    }
    .d26 {
    background-position: -640px -160px;
    }
    .d27 {
    background-position: 0 -240px;
    }
    .d28 {
    background-position: -80px -240px;
    }
    .d29 {
    background-position: -160px -240px;
    }
    .d30 {
    background-position: -240px -240px;
    }
    .d31 {
    background-position: -320px -240px;
    }
    .d32 {
    background-position: -400px -240px;
    }
    .d33 {
    background-position: -480px -240px;
    }
    .d53 {
    background-position: -560px -240px;
    }
    .n00 {
    background-position: 0 -320px;
    }
    .n01 {
    background-position: -80px -320px;
    }
    .n02 {
    background-position: -160px -320px;
    }
    .n03 {
    background-position: -240px -320px;
    }
    .n04 {
    background-position: -320px -320px;
    }
    .n05 {
    background-position: -400px -320px;
    }
    .n06 {
    background-position: -480px -320px;
    }
    .n07 {
    background-position: -560px -320px;
    }
    .n08 {
    background-position: -640px -320px;
    }
    .n09 {
    background-position: 0 -400px;
    }
    .n10 {
    background-position: -80px -400px;
    }
    .n11 {
    background-position: -160px -400px;
    }
    .n12 {
    background-position: -240px -400px;
    }
    .n13 {
    background-position: -320px -400px;
    }
    .n14 {
    background-position: -400px -400px;
    }
    .n15 {
    background-position: -480px -400px;
    }
    .n16 {
    background-position: -560px -400px;
    }
    .n17 {
    background-position: -640px -400px;
    }
    .n18 {
    background-position: 0 -480px;
    }
    .n19 {
    background-position: -80px -480px;
    }
    .n20 {
    background-position: -160px -480px;
    }
    .n21 {
    background-position: -240px -480px;
    }
    .n22 {
    background-position: -320px -480px;
    }
    .n23 {
    background-position: -400px -480px;
    }
    .n24 {
    background-position: -480px -480px;
    }
    .n25 {
    background-position: -560px -480px;
    }
    .n26 {
    background-position: -640px -480px;
    }
    .n27 {
    background-position: 0 -560px;
    }
    .n28 {
    background-position: -80px -560px;
    }
    .n29 {
    background-position: -160px -560px;
    }
    .n30 {
    background-position: -240px -560px;
    }
    .n31 {
    background-position: -320px -560px;
    }
    .n32 {
    background-position: -400px -560px;
    }
    .n33 {
    background-position: -480px -560px;
    }
    .n53 {
    background-position: -560px -560px;
    }

    最终效果如下图:

    天气预报样图

    实现天气预报接口

    展开全文
  • andorid调用天气预报

    千次阅读 2013-12-12 19:40:59
    今天闲来想做个android的天气预报,百度之,谷歌的天气预报非常的多,下载demo,发现不能访问,至于 原因,你懂得。期间走了很多弯路,为了节省大家时间,就把遇到的坎一一写上。 一、API选择 简单选择后,选用...

    andorid调用天气预报

    今天闲来想做个android的天气预报,百度之,谷歌的天气预报非常的多,下载demo,发现不能访问,至于

    原因,你懂得。期间走了很多弯路,为了节省大家时间,就把遇到的坎一一写上。

    一、API选择

    简单选择后,选用新浪的API

    地址:http://php.weather.sina.com.cn/xml.php?password=DJOYnieT8234jlsK&day=0&city=%B8%A3%D6%DD

    (红色标记内容为城市名称的转码格式,day=0表示当前天,1表示明天 以此类推,最大为5)

    因为期间又看到了http://m.weather.com.cn的API

    http://m.weather.com.cn/data/101230101.html

    然后悲剧就来了,鬼死神拆的认为city是城市的code。后面也就走了很多弯路,先卖个关子。

    新浪天气预报的XML报文

    <?xml version="1.0" encoding="UTF-8" ?> 
    <!--  published at 2013-05-13 23:37:52 
      --> 
    <Profiles>
    <Weather>
      <city>福州</city> 
      <status1>多云</status1> 
      <status2>多云</status2> 
      <figure1>duoyun</figure1> 
      <figure2>duoyun</figure2> 
      <direction1>无持续风向</direction1> 
      <direction2>无持续风向</direction2> 
      <power1>≤3</power1> 
      <power2>≤3</power2> 
      <temperature1>28</temperature1> 
      <temperature2>20</temperature2> 
      <ssd>7</ssd> 
      <tgd1>25</tgd1> 
      <tgd2>25</tgd2> 
      <zwx>2</zwx> 
      <ktk>4</ktk> 
      <pollution>3</pollution> 
      <xcz>5</xcz> 
      <zho /> 
      <diy /> 
      <fas /> 
      <chy>1</chy> 
      <zho_shuoming>暂无</zho_shuoming> 
      <diy_shuoming>暂无</diy_shuoming> 
      <fas_shuoming>暂无</fas_shuoming> 
      <chy_shuoming>短袖衫、短裙、短裤、薄型T恤衫、敞领短袖棉衫</chy_shuoming> 
      <pollution_l>一般</pollution_l> 
      <zwx_l></zwx_l> 
      <ssd_l>偏热</ssd_l> 
      <fas_l>暂无</fas_l> 
      <zho_l>暂无</zho_l> 
      <chy_l>薄短袖类</chy_l> 
      <ktk_l>不需要开启</ktk_l> 
      <xcz_l>不适宜</xcz_l> 
      <diy_l>暂无</diy_l> 
      <pollution_s>对空气污染物扩散无明显影响</pollution_s> 
      <zwx_s>紫外线弱</zwx_s> 
      <ssd_s>天气偏热,适当调整穿衣后,仍可达到比较舒适的程度。</ssd_s> 
      <ktk_s>不需要开启空调</ktk_s> 
      <xcz_s>洗车后当日有降水、大风或沙尘天气,不适宜洗车</xcz_s> 
      <gm>1</gm> 
      <gm_l>低发期</gm_l> 
      <gm_s>环境温度较高,要提防长时间在空调环境中引发的空调病;</gm_s> 
      <yd>4</yd> 
      <yd_l>不太适宜</yd_l> 
      <yd_s>天气较热,不太适宜户外运动;</yd_s> 
      <savedate_weather>2013-05-13</savedate_weather> 
      <savedate_life>2013-05-13</savedate_life> 
      <savedate_zhishu>2013-05-13</savedate_zhishu> 
      </Weather>
      </Profiles>
    View Code

    XML节点说明

    标签中1表示白天,2表示夜间

     

    <status>

    < figure>

    <direction>

    <power>

    <temperature>

    <ssd>

    <ssd_l>

    <ssd_s>

    <tgd>

    <zwx>

    <zwx_l>

    <zwx_s>

    <ktk>

    <ktk_l>

    <ktk_s>

    <pollution>

    <pollution_l>

    <pollution_s>

    <xcz>

    <xcz_l>

    <xcz_s>

    <chy>

    <chy_l>

    <chy_shuoming>

    <gm>

    <gm_l>

    <gm_s>

    <yd>

    <yd_l>

    <yd_s>

    <zho>

    <zho_l>

    <zho_shuoming>

    <diy>

    <diy_l>

    <diy_shuoming>

    <fas>

    <fas_l>

    <fas_shuoming>

    <savedate_weather>

    <savedate_life>

    <savedate_zhishu>

    天气情况中文

    天气情况拼音

    风向

    风级

    温度

    体感指数数值

    体感度指数

    体感度指数说明

    体感温度

    紫外线指数数值

    紫外线指数

    紫外线指数说明

    空调指数数值

    空调指数

    空调指数说明

    污染指数数值

    污染物扩散条件

    污染指数说明

    洗车指数数值

    洗车指数

    洗车指数说明

    穿衣指数数值

    穿衣指数

    穿衣说明

    感冒指数数值

    感冒指数

    感冒指数说明

    运动指数数值

    运动指数

    运动指数说明

    天气预报日期

    生活日期

    指数日期

    好不容易找到全国对应的转换表,如下

    101010100=北京
    101010200=海淀
    101010300=朝阳
    101010400=顺义
    101010500=怀柔
    101010600=通州
    101010700=昌平
    101010800=延庆
    101010900=丰台
    101011000=石景山
    101011100=大兴
    101011200=房山
    101011300=密云
    101011400=门头沟
    101011500=平谷
    101011600=八达岭
    101011700=佛爷顶
    101011800=汤河口
    101011900=密云上甸子
    101012000=斋堂
    101012100=霞云岭
    
    
    101020100=上海
    101020200=闵行
    101020300=宝山
    101020400=川沙
    101020500=嘉定
    101020600=南汇
    101020700=金山
    101020800=青浦
    101020900=松江
    101021000=奉贤
    101021100=崇明
    101021101=陈家镇
    101021102=引水船
    101021200=徐家汇
    101021300=浦东
    
    
    101030100=天津
    101030200=武清
    101030300=宝坻
    101030400=东丽
    101030500=西青
    101030600=北辰
    101030700=宁河
    101030800=汉沽
    101030900=静海
    101031000=津南
    101031100=塘沽
    101031200=大港
    101031300=平台
    101031400=蓟县
    
    
    101040100=重庆
    101040200=永川
    101040300=合川
    101040400=南川
    101040500=江津
    101040600=万盛
    101040700=渝北
    101040800=北碚
    101040900=巴南
    101041000=长寿
    101041100=黔江
    101041200=万州天城
    101041300=万州龙宝
    101041400=涪陵
    101041500=开县
    101041600=城口
    101041700=云阳
    101041800=巫溪
    101041900=奉节
    101042000=巫山
    101042100=潼南
    101042200=垫江
    101042300=梁平
    101042400=忠县
    101042500=石柱
    101042600=大足
    101042700=荣昌
    101042800=铜梁
    101042900=璧山
    101043000=丰都
    101043100=武隆
    101043200=彭水
    101043300=綦江
    101043400=酉阳
    101043500=金佛山
    101043600=秀山
    101043700=沙坪坝
    
    
    101050101=哈尔滨
    101050102=双城
    101050103=呼兰
    101050104=阿城
    101050105=宾县
    101050106=依兰
    101050107=巴彦
    101050108=通河
    101050109=方正
    101050110=延寿
    101050111=尚志
    101050112=五常
    101050113=木兰
    101050201=齐齐哈尔
    101050202=讷河
    101050203=龙江
    101050204=甘南
    101050205=富裕
    101050206=依安
    101050207=拜泉
    101050208=克山
    101050209=克东
    101050210=泰来
    101050301=牡丹江
    101050302=海林
    101050303=穆棱
    101050304=林口
    101050305=绥芬河
    101050306=宁安
    101050307=东宁
    101050401=佳木斯
    101050402=汤原
    101050403=抚远
    101050404=桦川
    101050405=桦南
    101050406=同江
    101050407=富锦
    101050501=绥化
    101050502=肇东
    101050503=安达
    101050504=海伦
    101050505=明水
    101050506=望奎
    101050507=兰西
    101050508=青冈
    101050509=庆安
    101050510=绥棱
    101050601=黑河
    101050602=嫩江
    101050603=孙吴
    101050604=逊克
    101050605=五大连池
    101050606=北安
    101050701=大兴安岭
    101050702=塔河
    101050703=漠河
    101050704=呼玛
    101050705=呼中
    101050706=新林
    101050707=阿木尔
    101050708=加格达奇
    101050801=伊春
    101050802=乌伊岭
    101050803=五营
    101050804=铁力
    101050805=嘉荫
    101050901=大庆
    101050902=林甸
    101050903=肇州
    101050904=肇源
    101050905=杜蒙
    101051002=七台河
    101051003=勃利
    101051101=鸡西
    101051102=虎林
    101051103=密山
    101051104=鸡东
    101051201=鹤岗
    101051202=绥滨
    101051203=萝北
    101051301=双鸭山
    101051302=集贤
    101051303=宝清
    101051304=饶河
    
    
    101060101=长春
    101060102=农安
    101060103=德惠
    101060104=九台
    101060105=榆树
    101060106=双阳
    101060201=吉林
    101060202=舒兰
    101060203=永吉
    101060204=蛟河
    101060205=磐石
    101060206=桦甸
    101060207=烟筒山
    101060301=延吉
    101060302=敦化
    101060303=安图
    101060304=汪清
    101060305=和龙
    101060306=天池
    101060307=龙井
    101060308=珲春
    101060309=图们
    101060310=松江
    101060311=罗子沟
    101060312=延边
    101060401=四平
    101060402=双辽
    101060403=梨树
    101060404=公主岭
    101060405=伊通
    101060406=孤家子
    101060501=通化
    101060502=梅河口
    101060503=柳河
    101060504=辉南
    101060505=集安
    101060506=通化县
    101060601=白城
    101060602=洮南
    101060603=大安
    101060604=镇赉
    101060605=通榆
    101060701=辽源
    101060702=东丰
    101060801=松原
    101060802=乾安
    101060803=前郭
    101060804=长岭
    101060805=扶余
    101060901=白山
    101060902=靖宇
    101060903=临江
    101060904=东岗
    101060905=长白
    
    
    101070101=沈阳
    101070102=苏家屯
    101070103=辽中
    101070104=康平
    101070105=法库
    101070106=新民
    101070107=于洪
    101070108=新城子
    101070201=大连
    101070202=瓦房店
    101070203=金州
    101070204=普兰店
    101070205=旅顺
    101070206=长海
    101070207=庄河
    101070208=皮口
    101070209=海洋岛
    101070301=鞍山
    101070302=台安
    101070303=岫岩
    101070304=海城
    101070401=抚顺
    101070403=清原
    101070404=章党
    101070501=本溪
    101070502=本溪县
    101070503=草河口
    101070504=桓仁
    101070601=丹东
    101070602=凤城
    101070603=宽甸
    101070604=东港
    101070605=东沟
    101070701=锦州
    101070702=凌海
    101070703=北宁
    101070704=义县
    101070705=黑山
    101070706=北镇
    101070801=营口
    101070802=大石桥
    101070803=盖州
    101070901=阜新
    101070902=彰武
    101071001=辽阳
    101071002=辽阳县
    101071003=灯塔
    101071101=铁岭
    101071102=开原
    101071103=昌图
    101071104=西丰
    101071201=朝阳
    101071202=建平
    101071203=凌源
    101071204=喀左
    101071205=北票
    101071206=羊山
    101071207=建平县
    101071301=盘锦
    101071302=大洼
    101071303=盘山
    101071401=葫芦岛
    101071402=建昌
    101071403=绥中
    101071404=兴城
    
    
    101080101=呼和浩特
    101080102=土默特左旗
    101080103=托克托
    101080104=和林格尔
    101080105=清水河
    101080106=呼和浩特市郊区
    101080107=武川
    101080201=包头
    101080202=白云鄂博
    101080203=满都拉
    101080204=土默特右旗
    101080205=固阳
    101080206=达尔罕茂明安联合旗
    101080207=石拐
    101080301=乌海
    101080401=集宁
    101080402=卓资
    101080403=化德
    101080404=商都
    101080405=希拉穆仁
    101080406=兴和
    101080407=凉城
    101080408=察哈尔右翼前旗
    101080409=察哈尔右翼中旗
    101080410=察哈尔右翼后旗
    101080411=四子王旗
    101080412=丰镇
    101080501=通辽
    101080502=舍伯吐
    101080503=科尔沁左翼中旗
    101080504=科尔沁左翼后旗
    101080505=青龙山
    101080506=开鲁
    101080507=库伦旗
    101080508=奈曼旗
    101080509=扎鲁特旗
    101080510=高力板
    101080511=巴雅尔吐胡硕
    101080512=通辽钱家店
    101080601=赤峰
    101080602=赤峰郊区站
    101080603=阿鲁科尔沁旗
    101080604=浩尔吐
    101080605=巴林左旗
    101080606=巴林右旗
    101080607=林西
    101080608=克什克腾旗
    101080609=翁牛特旗
    101080610=岗子
    101080611=喀喇沁旗
    101080612=八里罕
    101080613=宁城
    101080614=敖汉旗
    101080615=宝过图
    101080701=鄂尔多斯
    101080703=达拉特旗
    101080704=准格尔旗
    101080705=鄂托克前旗
    101080706=河南
    101080707=伊克乌素
    101080708=鄂托克旗
    101080709=杭锦旗
    101080710=乌审旗
    101080711=伊金霍洛旗
    101080712=乌审召
    101080713=东胜
    101080801=临河
    101080802=五原
    101080803=磴口
    101080804=乌拉特前旗
    101080805=大佘太
    101080806=乌拉特中旗
    101080807=乌拉特后旗
    101080808=海力素
    101080809=那仁宝力格
    101080810=杭锦后旗
    101080811=巴盟农试站
    101080901=锡林浩特
    101080902=朝克乌拉
    101080903=二连浩特
    101080904=阿巴嘎旗
    101080905=伊和郭勒
    101080906=苏尼特左旗
    101080907=苏尼特右旗
    101080908=朱日和
    101080909=东乌珠穆沁旗
    101080910=西乌珠穆沁旗
    101080911=太仆寺旗
    101080912=镶黄旗
    101080913=正镶白旗
    101080914=正兰旗
    101080915=多伦
    101080916=博克图
    101080917=乌拉盖
    101080918=白日乌拉
    101080919=那日图
    101081000=呼伦贝尔
    101081001=海拉尔
    101081002=小二沟
    101081003=阿荣旗
    101081004=莫力达瓦旗
    101081005=鄂伦春旗
    101081006=鄂温克旗
    101081007=陈巴尔虎旗
    101081008=新巴尔虎左旗
    101081009=新巴尔虎右旗
    101081010=满洲里
    101081011=牙克石
    101081012=扎兰屯
    101081014=额尔古纳
    101081015=根河
    101081016=图里河
    101081101=乌兰浩特
    101081102=阿尔山
    101081103=科尔沁右翼中旗
    101081104=胡尔勒
    101081105=扎赉特旗
    101081106=索伦
    101081107=突泉
    101081108=霍林郭勒
    101081201=阿拉善左旗
    101081202=阿拉善右旗
    101081203=额济纳旗
    101081204=拐子湖
    101081205=吉兰太
    101081206=锡林高勒
    101081207=头道湖
    101081208=中泉子
    101081209=巴彦诺尔贡
    101081210=雅布赖
    101081211=乌斯太
    101081212=孪井滩
    
    
    101090101=石家庄
    101090102=井陉
    101090103=正定
    101090104=栾城
    101090105=行唐
    101090106=灵寿
    101090107=高邑
    101090108=深泽
    101090109=赞皇
    101090110=无极
    101090111=平山
    101090112=元氏
    101090113=赵县
    101090114=辛集
    101090115=藁城
    101090116=晋洲
    101090117=新乐
    101090201=保定
    101090202=满城
    101090203=阜平
    101090204=徐水
    101090205=唐县
    101090206=高阳
    101090207=容城
    101090208=紫荆关
    101090209=涞源
    101090210=望都
    101090211=安新
    101090212=易县
    101090213=涞水
    101090214=曲阳
    101090215=蠡县
    101090216=顺平
    101090217=雄县
    101090218=涿州
    101090219=定州
    101090220=安国
    101090221=高碑店
    101090301=张家口
    101090302=宣化
    101090303=张北
    101090304=康保
    101090305=沽源
    101090306=尚义
    101090307=蔚县
    101090308=阳原
    101090309=怀安
    101090310=万全
    101090311=怀来
    101090312=涿鹿
    101090313=赤城
    101090314=崇礼
    101090402=承德
    101090403=承德县
    101090404=兴隆
    101090405=平泉
    101090406=滦平
    101090407=隆化
    101090408=丰宁
    101090409=宽城
    101090410=围场
    101090411=塞罕坎
    101090501=唐山
    101090502=丰南
    101090503=丰润
    101090504=滦县
    101090505=滦南
    101090506=乐亭
    101090507=迁西
    101090508=玉田
    101090509=唐海
    101090510=遵化
    101090511=迁安
    101090601=廊坊
    101090602=固安
    101090603=永清
    101090604=香河
    101090605=大城
    101090606=文安
    101090607=大厂
    101090608=霸州
    101090609=三河
    101090701=沧州
    101090702=青县
    101090703=东光
    101090704=海兴
    101090705=盐山
    101090706=肃宁
    101090707=南皮
    101090708=吴桥
    101090709=献县
    101090710=孟村
    101090711=泊头
    101090712=任丘
    101090713=黄骅
    101090714=河间
    101090715=曹妃甸
    101090801=衡水
    101090802=枣强
    101090803=武邑
    101090804=武强
    101090805=饶阳
    101090806=安平
    101090807=故城
    101090808=景县
    101090809=阜城
    101090810=冀州
    101090811=深州
    101090901=邢台
    101090902=临城
    101090903=邢台县浆水
    101090904=内邱
    101090905=柏乡
    101090906=隆尧
    101090907=南和
    101090908=宁晋
    101090909=巨鹿
    101090910=新河
    101090911=广宗
    101090912=平乡
    101090913=威县
    101090914=清河
    101090915=临西
    101090916=南宫
    101090917=沙河
    101090918=任县
    101091001=邯郸
    101091002=峰峰
    101091003=临漳
    101091004=成安
    101091005=大名
    101091006=涉县
    101091007=磁县
    101091008=肥乡
    101091009=永年
    101091010=邱县
    101091011=鸡泽
    101091012=广平
    101091013=馆陶
    101091014=魏县
    101091015=曲周
    101091016=武安
    101091101=秦皇岛
    101091102=青龙
    101091103=昌黎
    101091104=抚宁
    101091105=卢龙
    101091106=北戴河
    
    
    101100101=太原
    101100102=清徐
    101100103=阳曲
    101100104=娄烦
    101100105=太原古交区
    101100106=太原北郊
    101100107=太原南郊
    101100201=大同
    101100202=阳高
    101100203=大同县
    101100204=天镇
    101100205=广灵
    101100206=灵邱
    101100207=浑源
    101100208=左云
    101100301=阳泉
    101100302=盂县
    101100303=平定
    101100401=晋中
    101100402=榆次
    101100403=榆社
    101100404=左权
    101100405=和顺
    101100406=昔阳
    101100407=寿阳
    101100408=太谷
    101100409=祁县
    101100410=平遥
    101100411=灵石
    101100412=介休
    101100501=长治
    101100502=黎城
    101100503=屯留
    101100504=潞城
    101100505=襄垣
    101100506=平顺
    101100507=武乡
    101100508=沁县
    101100509=长子
    101100510=沁源
    101100511=壶关
    101100601=晋城
    101100602=沁水
    101100603=阳城
    101100604=陵川
    101100605=高平
    101100701=临汾
    101100702=曲沃
    101100703=永和
    101100704=隰县
    101100705=大宁
    101100706=吉县
    101100707=襄汾
    101100708=蒲县
    101100709=汾西
    101100710=洪洞
    101100711=霍州
    101100712=乡宁
    101100713=翼城
    101100714=侯马
    101100715=浮山
    101100716=安泽
    101100717=古县
    101100801=运城
    101100802=临猗
    101100803=稷山
    101100804=万荣
    101100805=河津
    101100806=新绛
    101100807=绛县
    101100808=闻喜
    101100809=垣曲
    101100810=永济
    101100811=芮城
    101100812=夏县
    101100813=平陆
    101100901=朔州
    101100902=平鲁
    101100903=山阴
    101100904=右玉
    101100905=应县
    101100906=怀仁
    101101001=忻州
    101101002=定襄
    101101003=五台县豆村
    101101004=河曲
    101101005=偏关
    101101006=神池
    101101007=宁武
    101101008=代县
    101101009=繁峙
    101101010=五台山
    101101011=保德
    101101012=静乐
    101101013=岢岚
    101101014=五寨
    101101015=原平
    101101100=吕梁
    101101101=离石
    101101102=临县
    101101103=兴县
    101101104=岚县
    101101105=柳林
    101101106=石楼
    101101107=方山
    101101108=交口
    101101109=中阳
    101101110=孝义
    101101111=汾阳
    101101112=文水
    101101113=交城
    
    
    101110101=西安
    101110102=长安
    101110103=临潼
    101110104=蓝田
    101110105=周至
    101110106=户县
    101110107=高陵
    101110108=杨凌
    101110200=咸阳
    101110201=三原
    101110202=礼泉
    101110203=永寿
    101110204=淳化
    101110205=泾阳
    101110206=武功
    101110207=乾县
    101110208=彬县
    101110209=长武
    101110210=旬邑
    101110211=兴平
    101110300=延安
    101110301=延长
    101110302=延川
    101110303=子长
    101110304=宜川
    101110305=富县
    101110306=志丹
    101110307=安塞
    101110308=甘泉
    101110309=洛川
    101110310=黄陵
    101110311=黄龙
    101110312=吴起
    101110401=榆林
    101110402=府谷
    101110403=神木
    101110404=佳县
    101110405=定边
    101110406=靖边
    101110407=横山
    101110408=米脂
    101110409=子洲
    101110410=绥德
    101110411=吴堡
    101110412=清涧
    101110501=渭南
    101110502=华县
    101110503=潼关
    101110504=大荔
    101110505=白水
    101110506=富平
    101110507=蒲城
    101110508=澄城
    101110509=合阳
    101110510=韩城
    101110511=华阴
    101110512=华山
    101110601=商洛
    101110602=洛南
    101110603=柞水
    101110605=镇安
    101110606=丹凤
    101110607=商南
    101110608=山阳
    101110701=安康
    101110702=紫阳
    101110703=石泉
    101110704=汉阴
    101110705=旬阳
    101110706=岚皋
    101110707=平利
    101110708=白河
    101110709=镇坪
    101110710=宁陕
    101110801=汉中
    101110802=略阳
    101110803=勉县
    101110804=留坝
    101110805=洋县
    101110806=城固
    101110807=西乡
    101110808=佛坪
    101110809=宁强
    101110810=南郑
    101110811=镇巴
    101110901=宝鸡
    101110902=宝鸡县
    101110903=千阳
    101110904=麟游
    101110905=岐山
    101110906=凤翔
    101110907=扶风
    101110908=眉县
    101110909=太白
    101110910=凤县
    101110911=陇县
    101111001=铜川
    101111002=耀县
    101111003=宜君
    
    
    101120101=济南
    101120102=长清
    101120103=商河
    101120104=章丘
    101120105=平阴
    101120106=济阳
    101120201=青岛
    101120202=崂山
    101120203=潮连岛
    101120204=即墨
    101120205=胶州
    101120206=胶南
    101120207=莱西
    101120208=平度
    101120301=淄博
    101120302=淄川
    101120303=博山
    101120304=高青
    101120305=周村
    101120306=沂源
    101120307=桓台
    101120308=临淄
    101120401=德州
    101120402=武城
    101120403=临邑
    101120404=陵县
    101120405=齐河
    101120406=乐陵
    101120407=庆云
    101120408=平原
    101120409=宁津
    101120410=夏津
    101120411=禹城
    101120501=烟台
    101120502=莱州
    101120503=长岛
    101120504=蓬莱
    101120505=龙口
    101120506=招远
    101120507=栖霞
    101120508=福山
    101120509=牟平
    101120510=莱阳
    101120511=海阳
    101120512=千里岩
    101120601=潍坊
    101120602=青州
    101120603=寿光
    101120604=临朐
    101120605=昌乐
    101120606=昌邑
    101120607=安丘
    101120608=高密
    101120609=诸城
    101120701=济宁
    101120702=嘉祥
    101120703=微山
    101120704=鱼台
    101120705=兖州
    101120706=金乡
    101120707=汶上
    101120708=泗水
    101120709=梁山
    101120710=曲阜
    101120711=邹城
    101120801=泰安
    101120802=新泰
    101120803=泰山
    101120804=肥城
    101120805=东平
    101120806=宁阳
    101120901=临沂
    101120902=莒南
    101120903=沂南
    101120904=苍山
    101120905=临沭
    101120906=郯城
    101120907=蒙阴
    101120908=平邑
    101120909=费县
    101120910=沂水
    101120911=马站
    101121001=菏泽
    101121002=鄄城
    101121003=郓城
    101121004=东明
    101121005=定陶
    101121006=巨野
    101121007=曹县
    101121008=成武
    101121009=单县
    101121101=滨州
    101121102=博兴
    101121103=无棣
    101121104=阳信
    101121105=惠民
    101121106=沾化
    101121107=邹平
    101121201=东营
    101121202=河口
    101121203=垦利
    101121204=利津
    101121205=广饶
    101121301=威海
    101121302=文登
    101121303=荣成
    101121304=乳山
    101121305=成山头
    101121306=石岛
    101121401=枣庄
    101121402=薛城
    101121403=峄城
    101121404=台儿庄
    101121405=滕州
    101121501=日照
    101121502=五莲
    101121503=莒县
    101121601=莱芜
    101121701=聊城
    101121702=冠县
    101121703=阳谷
    101121704=高唐
    101121705=茌平
    101121706=东阿
    101121707=临清
    101121708=朝城
    101121709=莘县
    
    
    101130101=乌鲁木齐
    101130102=蔡家湖
    101130103=小渠子
    101130104=巴仑台
    101130105=达坂城
    101130106=十三间房气象站
    101130107=天山大西沟
    101130108=乌鲁木齐牧试站
    101130109=天池
    101130110=白杨沟
    101130201=克拉玛依
    101130301=石河子
    101130302=炮台
    101130303=莫索湾
    101130304=乌兰乌苏
    101130401=昌吉
    101130402=呼图壁
    101130403=米泉
    101130404=阜康
    101130405=吉木萨尔
    101130406=奇台
    101130407=玛纳斯
    101130408=木垒
    101130409=北塔山
    101130501=吐鲁番
    101130502=托克逊
    101130503=吐鲁番东坎
    101130504=鄯善
    101130505=红柳河
    101130601=库尔勒
    101130602=轮台
    101130603=尉犁
    101130604=若羌
    101130605=且末
    101130606=和静
    101130607=焉耆
    101130608=和硕
    101130609=库米什
    101130610=巴音布鲁克
    101130611=铁干里克
    101130612=博湖
    101130613=塔中
    101130701=阿拉尔
    101130801=阿克苏
    101130802=乌什
    101130803=温宿
    101130804=拜城
    101130805=新和
    101130806=沙雅
    101130807=库车
    101130808=柯坪
    101130809=阿瓦提
    101130901=喀什
    101130902=英吉沙
    101130903=塔什库尔干
    101130904=麦盖提
    101130905=莎车
    101130906=叶城
    101130907=泽普
    101130908=巴楚
    101130909=岳普湖
    101130910=伽师
    101131001=伊宁
    101131002=察布查尔
    101131003=尼勒克
    101131004=伊宁县
    101131005=巩留
    101131006=新源
    101131007=昭苏
    101131008=特克斯
    101131009=霍城
    101131010=霍尔果斯
    101131101=塔城
    101131102=裕民
    101131103=额敏
    101131104=和布克赛尔
    101131105=托里
    101131106=乌苏
    101131107=沙湾
    101131108=和丰
    101131201=哈密
    101131202=沁城
    101131203=巴里坤
    101131204=伊吾
    101131205=淖毛湖
    101131301=和田
    101131302=皮山
    101131303=策勒
    101131304=墨玉
    101131305=洛浦
    101131306=民丰
    101131307=于田
    101131401=阿勒泰
    101131402=哈巴河
    101131403=一八五团
    101131404=黑山头
    101131405=吉木乃
    101131406=布尔津
    101131407=福海
    101131408=富蕴
    101131409=青河
    101131410=安德河
    101131501=阿图什
    101131502=乌恰
    101131503=阿克陶
    101131504=阿合奇
    101131505=吐尔尕特
    101131601=博乐
    101131602=温泉
    101131603=精河
    101131606=阿拉山口
    
    
    101140101=拉萨
    101140102=当雄
    101140103=尼木
    101140104=墨竹贡卡
    101140201=日喀则
    101140202=拉孜
    101140203=南木林
    101140204=聂拉木
    101140205=定日
    101140206=江孜
    101140207=帕里
    101140301=山南
    101140302=贡嘎
    101140303=琼结
    101140304=加查
    101140305=浪卡子
    101140306=错那
    101140307=隆子
    101140308=泽当
    101140401=林芝
    101140402=波密
    101140403=米林
    101140404=察隅
    101140501=昌都
    101140502=丁青
    101140503=类乌齐
    101140504=洛隆
    101140505=左贡
    101140506=芒康
    101140507=八宿
    101140601=那曲
    101140603=嘉黎
    101140604=班戈
    101140605=安多
    101140606=索县
    101140607=比如
    101140701=阿里
    101140702=改则
    101140703=申扎
    101140704=狮泉河
    101140705=普兰
    
    
    101150101=西宁
    101150102=大通
    101150103=湟源
    101150104=湟中
    101150105=铁卜加
    101150106=铁卜加寺
    101150107=中心站
    101150201=海东
    101150202=乐都
    101150203=民和
    101150204=互助
    101150205=化隆
    101150206=循化
    101150207=冷湖
    101150208=平安
    101150301=黄南
    101150302=尖扎
    101150303=泽库
    101150304=河南
    101150401=海南
    101150402=江西沟
    101150404=贵德
    101150405=河卡
    101150406=兴海
    101150407=贵南
    101150408=同德
    101150409=共和
    101150501=果洛
    101150502=班玛
    101150503=甘德
    101150504=达日
    101150505=久治
    101150506=玛多
    101150507=清水河
    101150508=玛沁
    101150601=玉树
    101150602=托托河
    101150603=治多
    101150604=杂多
    101150605=囊谦
    101150606=曲麻莱
    101150701=海西
    101150702=格尔木
    101150703=察尔汉
    101150704=野牛沟
    101150705=五道梁
    101150706=小灶火
    101150708=天峻
    101150709=乌兰
    101150710=都兰
    101150711=诺木洪
    101150712=茫崖
    101150713=大柴旦
    101150714=茶卡
    101150715=香日德
    101150716=德令哈
    101150801=海北
    101150802=门源
    101150803=祁连
    101150804=海晏
    101150805=托勒
    101150806=刚察
    
    
    101160101=兰州
    101160102=皋兰
    101160103=永登
    101160104=榆中
    101160201=定西
    101160202=通渭
    101160203=陇西
    101160204=渭源
    101160205=临洮
    101160206=漳县
    101160207=岷县
    101160208=安定
    101160301=平凉
    101160302=泾川
    101160303=灵台
    101160304=崇信
    101160305=华亭
    101160306=庄浪
    101160307=静宁
    101160308=崆峒
    101160401=庆阳
    101160402=西峰
    101160403=环县
    101160404=华池
    101160405=合水
    101160406=正宁
    101160407=宁县
    101160408=镇原
    101160409=庆城
    101160501=武威
    101160502=民勤
    101160503=古浪
    101160504=乌鞘岭
    101160505=天祝
    101160601=金昌
    101160602=永昌
    101160701=张掖
    101160702=肃南
    101160703=民乐
    101160704=临泽
    101160705=高台
    101160706=山丹
    101160801=酒泉
    101160802=鼎新
    101160803=金塔
    101160804=马鬃山
    101160805=瓜州
    101160806=肃北
    101160807=玉门镇
    101160808=敦煌
    101160901=天水
    101160902=北道区
    101160903=清水
    101160904=秦安
    101160905=甘谷
    101160906=武山
    101160907=张家川
    101160908=麦积
    101161001=武都
    101161002=成县
    101161003=文县
    101161004=宕昌
    101161005=康县
    101161006=西和
    101161007=礼县
    101161008=徽县
    101161009=两当
    101161101=临夏
    101161102=康乐
    101161103=永靖
    101161104=广河
    101161105=和政
    101161106=东乡
    101161201=合作
    101161202=临潭
    101161203=卓尼
    101161204=舟曲
    101161205=迭部
    101161206=玛曲
    101161207=碌曲
    101161208=夏河
    101161301=白银
    101161302=靖远
    101161303=会宁
    101161304=华家岭
    101161305=景泰
    
    
    101170101=银川
    101170102=永宁
    101170103=灵武
    101170104=贺兰
    101170201=石嘴山
    101170202=惠农
    101170203=平罗
    101170204=陶乐
    101170205=石炭井
    101170206=大武口
    101170301=吴忠
    101170302=同心
    101170303=盐池
    101170304=韦州
    101170305=麻黄山
    101170306=青铜峡
    101170401=固原
    101170402=西吉
    101170403=隆德
    101170404=泾源
    101170405=六盘山
    101170406=彭阳
    101170501=中卫
    101170502=中宁
    101170503=兴仁堡
    101170504=海原
    
    
    101180101=郑州
    101180102=巩义
    101180103=荥阳
    101180104=登封
    101180105=新密
    101180106=新郑
    101180107=中牟
    101180108=郑州农试站
    101180201=安阳
    101180202=汤阴
    101180203=滑县
    101180204=内黄
    101180205=林州
    101180301=新乡
    101180302=获嘉
    101180303=原阳
    101180304=辉县
    101180305=卫辉
    101180306=延津
    101180307=封丘
    101180308=长垣
    101180401=许昌
    101180402=鄢陵
    101180403=襄城
    101180404=长葛
    101180405=禹州
    101180501=平顶山
    101180502=郏县
    101180503=宝丰
    101180504=汝州
    101180505=叶县
    101180506=舞钢
    101180507=鲁山
    101180601=信阳
    101180602=息县
    101180603=罗山
    101180604=光山
    101180605=新县
    101180606=淮滨
    101180607=潢川
    101180608=固始
    101180609=商城
    101180610=鸡公山
    101180611=信阳地区农试站
    101180701=南阳
    101180702=南召
    101180703=方城
    101180704=社旗
    101180705=西峡
    101180706=内乡
    101180707=镇平
    101180708=淅川
    101180709=新野
    101180710=唐河
    101180711=邓州
    101180712=桐柏
    101180801=开封
    101180802=杞县
    101180803=尉氏
    101180804=通许
    101180805=兰考
    101180901=洛阳
    101180902=新安
    101180903=孟津
    101180904=宜阳
    101180905=洛宁
    101180906=伊川
    101180907=嵩县
    101180908=偃师
    101180909=栾川
    101180910=汝阳
    101181001=商丘
    101181002=睢阳区
    101181003=睢县
    101181004=民权
    101181005=虞城
    101181006=柘城
    101181007=宁陵
    101181008=夏邑
    101181009=永城
    101181101=焦作
    101181102=修武
    101181103=武陟
    101181104=沁阳
    101181106=博爱
    101181107=温县
    101181108=孟州
    101181201=鹤壁
    101181202=浚县
    101181203=淇县
    101181301=濮阳
    101181302=台前
    101181303=南乐
    101181304=清丰
    101181305=范县
    101181401=周口
    101181402=扶沟
    101181403=太康
    101181404=淮阳
    101181405=西华
    101181406=商水
    101181407=项城
    101181408=郸城
    101181409=鹿邑
    101181410=沈丘
    101181411=黄泛区
    101181501=漯河
    101181502=临颍
    101181503=舞阳
    101181601=驻马店
    101181602=西平
    101181603=遂平
    101181604=上蔡
    101181605=汝南
    101181606=泌阳
    101181607=平舆
    101181608=新蔡
    101181609=确山
    101181610=正阳
    101181701=三门峡
    101181702=灵宝
    101181703=渑池
    101181704=卢氏
    101181801=济源
    
    
    101190101=南京
    101190102=溧水
    101190103=高淳
    101190104=江宁
    101190105=六合
    101190106=江浦
    101190107=浦口
    101190201=无锡
    101190202=江阴
    101190203=宜兴
    101190301=镇江
    101190302=丹阳
    101190303=扬中
    101190304=句容
    101190305=丹徒
    101190401=苏州
    101190402=常熟
    101190403=张家港
    101190404=昆山
    101190405=吴县东山
    101190406=吴县
    101190407=吴江
    101190408=太仓
    101190501=南通
    101190502=海安
    101190503=如皋
    101190504=如东
    101190505=吕泗
    101190506=吕泗渔场
    101190507=启东
    101190508=海门
    101190509=通州
    101190601=扬州
    101190602=宝应
    101190603=仪征
    101190604=高邮
    101190605=江都
    101190606=邗江
    101190701=盐城
    101190702=响水
    101190703=滨海
    101190704=阜宁
    101190705=射阳
    101190706=建湖
    101190707=东台
    101190708=大丰
    101190709=盐都
    101190801=徐州
    101190802=徐州农试站
    101190803=丰县
    101190804=沛县
    101190805=邳州
    101190806=睢宁
    101190807=新沂
    101190901=淮安
    101190902=金湖
    101190903=盱眙
    101190904=洪泽
    101190905=涟水
    101190906=淮阴县
    101190907=淮阴
    101190908=楚州
    101191001=连云港
    101191002=东海
    101191003=赣榆
    101191004=灌云
    101191005=灌南
    101191006=西连岛
    101191007=燕尾港
    101191101=常州
    101191102=溧阳
    101191103=金坛
    101191201=泰州
    101191202=兴化
    101191203=泰兴
    101191204=姜堰
    101191205=靖江
    101191301=宿迁
    101191302=沭阳
    101191303=泗阳
    101191304=泗洪
    
    
    101200101=武汉
    101200102=蔡甸
    101200103=黄陂
    101200104=新洲
    101200105=江夏
    101200201=襄樊
    101200202=襄阳
    101200203=保康
    101200204=南漳
    101200205=宜城
    101200206=老河口
    101200207=谷城
    101200208=枣阳
    101200301=鄂州
    101200401=孝感
    101200402=安陆
    101200403=云梦
    101200404=大悟
    101200405=应城
    101200406=汉川
    101200501=黄冈
    101200502=红安
    101200503=麻城
    101200504=罗田
    101200505=英山
    101200506=浠水
    101200507=蕲春
    101200508=黄梅
    101200509=武穴
    101200601=黄石
    101200602=大冶
    101200603=阳新
    101200701=咸宁
    101200702=赤壁
    101200703=嘉鱼
    101200704=崇阳
    101200705=通城
    101200706=通山
    101200801=荆州
    101200802=江陵
    101200803=公安
    101200804=石首
    101200805=监利
    101200806=洪湖
    101200807=松滋
    101200901=宜昌
    101200902=远安
    101200903=秭归
    101200904=兴山
    101200905=宜昌县
    101200906=五峰
    101200907=当阳
    101200908=长阳
    101200909=宜都
    101200910=枝江
    101200911=三峡
    101200912=夷陵
    101201001=恩施
    101201002=利川
    101201003=建始
    101201004=咸丰
    101201005=宣恩
    101201006=鹤峰
    101201007=来凤
    101201008=巴东
    101201009=绿葱坡
    101201101=十堰
    101201102=竹溪
    101201103=郧西
    101201104=郧县
    101201105=竹山
    101201106=房县
    101201107=丹江口
    101201201=神农架
    101201301=随州
    101201302=广水
    101201401=荆门
    101201402=钟祥
    101201403=京山
    101201501=天门
    101201601=仙桃
    101201701=潜江
    
    
    101210101=杭州
    101210102=萧山
    101210103=桐庐
    101210104=淳安
    101210105=建德
    101210106=余杭
    101210107=临安
    101210108=富阳
    101210201=湖州
    101210202=长兴
    101210203=安吉
    101210204=德清
    101210301=嘉兴
    101210302=嘉善
    101210303=海宁
    101210304=桐乡
    101210305=平湖
    101210306=海盐
    101210401=宁波
    101210403=慈溪
    101210404=余姚
    101210405=奉化
    101210406=象山
    101210407=石浦
    101210408=宁海
    101210409=鄞县
    101210410=北仑
    101210411=鄞州
    101210412=镇海
    101210501=绍兴
    101210502=诸暨
    101210503=上虞
    101210504=新昌
    101210505=嵊州
    101210601=台州
    101210602=括苍山
    101210603=玉环
    101210604=三门
    101210605=天台
    101210606=仙居
    101210607=温岭
    101210608=大陈
    101210609=洪家
    101210701=温州
    101210702=泰顺
    101210703=文成
    101210704=平阳
    101210705=瑞安
    101210706=洞头
    101210707=乐清
    101210708=永嘉
    101210709=苍南
    101210801=丽水
    101210802=遂昌
    101210803=龙泉
    101210804=缙云
    101210805=青田
    101210806=云和
    101210807=庆元
    101210901=金华
    101210902=浦江
    101210903=兰溪
    101210904=义乌
    101210905=东阳
    101210906=武义
    101210907=永康
    101210908=磐安
    101211001=衢州
    101211002=常山
    101211003=开化
    101211004=龙游
    101211005=江山
    101211101=舟山
    101211102=嵊泗
    101211103=嵊山
    101211104=岱山
    101211105=普陀
    101211106=定海
    
    
    101220101=合肥
    101220102=长丰
    101220103=肥东
    101220104=肥西
    101220201=蚌埠
    101220202=怀远
    101220203=固镇
    101220204=五河
    101220301=芜湖
    101220302=繁昌
    101220303=芜湖县
    101220304=南陵
    101220401=淮南
    101220402=凤台
    101220501=马鞍山
    101220502=当涂
    101220601=安庆
    101220602=枞阳
    101220603=太湖
    101220604=潜山
    101220605=怀宁
    101220606=宿松
    101220607=望江
    101220608=岳西
    101220609=桐城
    101220701=宿州
    101220702=砀山
    101220703=灵璧
    101220704=泗县
    101220705=萧县
    101220801=阜阳
    101220802=阜南
    101220803=颍上
    101220804=临泉
    101220805=界首
    101220806=太和
    101220901=亳州
    101220902=涡阳
    101220903=利辛
    101220904=蒙城
    101221001=黄山站
    101221002=黄山区
    101221003=屯溪
    101221004=祁门
    101221005=黟县
    101221006=歙县
    101221007=休宁
    101221008=黄山市
    101221101=滁州
    101221102=凤阳
    101221103=明光
    101221104=定远
    101221105=全椒
    101221106=来安
    101221107=天长
    101221201=淮北
    101221202=濉溪
    101221301=铜陵
    101221401=宣城
    101221402=泾县
    101221403=旌德
    101221404=宁国
    101221405=绩溪
    101221406=广德
    101221407=郎溪
    101221501=六安
    101221502=霍邱
    101221503=寿县
    101221504=南溪
    101221505=金寨
    101221506=霍山
    101221507=舒城
    101221601=巢湖
    101221602=庐江
    101221603=无为
    101221604=含山
    101221605=和县
    101221701=池州
    101221702=东至
    101221703=青阳
    101221704=九华山
    101221705=石台
    
    
    101230101=福州
    101230102=闽清
    101230103=闽侯
    101230104=罗源
    101230105=连江
    101230106=马祖
    101230107=永泰
    101230108=平潭
    101230109=福州郊区
    101230110=长乐
    101230111=福清
    101230112=平潭海峡大桥
    101230201=厦门
    101230202=同安
    101230301=宁德
    101230302=古田
    101230303=霞浦
    101230304=寿宁
    101230305=周宁
    101230306=福安
    101230307=柘荣
    101230308=福鼎
    101230309=屏南
    101230401=莆田
    101230402=仙游
    101230403=秀屿港
    101230501=泉州
    101230502=安溪
    101230503=九仙山
    101230504=永春
    101230505=德化
    101230506=南安
    101230507=崇武
    101230508=金山
    101230509=晋江
    101230601=漳州
    101230602=长泰
    101230603=南靖
    101230604=平和
    101230605=龙海
    101230606=漳浦
    101230607=诏安
    101230608=东山
    101230609=云霄
    101230610=华安
    101230701=龙岩
    101230702=长汀
    101230703=连城
    101230704=武平
    101230705=上杭
    101230706=永定
    101230707=漳平
    101230801=三明
    101230802=宁化
    101230803=清流
    101230804=泰宁
    101230805=将乐
    101230806=建宁
    101230807=明溪
    101230808=沙县
    101230809=尤溪
    101230810=永安
    101230811=大田
    101230901=南平
    101230902=顺昌
    101230903=光泽
    101230904=邵武
    101230905=武夷山
    101230906=浦城
    101230907=建阳
    101230908=松溪
    101230909=政和
    101230910=建瓯
    
    
    101240101=南昌
    101240102=新建
    101240103=南昌县
    101240104=安义
    101240105=进贤
    101240106=莲塘
    101240201=九江
    101240202=瑞昌
    101240203=庐山
    101240204=武宁
    101240205=德安
    101240206=永修
    101240207=湖口
    101240208=彭泽
    101240209=星子
    101240210=都昌
    101240211=棠荫
    101240212=修水
    101240301=上饶
    101240302=鄱阳
    101240303=婺源
    101240304=康山
    101240305=余干
    101240306=万年
    101240307=德兴
    101240308=上饶县
    101240309=弋阳
    101240310=横峰
    101240311=铅山
    101240312=玉山
    101240313=广丰
    101240314=波阳
    101240401=抚州
    101240402=广昌
    101240403=乐安
    101240404=崇仁
    101240405=金溪
    101240406=资溪
    101240407=宜黄
    101240408=南城
    101240409=南丰
    101240410=黎川
    101240411=东乡
    101240501=宜春
    101240502=铜鼓
    101240503=宜丰
    101240504=万载
    101240505=上高
    101240506=靖安
    101240507=奉新
    101240508=高安
    101240509=樟树
    101240510=丰城
    101240601=吉安
    101240602=吉安县
    101240603=吉水
    101240604=新干
    101240605=峡江
    101240606=永丰
    101240607=永新
    101240608=井冈山
    101240609=万安
    101240610=遂川
    101240611=泰和
    101240612=安福
    101240613=宁冈
    101240701=赣州
    101240702=崇义
    101240703=上犹
    101240704=南康
    101240705=大余
    101240706=信丰
    101240707=宁都
    101240708=石城
    101240709=瑞金
    101240710=于都
    101240711=会昌
    101240712=安远
    101240713=全南
    101240714=龙南
    101240715=定南
    101240716=寻乌
    101240717=兴国
    101240801=景德镇
    101240802=乐平
    101240901=萍乡
    101240902=莲花
    101241001=新余
    101241002=分宜
    101241101=鹰潭
    101241102=余江
    101241103=贵溪
    
    
    101250101=长沙
    101250102=宁乡
    101250103=浏阳
    101250104=马坡岭
    101250201=湘潭
    101250202=韶山
    101250203=湘乡
    101250301=株洲
    101250302=攸县
    101250303=醴陵
    101250304=株洲县
    101250305=茶陵
    101250306=炎陵
    101250401=衡阳
    101250402=衡山
    101250403=衡东
    101250404=祁东
    101250405=衡阳县
    101250406=常宁
    101250407=衡南
    101250408=耒阳
    101250409=南岳
    101250501=郴州
    101250502=桂阳
    101250503=嘉禾
    101250504=宜章
    101250505=临武
    101250506=桥口
    101250507=资兴
    101250508=汝城
    101250509=安仁
    101250510=永兴
    101250511=桂东
    101250601=常德
    101250602=安乡
    101250603=桃源
    101250604=汉寿
    101250605=澧县
    101250606=临澧
    101250607=石门
    101250700=益阳
    101250701=赫山区
    101250702=南县
    101250703=桃江
    101250704=安化
    101250705=沅江
    101250801=娄底
    101250802=双峰
    101250803=冷水江
    101250804=冷水滩
    101250805=新化
    101250806=涟源
    101250901=邵阳
    101250902=隆回
    101250903=洞口
    101250904=新邵
    101250905=邵东
    101250906=绥宁
    101250907=新宁
    101250908=武冈
    101250909=城步
    101250910=邵阳县
    101251001=岳阳
    101251002=华容
    101251003=湘阴
    101251004=汨罗
    101251005=平江
    101251006=临湘
    101251101=张家界
    101251102=桑植
    101251103=慈利
    101251201=怀化
    101251202=鹤城区
    101251203=沅陵
    101251204=辰溪
    101251205=靖州
    101251206=会同
    101251207=通道
    101251208=麻阳
    101251209=新晃
    101251210=芷江
    101251211=溆浦
    101251301=黔阳
    101251302=洪江
    101251401=永州
    101251402=祁阳
    101251403=东安
    101251404=双牌
    101251405=道县
    101251406=宁远
    101251407=江永
    101251408=蓝山
    101251409=新田
    101251410=江华
    101251501=吉首
    101251502=保靖
    101251503=永顺
    101251504=古丈
    101251505=凤凰
    101251506=泸溪
    101251507=龙山
    101251508=花垣
    
    
    101260101=贵阳
    101260102=白云
    101260103=花溪
    101260104=乌当
    101260105=息烽
    101260106=开阳
    101260107=修文
    101260108=清镇
    101260201=遵义
    101260202=遵义县
    101260203=仁怀
    101260204=绥阳
    101260205=湄潭
    101260206=凤冈
    101260207=桐梓
    101260208=赤水
    101260209=习水
    101260210=道真
    101260211=正安
    101260212=务川
    101260213=余庆
    101260214=汇川
    101260301=安顺
    101260302=普定
    101260303=镇宁
    101260304=平坝
    101260305=紫云
    101260306=关岭
    101260401=都匀
    101260402=贵定
    101260403=瓮安
    101260404=长顺
    101260405=福泉
    101260406=惠水
    101260407=龙里
    101260408=罗甸
    101260409=平塘
    101260410=独山
    101260411=三都
    101260412=荔波
    101260501=凯里
    101260502=岑巩
    101260503=施秉
    101260504=镇远
    101260505=黄平
    101260506=黄平旧洲
    101260507=麻江
    101260508=丹寨
    101260509=三穗
    101260510=台江
    101260511=剑河
    101260512=雷山
    101260513=黎平
    101260514=天柱
    101260515=锦屏
    101260516=榕江
    101260517=从江
    101260518=炉山
    101260601=铜仁
    101260602=江口
    101260603=玉屏
    101260604=万山
    101260605=思南
    101260606=塘头
    101260607=印江
    101260608=石阡
    101260609=沿河
    101260610=德江
    101260611=松桃
    101260701=毕节
    101260702=赫章
    101260703=金沙
    101260704=威宁
    101260705=大方
    101260706=纳雍
    101260707=织金
    101260801=六盘水
    101260802=六枝
    101260803=水城
    101260804=盘县
    101260901=黔西
    101260902=晴隆
    101260903=兴仁
    101260904=贞丰
    101260905=望谟
    101260906=兴义
    101260907=安龙
    101260908=册亨
    101260909=普安
    
    
    101270101=成都
    101270102=龙泉驿
    101270103=新都
    101270104=温江
    101270105=金堂
    101270106=双流
    101270107=郫县
    101270108=大邑
    101270109=蒲江
    101270110=新津
    101270111=都江堰
    101270112=彭州
    101270113=邛崃
    101270114=崇州
    101270115=崇庆
    101270116=彭县
    101270201=攀枝花
    101270202=仁和
    101270203=米易
    101270204=盐边
    101270301=自贡
    101270302=富顺
    101270303=荣县
    101270401=绵阳
    101270402=三台
    101270403=盐亭
    101270404=安县
    101270405=梓潼
    101270406=北川
    101270407=平武
    101270408=江油
    101270501=南充
    101270502=南部
    101270503=营山
    101270504=蓬安
    101270505=仪陇
    101270506=西充
    101270507=阆中
    101270601=达州
    101270602=宣汉
    101270603=开江
    101270604=大竹
    101270605=渠县
    101270606=万源
    101270607=达川
    101270701=遂宁
    101270702=蓬溪
    101270703=射洪
    101270801=广安
    101270802=岳池
    101270803=武胜
    101270804=邻水
    101270805=华蓥山
    101270901=巴中
    101270902=通江
    101270903=南江
    101270904=平昌
    101271001=泸州
    101271003=泸县
    101271004=合江
    101271005=叙永
    101271006=古蔺
    101271007=纳溪
    101271101=宜宾
    101271102=宜宾农试站
    101271103=宜宾县
    101271104=南溪
    101271105=江安
    101271106=长宁
    101271107=高县
    101271108=珙县
    101271109=筠连
    101271110=兴文
    101271111=屏山
    101271201=内江
    101271202=东兴
    101271203=威远
    101271204=资中
    101271205=隆昌
    101271301=资阳
    101271302=安岳
    101271303=乐至
    101271304=简阳
    101271401=乐山
    101271402=犍为
    101271403=井研
    101271404=夹江
    101271405=沐川
    101271406=峨边
    101271407=马边
    101271408=峨眉
    101271409=峨眉山
    101271501=眉山
    101271502=仁寿
    101271503=彭山
    101271504=洪雅
    101271505=丹棱
    101271506=青神
    101271601=凉山
    101271603=木里
    101271604=盐源
    101271605=德昌
    101271606=会理
    101271607=会东
    101271608=宁南
    101271609=普格
    101271610=西昌
    101271611=金阳
    101271612=昭觉
    101271613=喜德
    101271614=冕宁
    101271615=越西
    101271616=甘洛
    101271617=雷波
    101271618=美姑
    101271619=布拖
    101271701=雅安
    101271702=名山
    101271703=荣经
    101271704=汉源
    101271705=石棉
    101271706=天全
    101271707=芦山
    101271708=宝兴
    101271801=甘孜
    101271802=康定
    101271803=泸定
    101271804=丹巴
    101271805=九龙
    101271806=雅江
    101271807=道孚
    101271808=炉霍
    101271809=新龙
    101271810=德格
    101271811=白玉
    101271812=石渠
    101271813=色达
    101271814=理塘
    101271815=巴塘
    101271816=乡城
    101271817=稻城
    101271818=得荣
    101271901=阿坝
    101271902=汶川
    101271903=理县
    101271904=茂县
    101271905=松潘
    101271906=九寨沟
    101271907=金川
    101271908=小金
    101271909=黑水
    101271910=马尔康
    101271911=壤塘
    101271912=若尔盖
    101271913=红原
    101271914=南坪
    101272001=德阳
    101272002=中江
    101272003=广汉
    101272004=什邡
    101272005=绵竹
    101272006=罗江
    101272101=广元
    101272102=旺苍
    101272103=青川
    101272104=剑阁
    101272105=苍溪
    
    
    101280101=广州
    101280102=番禺
    101280103=从化
    101280104=增城
    101280105=花都
    101280106=天河
    101280201=韶关
    101280202=乳源
    101280203=始兴
    101280204=翁源
    101280205=乐昌
    101280206=仁化
    101280207=南雄
    101280208=新丰
    101280209=曲江
    101280301=惠州
    101280302=博罗
    101280303=惠阳
    101280304=惠东
    101280305=龙门
    101280401=梅州
    101280402=兴宁
    101280403=蕉岭
    101280404=大埔
    101280406=丰顺
    101280407=平远
    101280408=五华
    101280409=梅县
    101280501=汕头
    101280502=潮阳
    101280503=澄海
    101280504=南澳
    101280505=云澳
    101280506=南澎岛
    101280601=深圳
    101280701=珠海
    101280702=斗门
    101280703=黄茅洲
    101280800=佛山
    101280801=顺德
    101280802=三水
    101280803=南海
    101280901=肇庆
    101280902=广宁
    101280903=四会
    101280905=德庆
    101280906=怀集
    101280907=封开
    101280908=高要
    101281001=湛江
    101281002=吴川
    101281003=雷州
    101281004=徐闻
    101281005=廉江
    101281006=硇洲
    101281007=遂溪
    101281101=江门
    101281103=开平
    101281104=新会
    101281105=恩平
    101281106=台山
    101281107=上川岛
    101281108=鹤山
    101281201=河源
    101281202=紫金
    101281203=连平
    101281204=和平
    101281205=龙川
    101281301=清远
    101281302=连南
    101281303=连州
    101281304=连山
    101281305=阳山
    101281306=佛冈
    101281307=英德
    101281401=云浮
    101281402=罗定
    101281403=新兴
    101281404=郁南
    101281501=潮州
    101281502=饶平
    101281601=东莞
    101281701=中山
    101281801=阳江
    101281802=阳春
    101281901=揭阳
    101281902=揭西
    101281903=普宁
    101281904=惠来
    101282001=茂名
    101282002=高州
    101282003=化州
    101282004=电白
    101282005=信宜
    101282101=汕尾
    101282102=海丰
    101282103=陆丰
    101282104=遮浪
    101282105=东沙岛
    
    
    101290101=昆明
    101290102=昆明农试站
    101290103=东川
    101290104=寻甸
    101290105=晋宁
    101290106=宜良
    101290107=石林
    101290108=呈贡
    101290109=富民
    101290110=嵩明
    101290111=禄劝
    101290112=安宁
    101290113=太华山
    101290114=河口
    101290201=大理
    101290202=云龙
    101290203=漾鼻
    101290204=永平
    101290205=宾川
    101290206=弥渡
    101290207=祥云
    101290208=魏山
    101290209=剑川
    101290210=洱源
    101290211=鹤庆
    101290212=南涧
    101290301=红河
    101290302=石屏
    101290303=建水
    101290304=弥勒
    101290305=元阳
    101290306=绿春
    101290307=开远
    101290308=个旧
    101290309=蒙自
    101290310=屏边
    101290311=泸西
    101290312=金平
    101290401=曲靖
    101290402=沾益
    101290403=陆良
    101290404=富源
    101290405=马龙
    101290406=师宗
    101290407=罗平
    101290408=会泽
    101290409=宣威
    101290501=保山
    101290502=富宁
    101290503=龙陵
    101290504=施甸
    101290505=昌宁
    101290506=腾冲
    101290601=文山
    101290602=西畴
    101290603=马关
    101290604=麻栗坡
    101290605=砚山
    101290606=邱北
    101290607=广南
    101290701=玉溪
    101290702=澄江
    101290703=江川
    101290704=通海
    101290705=华宁
    101290706=新平
    101290707=易门
    101290708=峨山
    101290709=元江
    101290801=楚雄
    101290802=大姚
    101290803=元谋
    101290804=姚安
    101290805=牟定
    101290806=南华
    101290807=武定
    101290808=禄丰
    101290809=双柏
    101290810=永仁
    101290901=普洱
    101290902=景谷
    101290903=景东
    101290904=澜沧
    101290905=普洱
    101290906=墨江
    101290907=江城
    101290908=孟连
    101290909=西盟
    101290910=镇源
    101290911=镇沅
    101290912=宁洱
    101291001=昭通
    101291002=鲁甸
    101291003=彝良
    101291004=镇雄
    101291005=威信
    101291006=巧家
    101291007=绥江
    101291008=永善
    101291009=盐津
    101291010=大关
    101291101=临沧
    101291102=沧源
    101291103=耿马
    101291104=双江
    101291105=凤庆
    101291106=永德
    101291107=云县
    101291108=镇康
    101291201=怒江
    101291203=福贡
    101291204=兰坪
    101291205=泸水
    101291206=六库
    101291207=贡山
    101291301=香格里拉
    101291302=德钦
    101291303=维西
    101291304=中甸
    101291401=丽江
    101291402=永胜
    101291403=华坪
    101291404=宁蒗
    101291501=德宏
    101291502=潞江坝
    101291503=陇川
    101291504=盈江
    101291505=畹町镇
    101291506=瑞丽
    101291507=梁河
    101291508=潞西
    101291601=景洪
    101291602=大勐龙
    101291603=勐海
    101291604=景洪电站
    101291605=勐腊
    
    
    101300101=南宁
    101300102=南宁城区
    101300103=邕宁
    101300104=横县
    101300105=隆安
    101300106=马山
    101300107=上林
    101300108=武鸣
    101300109=宾阳
    101300110=硕龙
    101300201=崇左
    101300202=天等
    101300203=龙州
    101300204=凭祥
    101300205=大新
    101300206=扶绥
    101300207=宁明
    101300208=海渊
    101300301=柳州
    101300302=柳城
    101300303=沙塘
    101300304=鹿寨
    101300305=柳江
    101300306=融安
    101300307=融水
    101300308=三江
    101300401=来宾
    101300402=忻城
    101300403=金秀
    101300404=象州
    101300405=武宣
    101300501=桂林
    101300502=桂林农试站
    101300503=龙胜
    101300504=永福
    101300505=临桂
    101300506=兴安
    101300507=灵川
    101300508=全州
    101300509=灌阳
    101300510=阳朔
    101300511=恭城
    101300512=平乐
    101300513=荔浦
    101300514=资源
    101300601=梧州
    101300602=藤县
    101300603=太平
    101300604=苍梧
    101300605=蒙山
    101300606=岑溪
    101300701=贺州
    101300702=昭平
    101300703=富川
    101300704=钟山
    101300705=信都
    101300801=贵港
    101300802=桂平
    101300803=平南
    101300901=玉林
    101300902=博白
    101300903=北流
    101300904=容县
    101300905=陆川
    101301001=百色
    101301002=那坡
    101301003=田阳
    101301004=德保
    101301005=靖西
    101301006=田东
    101301007=平果
    101301008=隆林
    101301009=西林
    101301010=乐业
    101301011=凌云
    101301012=田林
    101301101=钦州
    101301102=浦北
    101301103=灵山
    101301201=河池
    101301202=天峨
    101301203=东兰
    101301204=巴马
    101301205=环江
    101301206=罗城
    101301207=宜州
    101301208=凤山
    101301209=南丹
    101301210=都安
    101301301=北海
    101301302=合浦
    101301303=涠洲岛
    101301401=防城港
    101301402=上思
    101301403=东兴
    101301404=板栏
    101301405=防城
    
    
    101310101=海口
    101310102=琼山
    101310201=三亚
    101310202=东方
    101310203=临高
    101310204=澄迈
    101310205=儋州
    101310206=昌江
    101310207=白沙
    101310208=琼中
    101310209=定安
    101310210=屯昌
    101310211=琼海
    101310212=文昌
    101310213=清兰
    101310214=保亭
    101310215=万宁
    101310216=陵水
    101310217=西沙
    101310218=珊瑚岛
    101310219=永署礁
    101310220=南沙岛
    101310221=乐东
    101310222=五指山
    101310223=通什
    
    
    101320101=香港
    101320102=九龙
    101320103=新界
    101320104=中环
    101320105=铜锣湾
    
    
    101330101=澳门
    
    
    101340101=台北县
    101340102=台北市
    101340201=高雄
    101340202=东港
    101340203=大武
    101340204=恒春
    101340205=兰屿
    101340301=台南
    101340401=台中
    101340501=桃园
    101340601=新竹县
    101340602=新竹市
    101340603=公馆
    101340701=宜兰
    101340801=马公
    101340802=东吉屿
    101340901=嘉义
    101340902=阿里山
    101340903=玉山
    101340904=新港
    View Code

    二、代码部分

    界面如图

    布局文件:

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:weightSum="1">
        <LinearLayout 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content">
            <EditText android:id="@+id/txCity"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"/>
            <Button android:id="@+id/btnSearch"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="查询" android:layout_weight="0.23"/>
        </LinearLayout>
        <TableLayout android:layout_width="fill_parent" 
               android:layout_height="fill_parent" 
            android:id="@+id/table"
            android:stretchColumns="1,2,3,4">
               
        </TableLayout>
       
    </LinearLayout>
    复制代码
    View Code

    把上述的全国编码文件放在工程的src目录下,文件后缀改成.properties.

    我们知道如果,已经Key,是非常容易获得对应的value。但现在的问题是只知道value,如果获取key呢。(根本不用花这个时间的本来囧!)

    复制代码
    /**
     * 配置文件读取工具类
     * 
     * */
    public class PropertiesUtil {
    
        private static Properties properties;
        private static PropertiesUtil propertiesUtil = new PropertiesUtil();
        private List<String> keyList = new ArrayList<String>();
    
        static InputStream in = PropertiesUtil.class.getClassLoader()
                .getResourceAsStream("weather.properties");
    
        private PropertiesUtil() {
        }
    
        public static PropertiesUtil getInstance() {
    
            if (null != propertiesUtil) {
                propertiesUtil = new PropertiesUtil();
                properties = new Properties();
                Reader reader = null;
                try {
                    reader = new BufferedReader(new InputStreamReader(in, "GBK"));
                } catch (UnsupportedEncodingException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    properties.load(reader);
    
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return propertiesUtil;
        }
    
        public String getValue(String key) {
            return properties.getProperty(key);
        }
        // 通过value 获取Key
        public String getKey(String value) {
            String val = "";
            Set<Object> keys = properties.keySet();
            for (Object key : keys) {
                val = getValue(key.toString());
                if (val.equals(value)) {
                    val = key.toString();
                    break;
                }
            }
            return val;
    
        }
    
    }
    复制代码

    核心类

    复制代码
    private EditText txCity;
        private Button btnSearch;
        private Dialog progressDialog;
    
        private String cityName;//城市名称
        private String cityCode;//城市编码
        private int day = 0;// 当天
    @Override
        public void onCreate(Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            txCity = (EditText) findViewById(R.id.txCity);
            btnSearch = (Button) findViewById(R.id.btnSearch);
            progressDialog = new AlertDialog.Builder(this).setTitle("数据读取中")
                    .setMessage("正在读取数据").create();
    
    final Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    // super.handleMessage(msg);
                    if (msg.what == 1) {
                        layoutTable();
                        progressDialog.hide();
                    }
                }
            };
        btnSearch.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    progressDialog.show();
                    // new Thread(runnable).start();
                    new Thread(new Runnable() {
    
                        @Override
                        public void run() {
                            Message message = new Message();
                            /*
                             * message.setTarget(handler); message.sendToTarget();
                             */
                            cityName = txCity.getText().toString();
                            // Toast.makeText(WeatherActivity.this, cityName,
                            // 1).show();
                            checkCityName();//非空判断
                            //converCityCode();//城市编码转换
                            weather = getXml();//获取城市对象实体类
                            Bundle Bundle = new Bundle();
                            Bundle.putBoolean("1", false);
                            message.setData(Bundle);
                            message.what = 1;
                            handler.sendMessageDelayed(message, 200);
                        }
                    }).start();
                }
            });
    
    
    }
    
    
    
        private void layoutTable() {
            TableLayout table = (TableLayout) findViewById(R.id.table);
            table.removeAllViews();
            TableRow row = new TableRow(this);
            row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                    LayoutParams.WRAP_CONTENT));
            row.setGravity(Gravity.CENTER_VERTICAL);
    
            TextView day = new TextView(this);
            day.setText(weather.getSavedate_weather());
            day.setGravity(Gravity.CENTER_HORIZONTAL);
            row.addView(day);
            TextView temp = new TextView(this);
            temp.setText(weather.getTemperature1() + "℃-"
                    + weather.getTemperature2() + "℃");
            temp.setGravity(Gravity.CENTER_HORIZONTAL);
            row.addView(temp);
            TextView condition = new TextView(this);
            condition.setText(weather.getStatus1());
            condition.setGravity(Gravity.CENTER_HORIZONTAL);
            row.addView(condition);
            table.addView(row);
        }
    private void converCityCode() {
            PropertiesUtil util = PropertiesUtil.getInstance();
            cityCode = util.getKey(cityName);
            // Toast.makeText(WeatherActivity.this, cityCode, 1).show();
            Log.e("--", cityCode);
    
        }
    
        private void checkCityName() {
            if (null == cityName || "".equals(cityName)) {
                new AlertDialog.Builder(this).setTitle("输入不正确")
                        .setMessage("城市名不能为空!").setPositiveButton("确定", null)
                        .show();
    
                return;
            }
    
        }
    private Weather getXml() {
            URL url = null;
            try {
                weatherUrl += "&city=" + URLEncoder.encode(cityName, "GBK");
            } catch (UnsupportedEncodingException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            Weather weather = null;
            try {
                url = new URL(weatherUrl);
    
                XmlPullParser parser = Xml.newPullParser();
                /**
                 * 读取本地数据 getResources().openRawResource(R.raw.weather);
                 * parser.setInput(getResources().openRawResource(R.raw.weather),
                 * "UTF-8");
                 */
    
                /*
                 * Reader reader = new BufferedReader(new InputStreamReader(
                 * url.openStream(), "UTF-8")); parser.setInput(reader);
                 */
                parser.setInput(url.openStream(), "UTF-8");
    
                int event = parser.getEventType();
    
                while (event != XmlPullParser.END_DOCUMENT) {
                    switch (event) {
                    case XmlPullParser.START_DOCUMENT:
    
                        break;
                    case XmlPullParser.START_TAG:
                        if (parser.getName().equals("Weather")) {
                            weather = new Weather();
                        }
                        if (null != weather) {
                            if (parser.getName().equals("status1")) {
                                weather.setStatus1(parser.nextText());
                            } else if (parser.getName().equals("temperature1")) {
                                weather.setTemperature1(parser.nextText());
                            } else if (parser.getName().equals("temperature2")) {
                                weather.setTemperature2(parser.nextText());
                            } else if (parser.getName().equals("savedate_weather")) {
                                weather.setSavedate_weather(parser.nextText());
                            }
                        }
    
                        break;
                    case XmlPullParser.END_TAG:
    
                        break;
    
                    default:
                        break;
                    }
                    event = parser.next();
    
                }
    
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return weather;
    
        }
    复制代码

    weather类

    复制代码
     1 public class Weather {
     2 
     3     private String status1;
     4     private String temperature1;
     5     private String temperature2;
     6     private String savedate_weather;
     7 
     8     public String getSavedate_weather() {
     9         return savedate_weather;
    10     }
    11 
    12     public void setSavedate_weather(String savedate_weather) {
    13         this.savedate_weather = savedate_weather;
    14     }
    15 
    16     public String getStatus1() {
    17         return status1;
    18     }
    19 
    20     public void setStatus1(String status1) {
    21         this.status1 = status1;
    22     }
    23 
    24     public String getTemperature1() {
    25         return temperature1;
    26     }
    27 
    28     public void setTemperature1(String temperature1) {
    29         this.temperature1 = temperature1;
    30     }
    31 
    32     public String getTemperature2() {
    33         return temperature2;
    34     }
    35 
    36     public void setTemperature2(String temperature2) {
    37         this.temperature2 = temperature2;
    38     }
    39 
    40 }
    复制代码
    View Code

    需要注意几点:

    1.不能再线程中去更新UI,正确的做法就是在handle中去操作。上面例子也是如此

    2.关于NetworkOnMainThreadException。因为message中不用携带任何信息,因此最早的做法是如此

    message.setTarget(handler); message.sendToTarget();

    发现会有异常android.os.NetworkOnMainThreadException。

    一是说android规范是要传递的message对象必须要有值,所以上面代码中加入了一些脏数据来避免这个问题

    另外一个说法是说android4.0以上的版本如果在主线程中开启新的线程就有报这个异常。

    但是上述代码我特意在主线程中开启了新的线程,发现并没有问题。

    防止NetworkOnMainThreadException有方法有两种,一个判断是不是android2.3以上,如果是的话

    加如下代码

    复制代码
        public void onCreate(Bundle savedInstanceState) {
    
            String strVer = GetSystemVersion();
            strVer = strVer.substring(0, 3).trim();
            float fv = Float.valueOf(strVer);
            Log.w("版本号", "" + fv);
            if (fv > 2.3) {
                StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                        .detectDiskReads().detectDiskWrites().detectNetwork() // 这里可以替换为detectAll()就包括了磁盘读写和网络I/O
                        .penaltyLog() // 打印logcat,当然也可以定位到dropbox,通过文件保存相应的log
                        .build());
                StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                        .detectLeakedSqlLiteObjects() // 探测SQLite数据库操作
                                                        // .penaltyLog()打印logcat
                                                        // .penaltyDeath()
                        .build());
            }
    //其他逻辑代码
    
    }
    /**
         * 返回当前系统版本
         * 
         * @return
         */
        public static String GetSystemVersion() {
            return android.os.Build.VERSION.RELEASE;
        }
    复制代码

    或则就是在避免在主线程中开启新的线程

    复制代码
        btnSearch.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    progressDialog.show();
                    new Thread(runnable).start();
    
        
    }
        
    }
            });
        }
    
    
    Runnable runnable = new Runnable(){
         
         @Override public void run() { Message message = new Message();
         
         message.setTarget(handler); message.sendToTarget();
         
         cityName = txCity.getText().toString(); //
         Toast.makeText(WeatherActivity.this, cityName, 1).show();
          checkCityName(); converCityCode(); weather = getXml();
         
          
          Bundle Bundle = new Bundle(); Bundle.putBoolean("1", false);
          message.setData(Bundle); message.what = 1;
         handler.sendMessageDelayed(message, 200); } };
    
    
    final Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    // super.handleMessage(msg);
                    if (msg.what == 1) {
                        layoutTable();
                        progressDialog.hide();
                    }
                }
            };
    复制代码

    三、需要配置网络权限,这个问题做的时候居然忘记了,而且异常还不提示缺少权限

      <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    四、城市名记得转码,如果喜欢http://m.weather.com.cn/data/101230101.html的朋友也可以使用上述的配置表来解析,一样试用。

    另外新浪的API没有天气有点遗憾。

    来还想要做menu弹出设置信息 配置展示的天数,信息保存到sharereference中,留给感兴趣的人练手。

    另外附上另外一种解析XML的方法,仅供参考

    复制代码
     url = new URL(weatherUrl); } catch (MalformedURLException e) {
             // TODO Auto-generated catch block e.printStackTrace(); } XmlParser
             parser = new XmlParser(url); String[] nodes =
             {"status1","temperature1","temperature2","savedate_weather"};
              Map<String, String> map = parser.getValue(nodes);
              
             weather=new Weather(); weather.setStatus1(map.get(nodes[0]));
              weather.setTemperature1(map.get(nodes[1]));
              weather.setTemperature2(map.get(nodes[2]));
             weather.setSavedate_weather(map.get(nodes[3]));
    复制代码
    View Code
    复制代码
      1 /**
      2  * 解析xml文档,包括本地文档和url
      3  * @author cyxl
      4  * @version 1.0 2012-05-24
      5  * @since 1.0
      6  *
      7  */
      8 public class XmlParser {
      9     InputStream inStream;
     10     Element root;
     11 
     12     public InputStream getInStream() {
     13         return inStream;
     14     }
     15 
     16     public void setInStream(InputStream inStream) {
     17         this.inStream = inStream;
     18     }
     19 
     20     public Element getRoot() {
     21         return root;
     22     }
     23 
     24     public void setRoot(Element root) {
     25         this.root = root;
     26     }
     27 
     28     public XmlParser() {
     29     }
     30 
     31     public XmlParser(InputStream inStream) {
     32         if (inStream != null) {
     33             this.inStream = inStream;
     34             DocumentBuilderFactory domfac = DocumentBuilderFactory
     35                     .newInstance();
     36             try {
     37                 DocumentBuilder domBuilder = domfac.newDocumentBuilder();
     38                 Document doc = domBuilder.parse(inStream);
     39                 root = doc.getDocumentElement();
     40             } catch (ParserConfigurationException e) {
     41                 e.printStackTrace();
     42             } catch (SAXException e) {
     43                 e.printStackTrace();
     44             } catch (IOException e) {
     45                 e.printStackTrace();
     46             }
     47         }
     48     }
     49 
     50     public XmlParser(String path) {
     51         InputStream inStream = null;
     52         try {
     53             inStream = new FileInputStream(path);
     54         } catch (FileNotFoundException e1) {
     55             e1.printStackTrace();
     56         }
     57         if (inStream != null) {
     58             this.inStream = inStream;
     59             DocumentBuilderFactory domfac = DocumentBuilderFactory
     60                     .newInstance();
     61             try {
     62                 DocumentBuilder domBuilder = domfac.newDocumentBuilder();
     63                 Document doc = domBuilder.parse(inStream);
     64                 root = doc.getDocumentElement();
     65             } catch (ParserConfigurationException e) {
     66                 e.printStackTrace();
     67             } catch (SAXException e) {
     68                 e.printStackTrace();
     69             } catch (IOException e) {
     70                 e.printStackTrace();
     71             }
     72         }
     73     }
     74 
     75     public XmlParser(URL url) {
     76         InputStream inStream = null;
     77         try {
     78             inStream = url.openStream();
     79         } catch (IOException e1) {
     80             e1.printStackTrace();
     81         }
     82         if (inStream != null) {
     83             this.inStream = inStream;
     84             DocumentBuilderFactory domfac = DocumentBuilderFactory
     85                     .newInstance();
     86             try {
     87                 DocumentBuilder domBuilder = domfac.newDocumentBuilder();
     88                 Document doc = domBuilder.parse(inStream);
     89                 root = doc.getDocumentElement();
     90             } catch (ParserConfigurationException e) {
     91                 e.printStackTrace();
     92             } catch (SAXException e) {
     93                 e.printStackTrace();
     94             } catch (IOException e) {
     95                 e.printStackTrace();
     96             }
     97         }
     98     }
     99 
    100     /**
    101      * 
    102      * @param nodes
    103      * @return 单个节点多个值以分号分隔
    104      */
    105     public Map<String, String> getValue(String[] nodes) {
    106         if (inStream == null || root==null) {
    107             return null;
    108         }
    109         Map<String, String> map = new HashMap<String, String>();
    110         // 初始化每个节点的值为null
    111         for (int i = 0; i < nodes.length; i++) {
    112             map.put(nodes[i], null);
    113         }
    114 
    115         // 遍历第一节点
    116         NodeList topNodes = root.getChildNodes();
    117         if (topNodes != null) {
    118             for (int i = 0; i < topNodes.getLength(); i++) {
    119                 Node book = topNodes.item(i);
    120                 if (book.getNodeType() == Node.ELEMENT_NODE) {
    121                     for (int j = 0; j < nodes.length; j++) {
    122                         for (Node node = book.getFirstChild(); node != null; node = node
    123                                 .getNextSibling()) {
    124                             if (node.getNodeType() == Node.ELEMENT_NODE) {
    125                                 if (node.getNodeName().equals(nodes[j])) {
    126                                     //String val=node.getFirstChild().getNodeValue();
    127                                     String val = node.getTextContent();
    128                                     System.out.println(nodes[j] + ":" + val);
    129                                     // 如果原来已经有值则以分号分隔
    130                                     String temp = map.get(nodes[j]);
    131                                     if (temp != null && !temp.equals("")) {
    132                                         temp = temp + ";" + val;
    133                                     } else {
    134                                         temp = val;
    135                                     }
    136                                     map.put(nodes[j], temp);
    137                                 }
    138                             }
    139                         }
    140                     }
    141                 }
    142             }
    143         }
    144         return map;
    145     }
    146 
    147 }
    复制代码
    View Code

    附上各种API的查询地址:http://hi.baidu.com/jugdwgozjnbjuvq/item/86b8d6041be5f611acdc7007

    一哥们的经历颇有感同身受的味道:http://blog.csdn.net/dragon08/article/details/7666172

    关于谷歌API的调用和整个工程代码可以来这里下载http://download.csdn.net/detail/draem0507/5370763

    展开全文
  • C#实现winform天气预报

    千次阅读 热门讨论 2017-10-03 14:51:35
    C#实现winform天气预报
  • 基于android的天气预报软件,动态的从网络上获取所选地区的天气情况相关信息,通过json数据格式返回本地,进行解析,呈现
  • 从0-1搭建一个天气预报网站

    千次阅读 多人点赞 2021-06-11 23:36:28
    文章目录前言先上图技术支撑用户 IP 地址获取天气预报 API开始搭建beego 环境搭建网站项目编写部署完工 前言 前段时间在家搭建了一台服务器《云服务器续费太贵,直接在家搭一台,再也不受约束了》,有小伙伴留言想看...
  • google天气预报接口Are you looking for a quick and easy way to see your local weather forecast in Google Chrome? Then you will definitely want to take a good look at the AccuWeather Forecast extension....
  • 解决办法:点击浏览器顶部菜单栏的一个“自定义”(其形似一个扳手)--“选项”--“高级选项”,在“内容设置”-“修改你计算机的Cookie及其他网站数据的保存方式”中选择“允许设置本地数据”及下方的“关闭浏览器时...
  • 天气预报

    千次阅读 2014-09-19 00:12:18
    能够获取国内各省及省会城市的天气,可以通过pyName载入各省内城市的天气  如:河北省 pyName="hebei"  http://flash.weather.com.cn/wmaps/xml/hebei.xml  就可以载入河北省各城市天气,可以通过pyName=...
  • PHP天气预报小偷 v1.0

    2021-05-06 20:18:22
    PHP天气预报小偷介绍一些参数在config.php里,请修改下就可以了。 程序可查询一周天气情况。支持搜索,另外有生活指数,疾病指数和休闲指数三个小参数。程序使用的图片已经下载本地。下次更新将支持伪静态。本人...
  • Unity制作天气预报

    2021-02-24 16:38:02
    使用Unity制作天气预报最难的一点就是没有合适的天气接口,在网上找了好多才找到一个合适的接口。 http://www.tianqiapi.com/index/doc 这个网站注册成功后可以免费查找2000次很适合小伙伴练习使用。 效果图: 二、...
  • 透明漂亮的桌面天气预报工具-中国农历天气预报1.6.1 工具主要功能: 1.透明漂亮UI,支持更换背景颜色,调整透明度等。 2.支持定制全国2500多个大小城市 3 天内 天气预报。 3.支持设置开机启动。 4...
  • 天气预报抓取

    千次阅读 2010-05-19 15:30:00
    看了很多网站需要显示天气预报,于是我决心整理下代码。大部分网站是调用的天气预报插件,这样给我们带来很多不便。比如,不能上互联网,只能在局域网使用的,根本就连不上服务器,这时天气预报那个地方就显示“无法...
  • ·本地天气预报时,程序会自动转到本地天气预报HTML页面。这样做可以加快显示速度。 ·多地方查询,这个可以查询到全国各地的甚至全球天气的情况 只要你在 address.asp,和address.htm加入检索就...
  • 简单天气简洁的天气界面,多套皮肤... 功能介绍 农历、公历及黄历查询 农历和公历及黄历自由一目了然 城市天气预报 自动显示本地天气以及未来天气 数字时钟 提供准确的北京时间 迷你新闻资讯 能够让您及时了解最新资讯
  • 获取自动定位天气当你走到哪里哪里就会显示对应的天气预报
  • 在用Android获取天气预报数据时,大家一定会首先想到Google的天气预报API,其实除了Google的天气预报API,免费的天气预报接口还有http://www.webservicex.net/globalweather.asmx?op=GetWeather、...
  • Android获取天气预报Demo

    万次阅读 多人点赞 2017-05-06 21:44:39
    近期在学习Android的时候,做了一个有关天气预报的任务,本文利用Gson解析Json的方式写一个Demo给有需要的朋友作为参考 天气预报来源:和风天气 https://www.heweather.com/documents/api/v5/weather 可以在百度上...
  • iOS开发:简易天气预报

    千次阅读 2016-06-12 12:03:04
    从网络上API通过http请求天气json文件数据,在本地解析显示在界面上,可以显示7天的天气预报以及当天的详细气象参数。 预览 思路 在网上找免费可用的天气预报接口通过jsonmodel解析json file 天气预报API ...
  • Python查询天气预报

    2015-09-29 11:52:07
    Python查询天气预报 分类: Python 2013-12-02 08:59 1357人阅读 评论(2) 收藏 举报 Python天气预报 目录(?)[+] 一. 实现过程 1.1 查询外网IP 通过这个网址查询到外网IP ...
  • PHP天气预报小偷介绍 一些参数在config.php里,请修改下就可以了。 程序可查询一周天气情况。支持搜索,另外有生活指数,疾病指数和休闲指数三个小参数。程序使用的图片已经下载本地。下次更新将支持伪静态。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,596
精华内容 1,438
关键字:

下载本地天气预报