packagecom.jointsky.jointframe.weather.utils;importjava.io.BufferedReader;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.URL;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.apache.commons.lang.StringUtils;importcom.jointsky.jointframe.weather.entity.ActuallyForecastWeather;importcom.jointsky.jointframe.weather.entity.ActuallyWeather;/***
Description:实况天气资料工具类
*/public classUrlInfo {/*** 生成一个Pattern,同时编译一个正则表达式*/
private static Pattern proInfo = Pattern.compile("(.*?)", Pattern.DOTALL);/*** 宁夏区县编码(总乡镇数190)
* 银川{市辖区(11个乡镇):53614;贺兰县(7):53610;永宁县(8):53618;灵武市(8):53619}*/
private static String countyCodes = "53614,53610,53618,53619";/*** 获取实况天气(当天)数据的方法
*@paramurlInfo
*@paramcharset
*@return*@throwsException*/
public static List getURLInfoOfActully(String urlInfo,String charset) throwsException {
String info=getUrlInfo(urlInfo);//获得网页源码(0是当天)
return getDataStructure(info,0);
}/*** 获取实况天气(预报)数据的方法
*@paramurlInfo
*@paramcharset
*@return*@throwsException*/
public static List getURLInfoOfForecast(String urlInfo,String charset) throwsException {
String info=getUrlInfo(urlInfo);//获得网页源码(1是预报)
return getDataStructure(info,1);
}/*** 网页信息
*@paramurlInfo
*@return*@throwsException*/
public static String getUrlInfo(String urlInfo) throwsException {//读取目的网页URL地址,获取网页源码
URL url = newURL(urlInfo);
HttpURLConnection httpUrl=(HttpURLConnection)url.openConnection();
InputStream is=httpUrl.getInputStream();
BufferedReader br= new BufferedReader(new InputStreamReader(is,"utf-8"));
StringBuilder sb= newStringBuilder();
String line;while ((line = br.readLine()) != null) {//这里是对链接进行处理
line = line.replaceAll("?a[^>]*>", "");//这里是对样式进行处理
line = line.replaceAll("]*>", "");
sb.append(line);
}
is.close();
br.close();returnsb.toString().trim();
}private static List getDataStructure(String str,intj) {//运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,//现在暂时运用正则表达式对数据进行抽取提取//String[] info = str.split("");
SimpleDateFormat sf = new SimpleDateFormat("HH");
Date dateTime= newDate();
String hour=sf.format(dateTime);
Integer h=Integer.parseInt(hour);int t = 0;//如果十二点之前当天会有四个时间段模块(今天上午6~12;今天下午12~18;今天前半夜18~24;今天后半夜次日00~06)
if (h<=12) {
t=4;//如果十二点之后十八点之前当天会有三个时间段模块(今天下午12~18;今天前半夜18~24;今天后半夜次日00~06)
}else if (12
t=3;//如果十八点之后当天会有两个时间段模块(今天前半夜18~24;今天后半夜次日00~06)
}else if(h>18) {
t=2;
}
String[] info= str.split("
");List list_actually = new ArrayList();
List list_forecast = new ArrayList();
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");//当t的值是几的时候相应的当天的天气数据就还剩下几个模块,k就是用来控制第几个模块数据的参数
int k = 0;for(String s : info) {//这个Pattern对象将会使用matcher()方法来生成一个Matcher实例,接着便可以使用该 Matcher实例以编译的正则表达式为基础对目标字符串进行匹配工作,多个Matcher是可以共用一个Pattern对象的。
Matcher m =proInfo.matcher(s);
ActuallyWeather actually= null;
ActuallyForecastWeather forecast= null;//使用find()方法查找第一个匹配的对象
if(m.find()) {
actually= newActuallyWeather();
forecast= newActuallyForecastWeather();//返回与组匹配的子串内容
String[] ss = m.group(1).trim().replace(" ", "").split(">");if ("风力".equals(ss[0])) {
k++;
String[] strsss= s.split("
");int i = 0;if (k<=t&&j==0) {actually= newActuallyWeather();for(String ss1 : strsss) {
Matcher mm=proInfo.matcher(ss1);if(mm.find()) {//设置产品型号
String[] sss = mm.group(1).trim().replace(" ", "").split(">");if (i%4==1) {
actually.setPlaceName(sss[0]);
}else if (i%4==2) {
actually.setWeatherStatus(sss[0]);
}else if (i%4==3) {
String temp= sss[0];
String[] temps= temp.split("/");
actually.setMaxTemperature(temps[0]+"℃");
actually.setMinTemperature(temps[1]);
}else if (i%4==0&&i!=0) {
actually.setWindPower(sss[0]);
}
}if (i%4==0&&i!=0) {
Date date= newDate();//发布日期
actually.setPubTime(sdf.format(date));//前四模块数据从当天早上七点开始加六个小时//date = new Date(date.getTime() + (k-1)*21600000);
int p = 0;//t是当日数据剩余次数;k是当前循环次数
if ((t-k)==3) {
p= 6;
}else if ((t-k)==2) {
p= 12;
}else if ((t-k)==1) {
p= 18;
}else if ((t-k)==0) {
p= 24;
}//次日凌晨
if (24==p) {
Date time= new Date(date.getTime() + 86400000);
actually.setForecastTime(sdf.format(time)+" 00");
}else if (p<10) {
actually.setForecastTime(sdf.format(date)+" 0"+p);
}else if (p>10&&p!=24) {
actually.setForecastTime(sdf.format(date)+" "+p);
}
list_actually.add(actually);
actually=newActuallyWeather();
}
i++;
}
}else if (k>t&&j==1) {
forecast= newActuallyForecastWeather();for(String ss1 : strsss) {
Matcher mm=proInfo.matcher(ss1);if(mm.find()) {//设置产品型号
String[] sss = mm.group(1).trim().replace(" ", "").split(">");if (i%4==1) {
forecast.setPlaceName(sss[0]);
}else if (i%4==2) {
forecast.setWeatherStatus(sss[0]);
}else if (i%4==3) {
String temp= sss[0];
String[] temps= temp.split("/");
forecast.setMaxTemperature(temps[0]+"℃");
forecast.setMinTemperature(temps[1]);
}else if (i%4==0&&i!=0) {
forecast.setWindPower(sss[0]);
}
}if (i%4==0&&i!=0) {
Date date= newDate();//发布日期
forecast.setPubTime(sdf.format(date));//从第五个模块数据开始数据是从次日凌晨开始每下一组比上一组晚24小时
date = new Date(date.getTime() + (k-t)*86400000);
forecast.setForecastTime(sdf.format(date)+" 00");
list_forecast.add(forecast);
forecast=newActuallyForecastWeather();
}
i++;
}
}
}
}
}if (0==j) {returnlist_actually;
}else if (1==j) {returnlist_forecast;
}return null;
}/*** 生成url
*@paramcountyCode
*@return*@throwsException*/
public static String getUrl(String countyCode) throwsException {
String url= "http://3g.nx121.com/pc/tqybxzb.aspx";if(StringUtils.isNotEmpty(countyCode)) {
url= url + "?sd="+countyCode;
}returnurl;
}/*** 根据城市编码查询所属市级和区县级行政区
*@paramcountyCode
*@return*@throwsException*/
public static Map getDistrict(String countyCode) throwsException {
Map map = new HashMap();if ("53614".equals(countyCode)) {//市级行政区
map.put("cityLevel", "银川市");//区县级行政区
map.put("countyLevel", "市辖区");
}else if ("53610".equals(countyCode)) {//市级行政区
map.put("cityLevel", "银川市");//区县级行政区
map.put("countyLevel", "贺兰县");
}else if ("53618".equals(countyCode)) {//市级行政区
map.put("cityLevel", "银川市");//区县级行政区
map.put("countyLevel", "永宁县");
}else if ("53619".equals(countyCode)) {//市级行政区
map.put("cityLevel", "银川市");//区县级行政区
map.put("countyLevel", "灵武市");
}returnmap;
}public staticPattern getProInfo() {returnproInfo;
}public static voidsetProInfo(Pattern proInfo) {
UrlInfo.proInfo=proInfo;
}public staticString getCountyCodes() {returncountyCodes;
}public static voidsetCountyCodes(String countyCodes) {
UrlInfo.countyCodes=countyCodes;
}
}