`
kongshanxuelin
  • 浏览: 921655 次
  • 性别: 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
分享到:
评论

相关推荐

    IOS应用源码——天气预报.zip

    以下是对"IOS应用源码——天气预报.zip"这一主题的详细分析。 首先,我们需要理解iOS应用的基础架构。iOS应用主要基于Apple的Swift或Objective-C编程语言构建,使用Xcode集成开发环境进行开发。在这个源码中,我们...

    易语言天气预报例程源码,易语言国内主要城市天气预报

    在"国内主要城市天气预报易语言源码"的压缩包中,包含了实现以上功能的源代码文件。对于学习易语言或者想要了解如何编写天气预报应用的人来说,这是一个宝贵的资源。通过阅读和分析这段源码,你可以了解到如何使用...

    基于QT的在线天气预报源码.zip

    描述简单明了,"基于QT的在线天气预报源码",强调了这是源代码,意味着它包含了程序的设计和实现细节,开发者可以通过阅读和修改这些代码来学习或扩展功能。这个项目可能是为了教学目的、个人实践或者作为其他项目的...

    Android天气预报源码

    其次,天气预报功能的实现涉及网络请求和数据解析。开发者通常会使用Http协议向气象API发送请求,获取JSON或XML格式的天气数据,然后使用如Gson或Jackson库将数据解析成Java对象。此外,为了优化用户体验,数据可能...

    android 天气预报 源码

    本文将深入探讨一个基于Android的天气预报源码,帮助开发者了解如何实现这样一个功能丰富的应用。 1. **数据获取** - 天气预报应用的核心是获取准确的气象数据。通常,这涉及到与气象API(如OpenWeatherMap、...

    Android 城市天气预报源码.zip

    这个压缩包文件“Android 城市天气预报源码.zip”包含了开发一个Android应用程序所需的资源,主要用于展示城市天气预报。让我们深入探讨一下这个项目可能涉及的关键知识点。 1. **Android开发环境**:首先,要理解...

    android简易天气预报源码

    总结来说,这个"android简易天气预报源码"项目涵盖了Android网络编程、数据解析以及UI设计等多个核心知识点。通过实践这个项目,开发者能够深入理解OkHttp和Gson的使用,并且提升在Android平台上构建完整应用的能力...

    Anroid天气预报源码Anroid天气预报源码

    Android天气预报源码是开发Android应用的一个实例,它包含了实现天气预报功能的所有代码和资源文件。这个源码项目可以帮助开发者了解如何在Android平台上构建一个实时更新、显示当地天气信息的应用。下面将详细解析...

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

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

    Android 天气预报源码

    这份"Android天气预报源码"提供了实现此类功能的具体代码,是开发者学习和实践Android应用程序开发,尤其是数据获取和UI设计的宝贵资源。下面将详细探讨这个源码中的关键知识点。 1. **网络请求与数据解析**:为了...

    天气预报代码实现

    在编程领域,实现天气预报代码是一项综合性的任务,它涵盖了数据获取、数据处理、地理位置解析、日期时间操作以及可能的图形界面展示等多个方面。以下是一些相关知识点的详细说明: 1. **API接口使用**:通常,天气...

    android天气预报源码

    综合以上分析,这个Android天气预报源码主要涵盖了网络请求、数据解析、数据库操作、UI设计以及后台服务等多个方面的技术,是一个完整的Android开发实例,对于学习和理解Android应用开发流程非常有帮助。开发者可以...

    天气预报代码各种样式

    本主题聚焦于"天气预报代码各种样式",主要涉及到JSP(JavaServer Pages)和HTML这两种技术在创建动态网页时的应用。 JSP是Java的一种服务器端脚本语言,它允许开发人员将Java代码嵌入到HTML文档中,以实现动态内容...

    Android代码-城市天气预报源码.zip

    《Android城市天气预报源码解析》 Android城市天气预报源码是开发一款能够实时查询各地天气的应用程序的基础。这份源码包含了一系列与Android应用程序开发相关的技术知识点,涉及到UI设计、网络请求、数据处理等多...

    Android Studio实现天气预报小程序

    在Android Studio中实现一个天气预报小程序,涉及到许多关键的Android开发技术。首先,我们需要了解Android Studio作为集成开发环境(IDE)的基本使用,包括项目创建、布局设计、代码编写以及调试等流程。 1. **...

    安卓Android源码——天气预报源码.zip

    【Android天气预报源码解析】 本压缩包包含的“安卓Android源码——天气预报源码.zip”是一个完整的Android应用程序项目,旨在实现天气预报功能。这个项目对于学习Android应用开发,尤其是涉及网络请求、数据解析、...

    安卓天气预报项目源代码

    【安卓天气预报项目源代码】是一个面向Android平台的软件开发项目,主要目标是实现一个能够实时获取并显示天气信息的应用程序。这个项目涉及到的技术点涵盖了Android应用开发的基础和进阶内容,包括用户界面设计、...

    易语言语言天气预报源码易语言天气预报源码

    在实现天气预报功能时,源码可能涉及到网络请求和数据解析。易语言提供了网络模块,可以用来发送HTTP请求到天气预报API服务器,获取JSON或XML格式的天气数据。例如,使用“网络发送请求”命令向气象服务提供商发送...

    Android UI界面漂亮的天气预报源码.zip

    这个压缩包文件“Android UI界面漂亮的天气预报源码.zip”包含了一个用于在Android平台上构建美观天气预报应用的源代码。这个源码实例可能是为开发者提供一个参考,展示如何设计和实现用户界面,以及如何获取和展示...

Global site tag (gtag.js) - Google Analytics