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:

天气预报

*{

margin: 0px;

padding: 0px;

}

即时天气信息
城市{$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_cin

foreach ($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:获取用户ip

public 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;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php配置问题汇总

前两天开始跟进PHP;我觉得,PHP的环境配置远比其他语言的要复杂很多。我所说的“其他语言”,包括Java,Oracle,scala,Python等。到现在PHP的环境被搭好,因为是全手动的配置,我完完整整…

Orchard Core 1.0.0 正式发布!

James: Orchard 最早是微软的员工创造的开源项目,使用的技术架构可以说是非常优秀,源码值得学习。功能也非常强大,支持模块化、多租户、工作流等等功能,可以说是 .NET 世界的 WordPress。一开始是.NET Framework 的,在…

[方法“Boolean Contains(System.Guid)”不支持转换为 SQL]的解决办法

Guid ClsID newGuid("d4ee9c52-8d68-4f33-9485-0926281c78ac");IList<Guid>Ids WebProduct.GetAllChildByID(ClsID);var query db.T_Products.Where(p >Ids.Contains((Guid)p.F_ClsID));//这一句编译时无错&#xff0c;但是一执行&#xff0c;就报错出错信息…

解决IE为7939.com的病毒~

病毒名称&#xff1a;“诡秘下载器”变种CXW&#xff08;Trojan.DL.Delf.cxw&#xff09;病毒类型&#xff1a;流氓软件病毒危害级别&#xff1a;★★★☆该病毒运行后会从***指定的网站下载指令并运行&#xff0c;会将用户IE浏览器的主页锁定为一个名叫“7939上网导航”的网站…

这哥们到底是应聘的还是来收购公司的?| 今日趣图

全世界只有3.14 % 的人关注了青少年数学之旅图源网络&#xff0c;侵权删

java web 测试类,构建一个容易单元测试的java–web系统-JSP教程,Java技巧及代码

最近在做一个项目,我们使用的是一些看似很标准的web结构,dao(数据访问)helper(处理业务操作)action(调用helper层)struts的控制系统,页面使用struts标签和部分自定义标签完成显示.进入测试阶段后1,dao测试–junit的确非常不错,我们使用eclipsejunit.jar,很满意的完成了这部分检…

Abp太重了?轻量化Abp框架

本文首发于个人博客&#xff08;https://blog.zhangchi.fun/&#xff09;在进行框架的选型时&#xff0c;经常会听到“***框架太重了”之类的声音&#xff0c;比如“Abp太重了&#xff0c;不适合我们...”。事实上&#xff0c;Abp框架真的很重吗&#xff1f;框架的“轻”和“重…

js跳转页面方法

<span id"tiao">3</span><a href"javascript:countDown"></a>布丁足迹;秒后自动跳转……<meta http-equivrefresh content3;url/search/billsearch.jsp</ul><!--脚本开始--> <script language"javascript&…

使用Treeview模拟操作系统的文件系统

default.aspx 代码&#xff1a;<% Page language"c#" Codebehind"default.aspx.cs" AutoEventWireup"false" Inherits"OsFilesytem._default" %><% Register TagPrefix"iewc" Namespace"Microsoft.Web.UI.Web…

matlab怎么绘制曲线,如何在Matlab中绘制曲线

您需要定义要绘制的中间点.然后您可以手动定义它们,也可以查看样条插值.使用样条插值时,只需要一个中间点即可确定完整曲线.在MATLAB中,你可以找到类似这样的演示spline2d.以下是它的要点&#xff1a;% end pointsX [0 1];Y [0 0];% intermediate point (you have to choose …

MapReduce经典案例——统计单词数

资源文件file.txthello hadoophello wordthis is my first hadoop program分析&#xff1a;一个文档中每行的单词通过空格分割后获取&#xff0c;经过map阶段可以将所有的单词整理成如下形式&#xff1a;key:hello value:1key:hadoop value:1key:hello value:1key:word value:1…

六月赞歌

七月的脚步离我们近了&#xff0c;在六月即将过去的时候我是有些话想说的。今年的6月过得很充实&#xff0c;虽谈不上硕果累累&#xff0c;但至于还是收获颇丰。在这最想提的是生活杂谈小组在几位组长们的激情带动&#xff0c;各组员的热情参与下&#xff0c;站到了小组排行榜的…

避不开的分布式事务

前言关于前面系列的文章已经说到分布式服务之间的通信&#xff0c;则分布式事务接下来就是我们要一起学习的主题&#xff0c;走起。数据库事务在现有大大小小的系统中几乎是避免不开的&#xff0c;或多或少总会有一些业务关联在一块&#xff1b;对于单机事务的应用场景和操作&a…

matlab如何求矩阵的转置矩阵,怎么用MATLAB程序求转置矩阵?急需,高手帮忙………………...

在Matlab下输入&#xff1a;edit&#xff0c;然后将下面两行百分号之间的内容&#xff0c;复制进去&#xff0c;保存%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function ff31(x)f1./[(x-2).^20.1]1./[(x-3).^40.01];%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 返…

任正非一语中的,未来科技的发展核心靠他们!

▲ 点击查看今年6月&#xff0c;华为的任正非接受媒体的采访&#xff0c;多次谈及基础教育&#xff0c;不禁流下了英雄泪&#xff0c;谈话中&#xff0c;曾27次提到了数学&#xff0c;并且表示等自己退休后要找一个好大学&#xff0c;好好地学一学数学。他还谈到了数学对于华…

Windows 2003下×××服务器架设攻略

原文地址[url]http://bbs.51cto.com/thread-49347-1-1.html[/url]Windows 2003下服务器架设攻略笔者有不少朋友因为工作关系常常移动办公&#xff0c;因此资料的传递、与公司信息的及时交流或是累了想在异地打开公司或家里的电脑看看电影等等应用显得很头疼。这方面的应用也就是…

***测试工具

Firefox是一个出自Mozilla组织的流行的web浏览器。Firefox的流行并不仅仅是因为它是一个好的浏览器&#xff0c;而是因为它能够支持插件进而加强它自身的功能。Mozilla有一个插件站点&#xff0c;在那里面有成千上万的&#xff0c;非常有用的&#xff0c;不同种类的插件。一些插…

微软出手,蚕食JetBrains系市场?

文 | Travis出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;近日微软公布了针对 Java 编程语言的 Visual Studio Code 更新路线图&#xff0c;根据路线图的计划&#xff0c;微软将在开发体验、安全、远程开发等方面做出改善。这个更新路线图涵盖了 2021 …

博客园电子月刊第三期出炉

关于月刊&#xff1a; 您是否错过精彩的文章&#xff1f;您是否想要权威的资料&#xff1f;您是否需要系统的总结&#xff1f;在本期博客园月刊中&#xff0c;您可以找到这个月博客园整理性的资料。 博客园电子期刊已经发布3期了&#xff0c;目前已经有1000多位用户订阅博客园月…

我思故我在---

好久没有写东西了&#xff0c;自己自诩为有文采&#xff0c;有个性&#xff0c;靠&#xff0c;全是瞎蒙的。没有任何意义。如果你只能用过去的成绩来骗自己的话&#xff0c;那么你的生活一定很糟糕&#xff1a;快乐\成功都是过去时&#xff0c;而不是现在时。这样怎么可能是个上…