php定位和天气,基于thinkphp实现依据用户ip判断地理位置并提供对应天气信息的应用...

基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

我们都知道,在很多的网站都提供了给用户提供天气预报的功能,有时会发现,用户即使不输入任何和自己有关的地理位置信息,同样的网站也可以去判断地理位置并且显示天气信息,我们可能会想到用ip去判断地理位置,的确是这样,但是,如果想自己一样完全的开发,确实有一点麻烦,所以这里简单的说一下这个应用的业务逻辑(以用户第一次打开页面为起点):

1:获取ip:ip按照我自己的说法有两种,一种是独立ip,真实存在,另一种是路由器分配的ip,这个当然不具有某种意义上的唯一性,这两种ip当然都要考虑,第一种非常容易或得,取$_SERVER内的元素值就可以,但问题是第二种,像192.168.1.1这样的是无法判断的,那么就没法处理或得用户的位置信息,这里本来采用curl的扩展来抓取的,但是这个扩展说什么就是无法使用,所以这种情况先放在一边,仅考虑用户使用独立ip访问的情况。

2:当我们获取ip之后就应该根据ip地址库去查找用户的ip所在地,这里有两个地方需要注意,1:ip地址库必须为utf-8编码,2:或得的信息是一个完整的地址信息,而后面需要城市名称局可以,所以,要做一下字符串的截取,或得简化城市地址。

3:当或得了用户的地址显然还是不行,想想,最终于天气接口对接获取数据的是城市代码,这两个还是要转化一下,这里我采用了暴力的办法遍历城市代码库或得该城市的代码。

4:获取到城市的代码之后,就要去连接数据接口获取数据,这个数据时json数据,需要json_encode()转码,我这里或得的是一个对象,有的接口不一样,具体情况具体分析,然后,最重要的就是分配这些数据,说是这些,其实就是这个对象,后来发现没有逐个分配是正确的,这样有利于代码的移植。

5:在视图去调用模板分配的数据,相信这个都会。

6:其实上面的步骤已经把第一次打开页面的整个业务逻辑给处理完了,还有一个就是我在视图给用户提供了输入城市名查询城市天气的功能,这样按顺序的分析一下,正常的获取用户的输入信息就是城市名

7:这里就已经或得了城市名,直接参与获取城市代码的遍历就可以了,这里有个非常重要的逻辑问题就是先后顺序和如何判断才能够把这两个功能很好的结合在一块,一定是:

先判断是否系统自动获取城市名称是否为空,如果不为空只城市名就是或得的名字,反之,就提示ip地址没有查询到对应地址信息,紧接着,注意一定是紧接着下面,是顺序结构,判断用户的输入是否为空,如果不为空,那么就让城市名为用户输入,总而言之就是用户的输入权限一定要大于系统自动获取的权限,这样就可以完整的把两个代码结合在一起,另外,我是把获取ip和取出城市名分别做成了两个方法。

上面写的比较乱,这样的话,下面是我的部分实例代码,因安全版权各方面原因,数据接口我做了处理不可以使用,仅提供方法参考,粘贴无用,自主研究。

视图weather_test.html:

天气预报即时天气信息

城市{$all_info->forecast->city}

基本天气{$all_info->realtime->weather}

温度{$all_info->realtime->temp}

风向{$all_info->realtime->WD}

更新时间{$all_info->realtime->time}生活建议

城市{$all_info->forecast->city}

防嗮建议{$all_info->index[0]->details}

穿衣建议{$all_info->index[1]->details}

运动建议{$all_info->index[2]->details}

洗车建议{$all_info->index[3]->details}

晾晒建议{$all_info->index[4]->details}

更新时间{$all_info->realtime->time}未来四天天气信息  城市: {$all_info->forecast->city}

项目/日期今天明天后天大后天

概况{$all_info->forecast->weather1}{$all_info->forecast->weather2}{$all_info->forecast->weather3}{$all_info->forecast->weather4}

温度{$all_info->forecast->temp1}{$all_info->forecast->temp2}{$all_info->forecast->temp3}{$all_info->forecast->temp4}

风向{$all_info->forecast->wind1}{$all_info->forecast->wind2}{$all_info->forecast->wind3}{$all_info->forecast->wind4}

风力{$all_info->forecast->fl1}{$all_info->forecast->fl2}{$all_info->forecast->fl3}{$all_info->forecast->fl4}今日空气质量状况

城市{$all_info->forecast->city}

PM2.5{$all_info->aqi->pm25}

PM10{$all_info->aqi->pm10}

SO2{$all_info->aqi->so2}

NO2{$all_info->aqi->no2}

更新时间{$all_info->aqi->pub_time}类方法:

public function weather_test(){require_once './Component/Citycode.php';//这里是根据客户端的ip判断地理位置//定义两个标志变量$count=0;$city_id='101120301';//默认大淄博$city_name_cin=$_POST['cityname'];$city_sim_name=R('Test/get_user_cityname');//这是系统根据ip自动判断的位置echo $city_sim_name;if($city_sim_name!=null){$city_name_cin=$city_sim_name;}//这是用户输入的位置if(!empty($_POST['cityname'])){//放置信息覆盖$city_name_cin=$_POST['cityname'];}不管是ip定位还是用户输入最终需要遍历获取城市代码的变量只要$city_name_cinforeach ($citycode as $key => $value){if($key==$city_name_cin){$city_id=$citycode[$city_name_cin];$count++;}}if($count==0){echo "对不起,您输入的地址没有找到!默认淄博哦";}else{echo $city_name_cin."的天气信息如下";}//接口已经处理,请勿使用,仅供学习$weather_interface_url="http://weatherai.markt.xiaomi.com/wtr-v2/weather?cityId=".$city_id."&mei=e32c88633283737f5d9f381d47&device=HM2013023&miuiVersion=JHBCNBD16.0&modDevice=ce=miuiWeatherAp";$all_weather_info = json_decode(file_get_contents($weather_interface_url));//分配数据$this->assign("all_info",$all_weather_info);$this->display();}* * 下面两个分别是获取主机ip和ip所在地的两个 * 方法,最后的结果数值通过R方法,返回获取 *///方法1:获取用户ippublic function get_user_ip(){//先通过这种简单的方法获取主机的ip,通过R方法获取$host_ip=$_SERVER['SERVER_ADDR'];return $host_ip;}//方法2:获取地名public function get_user_cityname(){//得到用户的ip$host_ip=R('Test/get_user_ip');//这里ip地址库必须这样实例化$Ip = new \Org\Net\IpLocation('UTFWry.dat'); // 实例化类 参数表示IP地址库文件//可以同时放ip和域名$area = $Ip->getlocation($host_ip); // 获取域名服务器所在的位置$city_allname=$area['country'];$sim_cityname=explode("市",explode("省", $city_allname)[1])[0];return $sim_cityname;}

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

47d507a036d4dd65488c445c0974b649.png

立即提交

专题推荐064df72cb40df78e80e61b7041ee044f.png独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

7dafe36c040e31d783922649aefe0be1.png玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

04246fdfe8958426b043c89ded0857f1.png天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值