距離ソートに関する質問

WBOY
リリース: 2016-06-23 13:46:32
オリジナル
1127 人が閲覧しました

たとえば、一連の条件に基づいてデータをクエリすると、データがページングされます

$sql =  "select id,xpoint,ypoint, deal_cate_id,ratio  from ".DB_PREFIX."supplier_location where ".$where;
ログイン後にコピー

ここで、xpoint、ypoint は経度と緯度を表し、ユーザーの場所の経度と緯度 $xpoint、$ypoint
が渡されます。データをクエリした後、ループ リストはユーザーの位置に基づいて緯度と経度によってユーザーとビジネスの間の距離を計算します
foreach($info as $k=>$v){			   	$info[$k]['Distance']  =intval(GetDistance($ypoint,$xpoint,$v['ypoint'],$v['xpoint'])*1000);}
ログイン後にコピー


ここで GetDistance 関数のコードは
// 本函数为获取两坐标之间的距离 // a纬度 a经度 b纬度 b经度 function GetDistance($lat1, $lng1, $lat2, $lng2)   {       $EARTH_RADIUS = 6378.137;	$radLat1 = rad($lat1);	$radLat2 = rad($lat2);	$a = $radLat1 - $radLat2;	$b = rad($lng1) - rad($lng2);       $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));    $s = $s * $EARTH_RADIUS;     $s = round($s * 10000) / 10000;    return $s;}
ログイン後にコピー


です。距離に基づいてソートしたいのですが、データのページングによりソートが不正確になります。これは、各ユーザーの位置と使用する検索条件が関係するためです。一時テーブルやキャッシュを使用すると、条件が異なります。データが大きすぎます。何か良い方法があれば教えてください。提案をお願いします


ディスカッションに返信 (解決策)

並べ替え
abs(xpoint-$xpoint )、abs(ypoint-$) で並べ替えます。 ypoint)
つまり、2 点間の経度と緯度の差の絶対値で並べ替えます

結果を確認してから計算します

または、式 2 * asin(sqrt(pow(sin($a/ 2 ),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))
これを SQL ステートメントに入れると、mysql に関与する関数はすべて
となります。度弧はラジアンです

abs(xpoint-$xpoint)、abs(ypoint-$ypoint) で並べ替えます
つまり、2 点間の経度と緯度の差の絶対値で並べ替えます

結果を確認します
を計算します
または、式 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2) を直接使用します,2)))
mysql に関係するすべての関数を SQL ステートメントに入れます
次数の円弧はラジアンです
モデレーターのご協力に感謝します、問題は解決しました

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート