php定位和天气,基于thinkphp实现依据用户ip判断地理位置并提供对应天气信息的应用...
基于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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 家中充电宝一夜忘拔 监控拍下爆燃画面:火
- 下一篇: 苹果cms主动推送php,飞飞cms、海