`
kongshanxuelin
  • 浏览: 911307 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

天气预报代码分析与实现

阅读更多

在做网站中,遇到天气预报接口是避免不了的,天气预报的实现主要涉及到以下几个技术点:

  1. 正则表达式匹配从中央气象局的天气预报网页,这种方式下,固定城市实现比较简单,不同城市需要一个对照表,来完成这个映射工作
  2. IP识别获取城市(本文实现方式)
  3. 利用WebService服务接口获取城市天气(本文实现方式)
  4. 已拉取的城市天气当日缓存(本文实现方式)

附效果地址:http://weather.faqee.com/ 

 

定义缓存:

private static HashMap<String,JSONObject> hmCache = new HashMap();

 

缓存通过TimerTask定时清空前几天实现,代码如下:

    public static void cleanCache() { 
    	if(isStart) return;
    	isStart = true;
        TimerTask task = new TimerTask() { 
            public void run() {        
            	Iterator it = hmCache.entrySet().iterator();
            	while (it.hasNext()) {
            		Map.Entry entry = (Map.Entry) it.next();
            		Object key = entry.getKey(); 
            		String today = DateTimeUtil.format(new Date(),"yyyyMMdd");
            		if(key.toString().indexOf(today)>=0){
            			it.remove();
            			hmCache.remove(key);
            		}  		
            	}           	
            } 
        }; 
        Timer timer = new Timer(); 
        timer.schedule(task, Calendar.getInstance ().getTime(), 24*3600 * 1000); 

     } 

 拉取天气:

    public JSONObject getWeather(String city) {  
    	String today = DateTimeUtil.format(new Date(),"yyyyMMdd");
    	if(hmCache.get(city+today)!=null){
    		return hmCache.get(city+today);
    	}
    	JSONObject hm =new JSONObject();
		hm.put("zhishu","");

        try {    
        	city = getCityName(city);
            Document doc;    
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();    
            dbf.setNamespaceAware(true);    
            DocumentBuilder db = dbf.newDocumentBuilder();    
            InputStream is = getSoapInputStream(city);  
            if(is == null) return hm;
            doc = db.parse(is);    
            NodeList nl = doc.getElementsByTagName("Date");    
            
            String tpPrefix = "http://www.nmc.gov.cn/img/weather/dn_icon/";
            String t = "",t_res = "",t_tp="";
            String t1 = "",t1_res = "",t1_tp="";
            String t2 = "",t2_res = "",t2_tp="";
            String t3 = "",t3_res = "",t3_tp="";
            
            for (int count = 0; count < nl.getLength(); count++) {    
                Node n = nl.item(count);    
                
                NodeList n2 = n.getChildNodes();

                
                t = doc.getElementsByTagName("Sj0").item(0).getFirstChild().getNodeValue(); 
                t1 = doc.getElementsByTagName("Sj1").item(0).getFirstChild().getNodeValue(); 
                t2 = doc.getElementsByTagName("Sj2").item(0).getFirstChild().getNodeValue(); 
                t3 = doc.getElementsByTagName("Sj3").item(0).getFirstChild().getNodeValue(); 
                
                if(n2!=null){
                	for(int jj=0;jj<n2.getLength();jj++){
                		Node nn = n2.item(jj);
                		if(count == 0 ) // 今天
                		{
                			if(nn.getNodeName().equalsIgnoreCase("tq")){
                				t_res += nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Qw")){
                				t_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Fx")){
                				t_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Rc")){
                				t_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Rl")){
                				t_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("TP")){
                				t_tp = nn.getFirstChild().getNodeValue();
                				t_tp = Utils.replace(t_tp,"\"","");
                				t_tp = Utils.replace(t_tp,"/images/","");
                				t_tp = tpPrefix + t_tp;
                			}
                		}else if(count == 1) //明天
                		{
                			if(nn.getNodeName().equalsIgnoreCase("tq")){
                				t1_res += nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Qw")){
                				t1_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Fx")){
                				t1_res += ","+nn.getFirstChild().getNodeValue();
                			} else if(nn.getNodeName().equalsIgnoreCase("TP")){
                				t1_tp = nn.getFirstChild().getNodeValue();
                				t1_tp = Utils.replace(t1_tp,"\"","");
                				t1_tp = Utils.replace(t1_tp,"/images/","");
                				t1_tp = tpPrefix + t1_tp;
                			}              			
                		}else if(count == 2) //后天
                		{
                			if(nn.getNodeName().equalsIgnoreCase("tq")){
                				t2_res += nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Qw")){
                				t2_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Fx")){
                				t2_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("TP")){
                				t2_tp = nn.getFirstChild().getNodeValue();
                				t2_tp = Utils.replace(t2_tp,"\"","");
                				t2_tp = Utils.replace(t2_tp,"/images/","");
                				t2_tp = tpPrefix + t2_tp;
                			}  
                		}else if(count == 3) //大后天
                		{
                			if(nn.getNodeName().equalsIgnoreCase("tq")){
                				t3_res += nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Qw")){
                				t3_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("Fx")){
                				t3_res += ","+nn.getFirstChild().getNodeValue();
                			}else if(nn.getNodeName().equalsIgnoreCase("TP")){
                				t3_tp = nn.getFirstChild().getNodeValue();
                				t3_tp = Utils.replace(t3_tp,"\"","");
                				t3_tp = Utils.replace(t3_tp,"/images/","");
                				t3_tp = tpPrefix + t3_tp;
                			}  
                		}
                			
                		
                	}
                }
                

              
            }    
            is.close();    
            hm.put("t", t);
            hm.put("t_result", t_res);
            hm.put("t_tp", t_tp.trim());
            hm.put("t1", t1);
            hm.put("t1_result", t1_res);
            hm.put("t1_tp", t1_tp.trim());
            hm.put("t2", t2);
            hm.put("t2_result", t2_res);
            hm.put("t2_tp", t2_tp.trim());
            hm.put("t3", t3);
            hm.put("t3_result", t3_res);
            hm.put("t3_tp", t3_tp.trim());
            
            hmCache.put(city+today, hm);
            
            return hm;
        } catch (Exception e) {    
            e.printStackTrace();    
            return null;    
        }    
    }  

 

附效果地址:http://weather.faqee.com/

 

 

2
0
分享到:
评论

相关推荐

    基于Android的天气预报应用系统设计与实现.zip

    整个app实现了对天气预报的获取、展示,位置的获取等功能。通过安卓网络编程的方式可以很方便的获取到天气json数据,通过使用GSON库,解析为我们软件需要的数据结构,给软件的编写提供了极大的便利。安卓的Activity...

    js 天气预报 ajax技术,很好很强大

    天气预报天气预报天气预报天气预报天气预报天气预报天气预报天气预报天气预报天气预报天气预报天气预报天气预报

    Android Studio实现天气预报APP系统源码+项目报告(可做Android本科毕业设计)

    Android Studio实现天气预报APP系统源码+项目报告(可做Android本科毕业设计) 本项目实现在 Android 移动设备上查询天气信息,因为是移动设备,所以使用起来非 常的便捷与方便,可以随时随地的查询不同城市的天气,...

    javaweb基于servlet天气预报查询系统设计与实现(项目源码)

    系统实现了展示所有省份信息,及对应的城市信息,通过点击城市信息,可以获取当前所对应的天气信息。 系统采用servlet框架结构,json作为数据读取的数据源。 2、项目技术 后台架构:servlet+json 前台技术:...

    安卓天气预报源码(带换肤功能)weatherApp.7z

    1、资料包括安卓app源代码和产品设计说明相关文档,有助于理解整个app设计开发过程。 2、资源内容:安卓app框架源...7、使用/学习说明:在学习的过程要结合安卓开发的核心原理与内容需求分析和方案设计,在实践中不断提升

    基于python的天气预报系统设计和可视化数据分析

    python或jutyper 都可成功运行,编写的基于爬虫的和TK界面的天气预报系统,可选择多个城市,15天天气,数据绘图处理以及数据保存,代码python和jutyper均可成功运行 (内含py文件和必要文件)

    完整天气预报客户端源码

    一个完整的天气预报客户端 主要包括功能:引导页 侧边栏 城市选择 侧滑删除列表项 网络请求 目前用到的一些开源库。 Volley Google I/O 2013推出的官方网络请求库,请求快速,使用方便,易于扩展,而且支持图片...

    Android Studio实现天气预报App,满分课设大作业项目源码.zip

    Android Studio实现天气预报App,满分课设大作业项目源码.zip代码完整下载可用,确保可以运行。中国天气网的api,http获取网络信息,json解析数据,显示到界面。数据库存放城市与城市的url,可以进行收藏,切换城市...

    天气预报源码

    一款简单的天气预报软件,使用pull解析xml数据,部分功能暂未实现

    java基于高德地图实现实时查询天气功能源代码.zip

    java基于高德地图实现实时查询天气功能源代码。基于高德地图实现实时查询天气功能,api二次开发java基于高德地图实现实时查询天气功能源代码。基于高德地图实现实时查询天气功能,api二次开发java基于高德地图实现...

    C++实现查询天气预报

    C++查询天气预报,在VS 2019 环境下的简单实现,已经包含了JsonCpp、sqlite、weather.db文件!

    Android安卓天气预报系统设计与实现.zip(论文+导入项目教程+项目源码)

    1.项目总体设计 1 1.1 系统需求分析 1 1.2涉及相关技术及知识点 2 ...2.项目的设计与实现 4 2.1 程序流程图 5 2.2 系统实现 6 2.2.1 UI界面设计 6 2.2.2 核心代码设计 9 2.3 程序运行结果及分析 21 3.项目总结 23

    Android Demo 天气预报 Volley+Gson

    使用Volley+Gson在线解析Api,选择不同地区根据assets资源加载不同地区代码请求天气信息。 本App为小练习,所以使用了Spinner选择地区,而没有使用新的Activity来更好的显示。 重点在于json解析以及Volley联网。

    仿写天气预报程序代码

    该资源内容主要是实现的查询全国各地天气预报,涉及的知识点主要是JSON解析和XML 解析,ListView和Spinner的显示。很简单,提供给刚接触Android开发的朋友

    免费接口天气预报实现全过程

    详细讲解天气预报实现全过程、免费接口、有图、有代码、有解析。

    安卓期末大作业-java实现的一个天气预报app项目源码(95分以上).zip

    安卓期末大作业-java实现的一个天气预报app项目源码(95分以上).zip大三上学期安卓的期末大作业,做的是一个天气预报app,已获老师认可并且98分通过项目,代码完整下载可用。 天气预报 一、 课题内容和要求 从api中...

    Android项目源码QQ登录语音合成桌面控件天气预报

    本项目是一个基于安卓的天气预报项目源码,实现了QQ登录,widget桌面控件,语音播报天气,定位当前城市,查询其他地区天气等功能,代码量比较大,测试的时候不要用模拟器测试,模拟器无法载入主界面。项目代码较多...

    基于Java的简易天气预报

    基于Java实现的简易天气预报,实现平台为Android Studio,模型为mvc,接口获取解析格式为xml,功能:一、选择城市(包括获得其中数据库中城市代码信息) 二、更新信息 三、更新六日信息

    android api天气预报定位下拉刷新启动页

    程序功能实现了访问API、JSON数据解析、下拉...由于使用的是聚合的天气预报API,下载后不能直接使用,需要先去聚合后台(https://www.juhe.cn/)注册一个帐号,申请天气预报API后得到的Key填入到程序代码中。即可调用。

    安卓天气预报

    天气预报app制作,、完成天气预报城市天气页面后台界面代码,编写获取网络数据和解析json的工具类util,实现摇一摇百度定位 。

Global site tag (gtag.js) - Google Analytics