近接検索を処理する最良の方法は、ある種の境界長方形近似から始めて、そこから実際の大円距離まで移動することです。
緯度が極に近すぎない限り、2点間の距離のずさんな、しかし実行可能な近似は次のようになります(SQLishの場合):
GREATEST(ABS(lat1-lat2),ABS(long1-long2))
より正確に知りたい場合で、内部にいる人だけを気にすることがわかっている場合は、たとえば、互いに10 km離れている場合は、このような境界矩形検索を使用できます。
WHERE latitude_from_table
BETWEEN latpoint - (10.0 / 111.045)
AND latpoint + (10.0 / 111.045)
AND longitude_from_table
BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))
これは、1度の緯度に111.045kmあるために機能します。経度の境界の正弦項は、極に近づくにつれて緯度の線が互いに近づくという事実を説明しています。これにより、latitude_from_table列とlongitude_from_table列のMySQLインデックスを活用できます。
バウンディングボックスの近接度が決まったら、大圏距離の式を適用できます。その背景は次のとおりです。 http://www.plumislandmedia.net/mysql/haversine-mysql-最寄-loc/
検討している種類のアプリケーションの場合、32ビットIEEE-488浮動小数点は座標に対して十分な精度です。見ているポイントが本当に接近している場合(1 km程度未満)、Vincenty式( http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ )より一般的ないわゆる半正矢関数( http: //www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ 。
人数が300Kをはるかに超える場合は、MySQL地理空間インデックススキームの使用を検討することをお勧めします。 MyISAMテーブルでのみ機能しますが、非常に バウンディング-長方形検索を高速に実行します。こちらをご覧ください。 http://www.plumislandmedia.net/mysql/haversine-mysql-最寄-loc/