搜尋
首頁php教程php手册基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

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

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

这里补充一下,server的参数不是server_addr而是REMOTE_ADDR,只有这样才能取到用户的真是地址,这样的话就不用麻烦的取另外处理

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_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 OrgNetIpLocation('UTFWry.dat'); // 实例化类 参数表示IP地址库文件
		//可以同时放ip和域名
		$area = $Ip->getlocation($host_ip); // 获取域名服务器所在的位置
		$city_allname=$area['country'];
		$sim_cityname=explode(市,explode(省, $city_allname)[1])[0];
		return $sim_cityname;
	}


 



陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
华为GT3 Pro和GT4的差异是什么?华为GT3 Pro和GT4的差异是什么?Dec 29, 2023 pm 02:27 PM

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

修复:截图工具在 Windows 11 中不起作用修复:截图工具在 Windows 11 中不起作用Aug 24, 2023 am 09:48 AM

为什么截图工具在Windows11上不起作用了解问题的根本原因有助于找到正确的解决方案。以下是截图工具可能无法正常工作的主要原因:对焦助手已打开:这可以防止截图工具打开。应用程序损坏:如果截图工具在启动时崩溃,则可能已损坏。过时的图形驱动程序:不兼容的驱动程序可能会干扰截图工具。来自其他应用程序的干扰:其他正在运行的应用程序可能与截图工具冲突。证书已过期:升级过程中的错误可能会导致此issu简单的解决方案这些适合大多数用户,不需要任何特殊的技术知识。1.更新窗口和Microsoft应用商店应用程

如何修复无法连接到iPhone上的App Store错误如何修复无法连接到iPhone上的App Store错误Jul 29, 2023 am 08:22 AM

第1部分:初始故障排除步骤检查苹果的系统状态:在深入研究复杂的解决方案之前,让我们从基础知识开始。问题可能不在于您的设备;苹果的服务器可能会关闭。访问Apple的系统状态页面,查看AppStore是否正常工作。如果有问题,您所能做的就是等待Apple修复它。检查您的互联网连接:确保您拥有稳定的互联网连接,因为“无法连接到AppStore”问题有时可归因于连接不良。尝试在Wi-Fi和移动数据之间切换或重置网络设置(“常规”>“重置”>“重置网络设置”>设置)。更新您的iOS版本:

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code<form name="myform"

watch4pro好还是gt好watch4pro好还是gt好Sep 26, 2023 pm 02:45 PM

watch4pro和gt各自具有不用的特点和适用场景,如果注重功能的全面性、高性能和时尚外观,同时愿意承担较高的价格,那么Watch 4 Pro可能更适合。如果对功能要求不高,更注重电池续航和价格的合理性,那么GT系列可能更适合。最终的选择应根据个人需求、预算和喜好来决定,建议在购买前仔细考虑自己的需求,并参考各种产品的评测和比较,以做出更明智的选择。

如何使用 iPadOS 17.4 优化 iPad 电池寿命如何使用 iPadOS 17.4 优化 iPad 电池寿命Mar 21, 2024 pm 10:31 PM

如何使用iPadOS17.4优化iPad电池寿命延长电池续航时间是移动设备体验的关键,iPad是一个很好的例子。如果您觉得iPad电池消耗速度过快,不用担心,在iPadOS17.4中有许多技巧和调整可以显著延长设备的运行时间。本深入指南的目标不仅仅是提供信息,而是改变您使用iPad的方式,增强您的整体电池管理,并确保您可以在无需充电的情况下更长时间地依赖您的设备。通过采用此处概述的做法,您朝着更高效、更谨慎地使用技术迈出了一步,这些技术是根据您的个人需求和使用模式量身定制的。识别主要的能量消耗者

管泽元江疏影体验华为 MateBook GT 14:技术艺术完美结合管泽元江疏影体验华为 MateBook GT 14:技术艺术完美结合Aug 10, 2024 pm 09:51 PM

8月8日,华为终端官方开启华为MateBookGT14"超能星光秀"。知名演员江疏影和英雄联盟职业联赛官方解说管泽元作客直播间,亲自体验华为MateBookGT14这款最新的华为笔记本。直播中,江疏影和管泽元对华为MateBookGT14赞不绝口。CNMO注意到,直播中,江疏影、管泽元与华为PC产品线总裁一同见证了华为MateBookGT14的拆解。可以看到,华为MateBookGT14内部设计非常工整,而且采用了高密度的主板设计,主板还进行了部分下沉,与键盘拉开了距离。这一

thinkphp5如何关闭info信息输出thinkphp5如何关闭info信息输出Jun 03, 2023 am 11:49 AM

一、info的作用在开始关闭info之前,我们需要了解一下它的作用。在ThinkPHP5框架中,info信息输出主要有三种形式:展示当前访问的URL和请求参数在页面底部展示当前页面的SQL语句执行情况和运行时间等调试信息在执行错误时,输出详细的错误信息,方便调试虽然看起来很有用,但对于真正的开发者而言,大多数的info信息并不是非常有帮助的。通常,我们需要的是一些更简洁的输出,以便更好地专注于开发。二、关闭info关闭info很简单,只需要在配置

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境