日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

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

發(fā)布時(shí)間:2023/12/4 php 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php定位和天气,基于thinkphp实现依据用户ip判断地理位置并提供对应天气信息的应用... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于thinkphp實(shí)現(xiàn)根據(jù)用戶ip判斷地理位置并提供對(duì)應(yīng)天氣信息的應(yīng)用

我們都知道,在很多的網(wǎng)站都提供了給用戶提供天氣預(yù)報(bào)的功能,有時(shí)會(huì)發(fā)現(xiàn),用戶即使不輸入任何和自己有關(guān)的地理位置信息,同樣的網(wǎng)站也可以去判斷地理位置并且顯示天氣信息,我們可能會(huì)想到用ip去判斷地理位置,的確是這樣,但是,如果想自己一樣完全的開發(fā),確實(shí)有一點(diǎn)麻煩,所以這里簡單的說一下這個(gè)應(yīng)用的業(yè)務(wù)邏輯(以用戶第一次打開頁面為起點(diǎn)):

1:獲取ip:ip按照我自己的說法有兩種,一種是獨(dú)立ip,真實(shí)存在,另一種是路由器分配的ip,這個(gè)當(dāng)然不具有某種意義上的唯一性,這兩種ip當(dāng)然都要考慮,第一種非常容易或得,取$_SERVER內(nèi)的元素值就可以,但問題是第二種,像192.168.1.1這樣的是無法判斷的,那么就沒法處理或得用戶的位置信息,這里本來采用curl的擴(kuò)展來抓取的,但是這個(gè)擴(kuò)展說什么就是無法使用,所以這種情況先放在一邊,僅考慮用戶使用獨(dú)立ip訪問的情況。

2:當(dāng)我們獲取ip之后就應(yīng)該根據(jù)ip地址庫去查找用戶的ip所在地,這里有兩個(gè)地方需要注意,1:ip地址庫必須為utf-8編碼,2:或得的信息是一個(gè)完整的地址信息,而后面需要城市名稱局可以,所以,要做一下字符串的截取,或得簡化城市地址。

3:當(dāng)或得了用戶的地址顯然還是不行,想想,最終于天氣接口對(duì)接獲取數(shù)據(jù)的是城市代碼,這兩個(gè)還是要轉(zhuǎn)化一下,這里我采用了暴力的辦法遍歷城市代碼庫或得該城市的代碼。

4:獲取到城市的代碼之后,就要去連接數(shù)據(jù)接口獲取數(shù)據(jù),這個(gè)數(shù)據(jù)時(shí)json數(shù)據(jù),需要json_encode()轉(zhuǎn)碼,我這里或得的是一個(gè)對(duì)象,有的接口不一樣,具體情況具體分析,然后,最重要的就是分配這些數(shù)據(jù),說是這些,其實(shí)就是這個(gè)對(duì)象,后來發(fā)現(xiàn)沒有逐個(gè)分配是正確的,這樣有利于代碼的移植。

5:在視圖去調(diào)用模板分配的數(shù)據(jù),相信這個(gè)都會(huì)。

6:其實(shí)上面的步驟已經(jīng)把第一次打開頁面的整個(gè)業(yè)務(wù)邏輯給處理完了,還有一個(gè)就是我在視圖給用戶提供了輸入城市名查詢城市天氣的功能,這樣按順序的分析一下,正常的獲取用戶的輸入信息就是城市名

7:這里就已經(jīng)或得了城市名,直接參與獲取城市代碼的遍歷就可以了,這里有個(gè)非常重要的邏輯問題就是先后順序和如何判斷才能夠把這兩個(gè)功能很好的結(jié)合在一塊,一定是:

先判斷是否系統(tǒng)自動(dòng)獲取城市名稱是否為空,如果不為空只城市名就是或得的名字,反之,就提示ip地址沒有查詢到對(duì)應(yīng)地址信息,緊接著,注意一定是緊接著下面,是順序結(jié)構(gòu),判斷用戶的輸入是否為空,如果不為空,那么就讓城市名為用戶輸入,總而言之就是用戶的輸入權(quán)限一定要大于系統(tǒng)自動(dòng)獲取的權(quán)限,這樣就可以完整的把兩個(gè)代碼結(jié)合在一起,另外,我是把獲取ip和取出城市名分別做成了兩個(gè)方法。

上面寫的比較亂,這樣的話,下面是我的部分實(shí)例代碼,因安全版權(quán)各方面原因,數(shù)據(jù)接口我做了處理不可以使用,僅提供方法參考,粘貼無用,自主研究。

視圖weather_test.html:

天氣預(yù)報(bào)

*{

margin: 0px;

padding: 0px;

}

即時(shí)天氣信息
城市{$all_info->forecast->city}
基本天氣{$all_info->realtime->weather}
溫度{$all_info->realtime->temp}
風(fēng)向{$all_info->realtime->WD}
更新時(shí)間{$all_info->realtime->time}
生活建議
城市{$all_info->forecast->city}
防嗮建議{$all_info->index[0]->details}
穿衣建議{$all_info->index[1]->details}
運(yùn)動(dòng)建議{$all_info->index[2]->details}
洗車建議{$all_info->index[3]->details}
晾曬建議{$all_info->index[4]->details}
更新時(shí)間{$all_info->realtime->time}
未來四天天氣信息  城市: {$all_info->forecast->city}
項(xiàng)目/日期今天明天后天大后天
概況{$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}
風(fēng)向{$all_info->forecast->wind1}{$all_info->forecast->wind2}{$all_info->forecast->wind3}{$all_info->forecast->wind4}
風(fēng)力{$all_info->forecast->fl1}{$all_info->forecast->fl2}{$all_info->forecast->fl3}{$all_info->forecast->fl4}
今日空氣質(zhì)量狀況
城市{$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}
更新時(shí)間{$all_info->aqi->pub_time}

類方法:

public function weather_test(){

require_once './Component/Citycode.php';

//這里是根據(jù)客戶端的ip判斷地理位置

//定義兩個(gè)標(biāo)志變量

$count=0;

$city_id='101120301';//默認(rèn)大淄博

$city_name_cin=$_POST['cityname'];

$city_sim_name=R('Test/get_user_cityname');

//這是系統(tǒng)根據(jù)ip自動(dòng)判斷的位置

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 "對(duì)不起,您輸入的地址沒有找到!默認(rèn)淄博哦";

}else{

echo $city_name_cin."的天氣信息如下";

}

//接口已經(jīng)處理,請(qǐng)勿使用,僅供學(xué)習(xí)

$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));

//分配數(shù)據(jù)

$this->assign("all_info",$all_weather_info);

$this->display();

}

///

/*

* 下面兩個(gè)分別是獲取主機(jī)ip和ip所在地的兩個(gè)

* 方法,最后的結(jié)果數(shù)值通過R方法,返回獲取

*/

//方法1:獲取用戶ip

public function get_user_ip(){

//先通過這種簡單的方法獲取主機(jī)的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地址庫必須這樣實(shí)例化

$Ip = new \Org\Net\IpLocation('UTFWry.dat'); // 實(shí)例化類 參數(shù)表示IP地址庫文件

//可以同時(shí)放ip和域名

$area = $Ip->getlocation($host_ip); // 獲取域名服務(wù)器所在的位置

$city_allname=$area['country'];

$sim_cityname=explode("市",explode("省", $city_allname)[1])[0];

return $sim_cityname;

}

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的php定位和天气,基于thinkphp实现依据用户ip判断地理位置并提供对应天气信息的应用...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。