PHPで近くにいる人の検索を実装する方法
php メソッドで近くにいる人の検索を実装します。最初に経度と緯度の範囲を計算する関数を宣言し、次にこの経度と緯度の範囲内の条件を満たすすべてのレコードをデータベースから検索し、最後に経度をクエリします。 「$radius」の緯度と範囲内の発電所の詳細な住所で十分です。
PHP ビデオ チュートリアル」
最近のプロジェクトでは、ユーザーの現在位置の経度と緯度に基づいて、ユーザーから 10 キロメートル以内にいる人々にクエリを実行する必要があります。この関数は、それほど技術的な実装ではありません (もちろん、When the function についてのみ参照します)。内容自体もデータ量も少ないので、そこから派生する他の問題は長らく含まれていません)が、いろいろ検討した結果、記録することにしました。 今後、APPサーバー開発でもWEB開発でも、お客様からそのような機能を求められることが多くなるので、その原理をしっかりとマスターする必要があります。
#私はかつて、データベースの感情を考慮せずに、それを当然のこととして考えていました。10 万レベル、100 万レベルのデータベースを運用している場合、そのようなアプローチによって引き起こされる問題は壊滅的なものになります。毛糸にしましょうか?
[実装アイデア]
まず、次のように考える必要があります。ユーザーの現在位置の経度、緯度と、検索する範囲がわかったので、次のように考えることができます。範囲を計算しますか?つまり、中心点と半径をもとに、条件を満たす経度と緯度の最大値と最小値を計算します。
[具体的な実装]
したがって、ここで、独自に考えて完成させたい友人は、これ以上読まないでください。
この機能の実装原理については上で説明しましたが、その後、具体的な実装手順について説明します。
最初に、緯度と経度の範囲を計算する関数を宣言します。
/** * 根据经纬度和半径计算出范围 * @param string $lat 纬度 * @param String $lng 经度 * @param float $radius 半径 * @return Array 范围数组 */private function calcScope($lat, $lng, $radius) { $degree = (24901*1609)/360.0; $dpmLat = 1/$degree; $radiusLat = $dpmLat*$radius; $minLat = $lat - $radiusLat; // 最小纬度 $maxLat = $lat + $radiusLat; // 最大纬度 $mpdLng = $degree*cos($lat * (PI/180)); $dpmLng = 1 / $mpdLng; $radiusLng = $dpmLng*$radius; $minLng = $lng - $radiusLng; // 最小经度 $maxLng = $lng + $radiusLng; // 最大经度 /** 返回范围数组 */ $scope = array( 'minLat' => $minLat, 'maxLat' => $maxLat, 'minLng' => $minLng, 'maxLng' => $maxLng ); return $scope; }
返される配列には、$radius 範囲内の条件を満たす最大および最小の緯度と経度が含まれます。
範囲を取得したので、この経度と緯度の範囲内の条件を満たすすべてのレコードをデータベースから検索できます:
/** * 根据经纬度和半径查询在此范围内的所有的 * @param String $lat 纬度 * @param String $lng 经度 * @param float $radius 半径 * @return Array 计算出来的结果 */public function searchByLatAndLng($lat, $lng, $radius) { $scope = $this->calcScope($lat, $lng, $radius); // 调用范围计算函数,获取最大最小经纬度 /** 查询经纬度在 $radius 范围内的电站的详细地址 */ $sql = 'SELECT `字段` FROM `表名` WHERE `Latitude` < '.$scope['maxLat'].' and `Latitude` > '.$scope['minLat'].' and `Longitude` < '.$scope['maxLng'].' and `Longitude` > '.$scope['minLng']; $stmt = self::$db->query($sql); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); // 获取查询结果并返回 return $res; }
[拡張]
これまで、近くの人々を計算する方法はすでにわかっていましたが、実際のニーズでは、現在の中心点から各人物の実際の距離を計算する必要があることがよくあります。
次に、方法を見てみましょう:
/** * 获取两个经纬度之间的距离 * @param string $lat1 纬一 * @param String $lng1 经一 * @param String $lat2 纬二 * @param String $lng2 经二 * @return float 返回两点之间的距离 */public function calcDistance($lat1, $lng1, $lat2, $lng2) { /** 转换数据类型为 double */ $lat1 = doubleval($lat1); $lng1 = doubleval($lng1); $lat2 = doubleval($lat2); $lng2 = doubleval($lng2); /** 以下算法是 Google 出来的,与大多数经纬度计算工具结果一致 */ $theta = $lng1 - $lng2; $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); $dist = acos($dist); $dist = rad2deg($dist); $miles = $dist * 60 * 1.1515; return ($miles * 1.609344); }
条件を満たすすべての近くの人の経度と緯度を事前に計算しました。その後、各人の経度と緯度を現在の経度と組み合わせることができます。中心点 経度と緯度をパラメータとして関数に渡し、最終的に各資格者と中心点との距離を計算します。
プログラムの厳密性を確保するために、次の説明をしなければなりません:
緯度と経度の範囲の計算方法は Baidu で見つかりました。現在、標準的な計算ツールはありません。が見つかったので、このアルゴリズムは検証できませんが、ほとんどの投稿は基本的にこの計算方法を使用しています。
緯度経度距離の計算方法はGoogleで見つけたもので、計算結果はほとんどの計算ツールと同様です。なぜGoogleで検索したかというと、Baiduで色々な計算方法を調べたのですが、満足のいく結果が得られなかったからです。 半径と緯度経度によって範囲を計算する場合、半径の単位は m で、距離を計算する場合、結果は km になります。したがって、単位の変更には注意してください。
私はまだ検証を試みており、より正確な計算結果を得るために専門家の助けを求めています。
以上がPHPで近くにいる人の検索を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。
