德必信生活网

您现在的位置是:首页 > 生活资讯 > 正文

生活资讯

天气预报开发(天气预报开发者哪里最准确)

阿信2023-01-04生活资讯72

今天给各位分享天气预报开发的知识,其中也会对天气预报开发者哪里最准确进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

求Android天气预报的开发源代码

package com.nrzc.weatherstation;

import android.content.Context;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.widget.TextView;

import java.util.Timer;

import java.util.TimerTask;

/**

* 环境传感器

* 气象站

*/

public class MainActivity extends AppCompatActivity {

private SensorManager sensorManager;

private TextView temperatureTextView;

private TextView pressureTextView;

private TextView lightTextView;

private float currentTemperature=Float.NaN;

private float currentPressure=Float.NaN;

private float currentLight=Float.NaN;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init();

Timer updateTimer=new Timer("weatherUpdate");

updateTimer.scheduleAtFixedRate(new TimerTask() {

@Override

public void run() {

updateGUI();

}

},0,1000);

}

private void init(){

temperatureTextView=(TextView)findViewById(R.id.temperature);

pressureTextView=(TextView)findViewById(R.id.pressure);

lightTextView=(TextView)findViewById(R.id.light);

sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);

}

private final SensorEventListener tempSensorEventListener=new SensorEventListener() {

@Override

public void onSensorChanged(SensorEvent event) {

currentTemperature=event.values[0];

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

};

private final SensorEventListener pressureSensorEventListener=new SensorEventListener() {

@Override

public void onSensorChanged(SensorEvent event) {

currentPressure=event.values[0];

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

};

private final SensorEventListener lightSensorEventListener=new SensorEventListener() {

@Override

public void onSensorChanged(SensorEvent event) {

currentLight=event.values[0];

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

};

@Override

protected void onResume() {

super.onResume();

Sensor lightSensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);

if (lightSensor!=null)

sensorManager.registerListener(lightSensorEventListener,

lightSensor,

SensorManager.SENSOR_DELAY_NORMAL);

else

lightTextView.setText("Light Sensor Unavailable");

Sensor pressureSensor=sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);

if (pressureSensor!=null)

sensorManager.registerListener(pressureSensorEventListener,

pressureSensor,SensorManager.SENSOR_DELAY_NORMAL);

else

pressureTextView.setText("Barometer Unavailable");

Sensor temperatureSensor=sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);

if (temperatureSensor!=null)

sensorManager.registerListener(tempSensorEventListener,

temperatureSensor,

SensorManager.SENSOR_DELAY_NORMAL);

else

temperatureTextView.setText("Thermometer Unavailable");

}

@Override

protected void onPause() {

sensorManager.unregisterListener(pressureSensorEventListener);

sensorManager.unregisterListener(tempSensorEventListener);

sensorManager.unregisterListener(lightSensorEventListener);

super.onPause();

}

private void updateGUI(){

runOnUiThread(new Runnable() {

@Override

public void run() {

if(!Float.isNaN(currentPressure)){

pressureTextView.setText(currentPressure+"hPa");

pressureTextView.invalidate();

}

if (!Float.isNaN(currentLight)){

String lightStr="Sunny";

if (currentLight=SensorManager.LIGHT_CLOUDY)

lightStr="night";

else if (currentLight=SensorManager.LIGHT_OVERCAST)

lightStr="Cloudy";

else if (currentLight=SensorManager.LIGHT_SUNLIGHT)

lightStr="Overcast";

lightTextView.setText(lightStr);

lightTextView.invalidate();

}

if (!Float.isNaN(currentTemperature)){

temperatureTextView.setText(currentTemperature+"C");

temperatureTextView.invalidate();

}

}

});

}

}

如何使用中国气象局API开发天气APP

前期的准备工作

一、申请API(拿好appid和private_key)

二、解读《SmartWeatherAPILite WebAPI版接口使用说明书》

三、准备好areaid、type、date、appid、urlencode($key)(注意,这里经加密的key是需要encodeurl之后的才能成为接口链接的一部分)

好了下面的编码开始

1、从附件中的areaid_list中找到你想要的地方的areaid,并且选择要查询天气的类型

NSString *areaid = @"101010100";

NSString *type =

@"index_f";

/**

* 官方文档更新的数据类型号

* 指数:index_f(基础接口);index_v(常规接口)

3天预报:forecast_f(基础接口);forecast_v(常规接口)

*

*/

2、获得当前天气date

NSDate

*_date = [NSDate date];

NSDateFormatter *dateFormatter =

[[NSDateFormatter alloc] init];

