ユーザーの IP に基づいて地理的位置を特定し、対応する天気情報を提供する thinkphp ベースのアプリケーション
多くの Web サイトがユーザーに天気予報を提供する機能を提供していることは誰もが知っています。当社に関連する地理的位置情報については、同じ Web サイトで地理的位置を特定し、地理的位置を特定するために IP を使用することも考えられます。自分で開発する場合は、確かに面倒な点が 1 つあります。そのため、このアプリケーションのビジネス ロジックについて簡単に説明します (ユーザーが初めてページを開いたときから始まります)。
1: IP を取得:私の言葉では、IP には 2 つのタイプがあり、1 つは実際に存在する独立した IP、もう 1 つはルーターによって割り当てられた IP です。もちろん、両方の IP を考慮する必要があります。 1 つ目は $_SERVER の要素の値を取得するのは簡単ですが、問題は 192.168.1.1 などを判断することができないため、ユーザーの位置を取得する方法がありません。情報を取得するために元々はcurl拡張子が使用されていましたが、この拡張子は何を意味するのでしょうか? 使用できないため、この状況は一旦脇に置き、ユーザーが独自のIPを使用してアクセスする状況のみを考慮します。
2: IP を取得したら、IP アドレス データベースに基づいてユーザーの IP の場所を見つける必要があります。ここで注意すべき点が 2 つあります。1: IP アドレス データベースは utf-8 でエンコードされている必要があります。 : または、情報は完全な住所情報であり、都市名局が後で必要になるため、文字列をインターセプトするか、都市の住所を簡略化する必要があります。
3: ユーザーの住所の取得は明らかに機能しません。考えてみてください。データを取得するために最終的に天気インターフェースに接続されるのは都市コードです。ここでは、まだ変換する必要があります。暴力的な方法を使って街を横断したり、街のコードを入手したりしました。
4: 都市コードを取得したら、データ インターフェイスに接続してデータを取得する必要があります。このデータは json データであり、ここで取得したものはオブジェクトである可能性があります。特定の状況が詳細に分析され、最も重要なのはこれらのデータが実際にこのオブジェクトであることが後で判明しました。これはコードの移植に役立ちます。
5: ビュー内のテンプレートで割り当てられたデータを呼び出す、これは可能だと思います。
6: 実際、上記の手順で、初めてページを開くビジネス ロジック全体がすでに処理されています。もう 1 つは、都市名を入力して都市をクエリする機能をユーザーに提供していることです。ユーザーの入力情報を取得する通常の方法は都市名です。
7: 都市名はすでに取得されているか、ここで直接トラバースに参加できます。都市コードを取得します。ここには非常に重要な論理的問題があります。これら 2 つの機能をうまく組み合わせることができる順序と方法は次のとおりです。
まず、システムが都市名を自動的に取得するかどうかを判断します。空でない場合は、都市名のみが取得されます。それ以外の場合は、IP アドレスが連続している直下にある必要があることに注意してください。構造体を使用して、ユーザーの入力が空かどうかを判断します。空でない場合は、都市名をユーザーの入力にします。つまり、ユーザーの入力権限は、システムによって自動的に取得される権限より大きい必要があります。さらに、IP を取得する方法と都市名を抽出する方法を 2 つ作成しました。
上記の記述は少し面倒です。この場合、以下はさまざまなセキュリティと著作権上の理由により、データ インターフェイスが処理されています。私によるものであり、メソッドのリファレンスのみを提供するため、貼り付けることは役に立たず、独自の研究を行うことはできません。
weather_test.html の表示:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset="><title>天气预报</title><style type="text/css"> *{ margin: 0px; padding: 0px; }</style></head><body><br><form action="{$smarty_const.__SELF__}" method="post"> <input type="text" name="cityname"> <input type="submit" value="更换城市"/></form> <table border="1px" style="margin-top: 20px;margin-left: 20px;"> <tr><td colspan="2">即时天气信息</td></tr> <tr style="border-spacing: 0px; padding: 0px;"> <td style="border-spacing: 0px; padding: 0px;">城市</td> <td>{$all_info->forecast->city}</td> </tr> <tr> <td>基本天气</td> <td>{$all_info->realtime->weather}</td> </tr> <tr> <td>温度</td> <td>{$all_info->realtime->temp}</td> </tr> <tr> <td>风向</td> <td>{$all_info->realtime->WD}</td> </tr> <tr> <td>更新时间</td> <td>{$all_info->realtime->time}</td> </tr> </table> <table border="1px" style="margin-top: 20px;margin-left: 20px;"> <tr><td colspan="2">生活建议</td></tr> <tr style="border-spacing: 0px; padding: 0px;"> <td style="border-spacing: 0px; padding: 0px;">城市</td> <td>{$all_info->forecast->city}</td> </tr> <tr> <td>防嗮建议</td> <td>{$all_info->index[0]->details}</td> </tr> <tr> <td>穿衣建议</td> <td>{$all_info->index[1]->details}</td> </tr> <tr> <td>运动建议</td> <td>{$all_info->index[2]->details}</td> </tr> <tr> <td>洗车建议</td> <td>{$all_info->index[3]->details}</td> </tr> <tr> <td>晾晒建议</td> <td>{$all_info->index[4]->details}</td> </tr> <tr> <td>更新时间</td> <td>{$all_info->realtime->time}</td> </tr> </table> <table border="1px" style="margin-top: 20px;margin-left: 20px;"> <tr><td colspan="5">未来四天天气信息 城市: {$all_info->forecast->city}</tr> <tr style="border-spacing: 0px; padding: 0px;"> <td>项目/日期</td> <td>今天</td> <td>明天</td> <td>后天</td> <td>大后天</td> </tr> <tr> <td>概况</td> <td>{$all_info->forecast->weather1}</td> <td>{$all_info->forecast->weather2}</td> <td>{$all_info->forecast->weather3}</td> <td>{$all_info->forecast->weather4}</td> </tr> <tr> <td>温度</td> <td>{$all_info->forecast->temp1}</td> <td>{$all_info->forecast->temp2}</td> <td>{$all_info->forecast->temp3}</td> <td>{$all_info->forecast->temp4}</td> </tr> <tr> <td>风向</td> <td>{$all_info->forecast->wind1}</td> <td>{$all_info->forecast->wind2}</td> <td>{$all_info->forecast->wind3}</td> <td>{$all_info->forecast->wind4}</td> </tr> <tr> <td>风力</td> <td>{$all_info->forecast->fl1}</td> <td>{$all_info->forecast->fl2}</td> <td>{$all_info->forecast->fl3}</td> <td>{$all_info->forecast->fl4}</td> </tr> </table> <table border="1px" style="margin-top: 20px;margin-left: 20px;"> <tr><td colspan="2">今日空气质量状况</td></tr> <tr style="border-spacing: 0px; padding: 0px;"> <td style="border-spacing: 0px; padding: 0px;">城市</td> <td>{$all_info->forecast->city}</td> </tr> <tr> <td>PM2.5</td> <td>{$all_info->aqi->pm25}</td> </tr> <tr> <td>PM10</td> <td>{$all_info->aqi->pm10}</td> </tr> <tr> <td>SO2</td> <td>{$all_info->aqi->so2}</td> </tr> <tr> <td>NO2</td> <td>{$all_info->aqi->no2}</td> </tr> <tr> <td>更新时间</td> <td>{$all_info->aqi->pub_time}</td> </tr> </table></body></html>
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; }
著作権に関する声明: この記事はブロガーによるオリジナルの記事であり、ブロガーの許可なく複製することはできません。