「障害」は新しいタスクを決定し、設定しました-カフェのページに最も近い場所を表示します。
実際には2つの目標がありました。
1.控えめにサイトを訪問することを提案します。
2.カフェが気に入らない人に選択肢を与える
しかし、最も近い施設は曖昧な概念です。 具体的には、大多数によると、「最も近い」ものは数分離れていることがわかりました(車を駐車しないように)。
2分間の歩行(速度5 km / h)は170メートルです。 200に切り上げます(既にあります)。 そして、彼らは新しい問題に出くわしました-サイトの緯度と経度しかわからない場合、正確に「メートル単位でハング」する方法です。
5年生の少し数学、ウリヤノフスクの度をメートルに変換することができました。
$sql=" 
      
        
        
        
      
     SELECT *, 
      
        
        
        
      
     sqrt(POWER(((lat-".$row['lat'].")*110349.7867154), 2) + POWER(((lng-".$row['lng'].")*64505.305504), 2)) as `distance` 
      
        
        
        
      
     FROM `cafe` 
      
        
        
        
      
     WHERE 
      
        
        
        
      
     sqrt(POWER(((lat-".$row['lat'].")*1110349.7867154), 2) + POWER(((lng-".$row['lng'].")*64505.305504), 2)) < 200 
      
        
        
        
      
     ORDER BY `distance` ASC 
      
        
        
        
      
     ";
      
      更新:
latおよびlngは、テーブル内の対応するフィールドの名前です
$ row ['lat']および$ row ['lng']は、私たちが見ているポイントの座標です
110349.7867154-ウリヤノフスクの緯度からメートルへの変換係数
64505.305504-ウリヤノフスクの経度をメートルに変換する係数
更新2:
KAndyとhommに感謝します。 テストマシンでの提案のおかげで、リクエストは2倍速く処理されます(0.0084ではなく0.0040)
リクエストの前に最適化する
$distanceSq = $distance^2; 
      
        
        
        
      
     $row['latMin'] = $row['lat'] - 200/1110349.7867154; 
      
        
        
        
      
     $row['latMax'] = $row['lat'] + 200/1110349.7867154; 
      
        
        
        
      
     $row['lngMin'] = $row['lng'] - 200/64505.305504; 
      
        
        
        
      
     $row['lngMax'] = $row['lng'] + 200/64505.305504; 
      
        
        
        
      
    
      
      $sql=" 
      
        
        
        
      
     SELECT *, 
      
        
        
        
      
     sqrt(POWER(((lat-".$row['lat'].")*110349.7867154), 2) + POWER(((lng-".$row['lng'].")*64505.305504), 2)) as `distance` 
      
        
        
        
      
     FROM `cafe` 
      
        
        
        
      
     WHERE 
      
        
        
        
      
     (lat >= ".$row['latMin']." AND lat <= ".$row['latMax'].") 
      
        
        
        
      
     AND (lng >= ".$row['lngMin']." AND lng <= ".$row['lngMax'].") 
      
        
        
        
      
     AND POWER(((lat-".$row['lat'].")*1110349), 2) + POWER(((lng-".$row['lng'].")*64505), 2) < ".$distanceSq." 
      
        
        
        
      
     ORDER BY `distance` ASC 
      
        
        
        
      
     ";
      
      このクエリは、データベースから最も近いトークンのリストを取得します。 そのかさばりにもかかわらず、わずか0.004秒で150の機関のテーブルでうまくいきます。
結果を見ることができます:ウリヤノフスクのレストラン、カフェ、バー同志スホフは写真の下にあります。 美しさはまだこのリストに載っていません、ごめんなさい:)