[dateFormatter

setDateFormat:@"yyyyMMddHHmmss"];//注意日期的格式

NSString *date =

[[dateFormatter stringFromDate:_date]

substringToIndex:12];//用到的精确到分,24小时制60分钟制

3、申请的appid,和private_key

NSString *appid =

@"15ds45s13a465s";//这里是楼主随便输入的,瞎编的

NSString *private_key =

@"46s4ds_SmartWeatherAPI_45s44d6";//也是瞎编的

4、算出经过urlencode后的key,这步比较重要,步骤也多,请耐心看完。

在原来的的基础上是在PHP的环境中算出的,代码如下,可在“

”下进行算法的检验

echo

urlencode(base64_encode(hash_hmac('sha1', " ;type=index_fdate=201409041509appid=15ds45s13a465s",

"46s4ds_SmartWeatherAPI_45s44d6",

TRUE)));

首先定义得到public_key和API的方法,还有就是对key进行encodeurl操作的方法

注意,这里的方法都是被我定义在getTime的类里面,后面是在main中实例化出来的

//获得publicky

- (NSString*)

getPublicKey:(NSString*)areaid :(NSString*)type :(NSString*)date

:(NSString*)appid {

NSString *Key = [[NSString alloc]

initWithFormat:@";type=%@date=%@appid=%@",

areaid, type, [date substringToIndex:12], appid];

return

Key;

}

//获得完整的API

- (NSString*) getAPI:(NSString*)areaid

:(NSString*)type :(NSString*)date :(NSString*)appid :(NSString*)key

{

NSString *API = [[NSString alloc]

initWithFormat:@";type=%@date=%@appid=%@key=%@",

areaid, type, [date substringToIndex:12], [appid substringToIndex:6],

key];

//-------------这里需要主要的是只需要appid的前6位!!!

return

API;

}

//将获得的key进性urlencode操作

- (NSString

*)stringByEncodingURLFormat:(NSString*)_key{

NSString *encodedString

= (__bridge NSString

*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)_key,

nil, (CFStringRef) @"!$'()*+,-./:;=?@_~%#[]",

kCFStringEncodingUTF8);

//由于ARC的存在,这里的转换需要添加__bridge,原因我不明。求大神讲解

return

encodedString;

}

重点来了,在oc下的算法如下,记得把附件的Base64.h

加进来并引用到工程里面

//对publickey和privatekey进行加密

- (NSString *)

hmacSha1:(NSString*)public_key :(NSString*)private_key{

NSData*

secretData = [private_key

dataUsingEncoding:NSUTF8StringEncoding];

NSData* stringData = [public_key

dataUsingEncoding:NSUTF8StringEncoding];

const void* keyBytes =

[secretData bytes];

const void* dataBytes = [stringData

bytes];

///#define CC_SHA1_DIGEST_LENGTH 20 /* digest

length in bytes */

void* outs =

malloc(CC_SHA1_DIGEST_LENGTH);

CCHmac(kCCHmacAlgSHA1, keyBytes,

[secretData length], dataBytes, [stringData length], outs);

//

Soluion 1

NSData* signatureData = [NSData dataWithBytesNoCopy:outs

length:CC_SHA1_DIGEST_LENGTH freeWhenDone:YES];

return

[signatureData

base64EncodedString];

}

这里只是初步算出来的key,还未encodeurl,链接不能被浏览器识别,所以现在经过算法得到的_key还有一步操作才能的到真正的key。

NSString *_key = [getTime hmacSha1:[getTime

getPublicKey:areaid :type :date :appid] :private_key];

NSString *key =

[getTime

stringByEncodingURLFormat:_key];

最后一步了吧!拼接API

NSString *weatherAPI = [getTime getAPI:areaid :type :date

:appid

:key];

//OK,我们的API就可以用啦。

最后,通过API返回的值是JSON文件,通过解析,就能得到我们想要的数据了,下面拿一个开发的接口举例

NSDictionary *weatherDic = [getTime

getWeatherDic:@""];

// weatherDic字典中存放的数据也是字典型,从它里面通过键值取值

NSDictionary

*weatherInfo = [weatherDic

objectForKey:@"weatherinfo"];

NSLog(@"今天是 %@ %@ %@ 的天气状况是:%@ %@ -

%@",[newDateOne substringWithRange:NSMakeRange(0, 4)],[newDateOne

substringWithRange:NSMakeRange(4, 2)] ,[newDateOne

substringWithRange:NSMakeRange(6, 2)],[weatherInfo

objectForKey:@"weather"],[weatherInfo objectForKey:@"temp1"],[weatherInfo

objectForKey:@"temp2"]);

输出2014-09-04 23:40:23.243

WeatherAPP[5688:201108] 今天是 2014-09-04 的天气状况是:晴 17℃ - 30℃

weatherInfo字典里面的内容是---{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"17℃","temp2":"30℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}

墨迹天气开发了一个不成功的功能

墨迹天气开发了一个不成功的功能叫“倒数日”。

墨迹天气,一款天气信息查询软件,人性化设计,使用简单,是中国支持城市最多的天气预报软件。全球约5亿人在使用的天气APP,支持196个国家70多万个城市及地区的天气查询,精准定位及时推送,分钟级、公里级天气预报,实时监测阴晴雨雪。

提供15天天气预报,5天空气质量预报,实时空气质量及空气质量等级预报。特殊天气提前发送预警信息,帮助用户更好做出生活决策,从容应对各类天气状况。

北京墨迹风云科技股份有限公司于2010年成立,是一家以“极致、责任、创新”为公司理念,以“做最卓越的天气服务公司”为目标的新兴移动互联网公司。

墨迹天气2018年已覆盖Symbian、Android、iOS、Windows、Winphone、HarmonyOS等平台。经过发展,墨迹天气已拥有过7亿用户  ,天气日查询次数过亿,是全球下载量第一的天气类应用。

2014年,发布家用空气检测设备“空气果”,结合软硬件提供智能家居体验,在市场上得到很好的口碑及社会影响。2015年12月,基于上空气果一代的优势,迭代推出空气果1S,让空气清新看得见。2016年,创造性地提出“天气+”概念,以气象大数据为基础,以天气作为入口,提供给用户更多生活化、场景化的服务。

天气预报App开发如何增加用户粘性

视觉上的和内容上的。

如果只是一个简单的天气预报APP当然很难做到增加用户粘性。但是如果是从视觉上和内容上去思考的话还是有很大的空间的。

视觉,比如UI,看过很多app的UI。但是大致基本上都是一样的。UI是增强视觉体验的一个突破口,当然还有其他增加视觉体验的方法。比如页面互动,多窗口的页面会让用户想去互动,当然其他页面需要有内容才行。所以下面讲下内容。

内容,当然是以地方为主,作为一名北京用户肯定不是很想知道广东地区的雨有多大。需不需要带伞。相应地区的新闻或者是内容有是一个很大的方向,比如新闻,比如图片,壁纸什么的。让用户觉得你在为这个地区用心,让用户觉得这个app是属于这个地区的。

以上只是两个方面。很多可以拓展的地方

公共平台没开发怎样可以有天气预报

在这篇教程中,我们将介绍如何在微信公众平台上开发天气预报功能。我们将使用中国天气网的气象数据接口来获取天气信息。

这篇教程将介绍以下内容

获取中国天气网的气象数据

在微信公众平台中回复天气

一、中国天气网

中国天气网提供了丰富的气象数据接口。下面我们介绍主要的几个

国家根节点接口

该接口以XML格式列出所有的省(自治区、直辖市)的中文名称(quName)和拼音名称(pyName)及省会城市的天气信息,其中广东的数据如下

city quName="广东" pyName="guangdong" cityname="广州" state1="2" state2="7" stateDetailed="阴转小雨" tem1="8" tem2="15" windState="微风"/

该接口的主要功能是通过它获取省级节点的拼音名称。以广东为例其pyName是“Guangdong”。

省级节点接口(以广东为例)

该接口以XML格式列出当前省下辖所有市的中文名称(quName)、拼音名称(pyName)、中心坐标、天气信息以及城市编码。其中深圳的数据如下所示

city cityX="409" cityY="257" cityname="深圳" centername="深圳" fontColor="FFFFFF" pyName="shenzhen" state1="1" state2="1" stateDetailed="多云" tem1="12" tem2="18" temNow="12" windState="微风" windDir="东北风" windPower="1级" humidity="74%" time="21:15" url="101280601"/

在这个接口中主要获取城市名称及相应的城市编码。例如,深圳的城市编码为101280601。可以编写程序将全国城市拓扑结构采集下来。也可以使用方倍工作室已经采集好的,点击这里下载。

实时天气数据(以深圳为例)

该接口以JSON格式列出当前城市的实时天气状况。如下所示

{

"weatherinfo": {

"city": "深圳",

"cityid": "101280601",

"temp": "12",

"WD": "东北风",

"WS": "1级",

"SD": "75%",

"WSE": "1",

"time": "21:20",

"isRadar": "1",

"Radar": "JC_RADAR_AZ9755_JB"

}

}

实时天气数据参数说明下所示

六日天气数据(以深圳为例)

该接口以JSON格式列出当前城市的六日天气状况。如下所示

{

"weatherinfo": {

"city": "深圳",

"city_en": "shenzhen",

"date_y": "2014年2月15日",

"date": "",

"week": "星期六",

"fchh": "18",

"cityid": "101280601",

"temp1": "12℃~18℃",

"temp2": "16℃~21℃",

"temp3": "17℃~23℃",

"temp4": "11℃~18℃",

"temp5": "10℃~15℃",

"temp6": "12℃~17℃",

"tempF1": "53.6℉~64.4℉",

"tempF2": "60.8℉~69.8℉",

"tempF3": "62.6℉~73.4℉",

"tempF4": "51.8℉~64.4℉",

"tempF5": "50℉~59℉",

"tempF6": "53.6℉~62.6℉",

"weather1": "多云",

"weather2": "阴",

"weather3": "多云",

"weather4": "中雨",

"weather5": "多云",

"weather6": "阴",

"img1": "1",

"img2": "99",

"img3": "2",

"img4": "99",

"img5": "1",

"img6": "99",

"img7": "8",

"img8": "99",

"img9": "1",

"img10": "99",

"img11": "2",

"img12": "99",

"img_single": "1",

"img_title1": "多云",

"img_title2": "多云",

"img_title3": "阴",

"img_title4": "阴",

"img_title5": "多云",

"img_title6": "多云",

"img_title7": "中雨",

"img_title8": "中雨",

"img_title9": "多云",

"img_title10": "多云",

"img_title11": "阴",

"img_title12": "阴",

"img_title_single": "多云",

"wind1": "微风",

"wind2": "微风",

"wind3": "微风",

"wind4": "东北风3-4级",

"wind5": "微风",

"wind6": "微风",

"fx1": "微风",

"fx2": "微风",

"fl1": "小于3级",

"fl2": "小于3级",

"fl3": "小于3级",

"fl4": "3-4级",

"fl5": "小于3级",

"fl6": "小于3级",

"index": "较舒适",

"index_d": "建议着薄外套、开衫牛仔衫裤等服装。年老体弱者应适当添加衣物,宜着夹克衫、薄毛衣等。",

"index48": "较舒适",

"index48_d": "建议着薄外套、开衫牛仔衫裤等服装。年老体弱者应适当添加衣物,宜着夹克衫、薄毛衣等。",

"index_uv": "最弱",

"index48_uv": "最弱",

"index_xc": "适宜",

"index_tr": "适宜",

"index_co": "舒适",

"st1": "19",

"st2": "13",

"st3": "23",

"st4": "16",

"st5": "24",

"st6": "18",

"index_cl": "适宜",

"index_ls": "适宜",

"index_ag": "不易发"

}

}

未来六日天气数据主要参数说明如下表所示

以上接口是我们做天气预报功能将使用到的接口。

二、微信公众平台开发

1. 需要将城市编码对照表导入到数据库中,以下是SAE导入后截图

2. 将城市名转为城市代码的方法,这将在用户发送城市名的时候调用

1 function fromNameToCode($name)

2 {

3 $mysql_host = SAE_MYSQL_HOST_M;

4 $mysql_host_s = SAE_MYSQL_HOST_S;

5 $mysql_port = SAE_MYSQL_PORT;

6 $mysql_user = SAE_MYSQL_USER;

7 $mysql_password = SAE_MYSQL_PASS;

8 $mysql_database = SAE_MYSQL_DB;

9

10 $mysql_table = "weather";

11 $mysql_state = "SELECT * FROM ".$mysql_table." WHERE `cityName` = '".$name."'";

12

13 $con = mysql_connect($mysql_host.':'.$mysql_port, $mysql_user, $mysql_password, true);

14 if (!$con){

15 die('Could not connect: ' . mysql_error());

16 }

17 mysql_query("SET NAMES 'UTF8'");

18 mysql_select_db($mysql_database, $con);

19 $result = mysql_query($mysql_state);

20 $cityCode = "";

21 while($row = mysql_fetch_array($result))

22 {

23 $cityCode = $row['cityCode'];

24 break;

25 }

26 mysql_close($con);

27 return $cityCode;

28 }

3. 编写接口调用函数,用于向天气网发送cURL请求,获取数据

1 function httpRequest($url)

2 {

3 $ch = curl_init();

4 curl_setopt($ch, CURLOPT_URL, $url);

5 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

6 $output = curl_exec($ch);

7 curl_close($ch);

8 if ($output === FALSE){

9 return "cURL Error: ". curl_error($ch);

10 }

11 return $output;

12 }

4. 编写获取天气数据的函数,这里获取实时天气和未来3日天气,并将返回结果封装成图文信息的数组

1 function getWeatherInfo($cityName)

2 {

3 $cityCode = fromNameToCode($cityName);

4

5 if ($cityCode == "")

6 {

7 return "错误的城市名或者此城市不在数据库中!";

8 }

9

10 //获取实时天气

11 $url = "".$cityCode.".html";

12 $output = httpRequest($url);

13 $weather = json_decode($output, true);

14 $info = $weather['weatherinfo'];

15

16 $weatherArray = array();

17 $weatherArray[] = array("Title"=$info['city']."天气预报", "Description"="", "PicUrl"="", "Url" ="");

18 if ((int)$cityCode 101340000){

19 $result = "实况 温度".$info['temp']."℃ 湿度".$info['SD']." 风速".$info['WD'].$info['WSE']."级";

20 $weatherArray[] = array("Title"=str_replace("%", "﹪", $result), "Description"="", "PicUrl"="", "Url" ="");

21 }

22

23 //获取六日天气

24 $url = "".$cityCode.".html";

25 $output = httpRequest($url);

26 $weather = json_decode($output, true);

27 $info = $weather['weatherinfo'];

28

29 if (!empty($info['index_d'])){

30 $weatherArray[] = array("Title" =$info['index_d'], "Description" ="", "PicUrl" ="", "Url" ="");

31 }

32

33 $weekArray = array("日","一","二","三","四","五","六");

34 $maxlength = 3;

35 for ($i = 1; $i = $maxlength; $i++) {

36 $offset = strtotime("+".($i-1)." day");

37 $subTitle = date("m月d日",$offset)." 周".$weekArray[date('w',$offset)]." ".$info['temp'.$i]." ".$info['weather'.$i]." ".$info['wind'.$i];

38 $weatherArray[] = array("Title" =$subTitle, "Description" ="", "PicUrl" =""."d".sprintf("%02u",$info['img'.(($i *2)-1)]).".jpg", "Url" ="");

39 }

40

41 return $weatherArray;

42 }

5. 在微信公众平台接口函数中处理收到的文本消息时,文本将为城市名,直接调用获取天气的函数

1 /*

2 方倍工作室

3 CopyRight 2013 All Rights Reserved

4 */

5

6 define("TOKEN", "weixin");

7

8 $wechatObj = new wechatCallbackapiTest();

9 if (!isset($_GET['echostr'])) {

10 $wechatObj-responseMsg();

11 }else{

12 $wechatObj-valid();

13 }

14

15 class wechatCallbackapiTest

16 {

17 public function valid()

18 {

19 $echoStr = $_GET["echostr"];

20 if($this-checkSignature()){

21 echo $echoStr;

22 exit;

23 }

24 }

25

26 private function checkSignature()

27 {

28 $signature = $_GET["signature"];

29 $timestamp = $_GET["timestamp"];

30 $nonce = $_GET["nonce"];

31 $token = TOKEN;

32 $tmpArr = array($token, $timestamp, $nonce);

33 sort($tmpArr);

34 $tmpStr = implode($tmpArr);

35 $tmpStr = sha1($tmpStr);

36

37 if($tmpStr == $signature){

38 return true;

39 }else{

40 return false;

41 }

42 }

43

44 public function responseMsg()

45 {

46 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

47 if (!empty($postStr)){

48 $this-logger("R ".$postStr);

49 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

50 $RX_TYPE = trim($postObj-MsgType);

51

52 switch ($RX_TYPE)

53 {

54 case "event":

55 $result = $this-receiveEvent($postObj);

56 break;

57 case "text":

58 $result = $this-receiveText($postObj);

59 break;

60 }

61 $this-logger("T ".$result);

62 echo $result;

63 }else {

64 echo "";

65 exit;

66 }

67 }

68

69 private function receiveEvent($object)

70 {

71 $content = "";

72 switch ($object-Event)

73 {

74 case "subscribe":

75 $content = "欢迎关注方倍工作室 ";

76 break;

77 case "unsubscribe":

78 $content = "取消关注";

79 break;

80 }

81 $result = $this-transmitText($object, $content);

82 return $result;

83 }

84

85 private function receiveText($object)

86 {

87 $keyword = trim($object-Content);

88

89 include("weather.php");

90 $content = getWeatherInfo($keyword);

天气预报开发的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于天气预报开发者哪里最准确、天气预报开发的信息别忘了在本站进行查找喔。