使用纬度和经度优化用于地理位置搜索的 MySQL 查询
在 MySQL 中,基于地理邻近度检索数据是一项常见任务。使用经度和纬度值时,必须使用高效的查询来避免意外结果。
考虑以下查询,该查询尝试查找中心纬度和经度 25 英里半径内的行:
<code class="sql">SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180)) * cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515) AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC</code>
虽然此查询通常有效,但它可能会为某些行生成不准确的结果,显示它们距离指定半径更远。
为了提高准确性,请考虑以下优化查询:
<code class="sql">SELECT `id`, ( 6371 * acos( cos( radians( :lat ) ) * cos( radians( `lat` ) ) * cos( radians( `long` ) - radians( :long ) ) + sin(radians(:lat)) * sin(radians(`lat`)) ) ) `distance` FROM `location` HAVING `distance` < :distance ORDER BY `distance` LIMIT 25</code>
在此查询中,:lat 和 :long 参数表示中心点的纬度和经度,:distance 表示以英里为单位的半径。
两个查询之间的主要区别是使用 6371 作为转换系数将弧度转换为英里。该系数比原始查询中使用的 3959 更准确。此外,优化后的查询使用更严格的公式来计算基于纬度和经度的距离。
通过实施这些优化,您可以在使用纬度和经度值执行地理位置搜索时显着提高 MySQL 查询的准确性,确保结果始终在指定的半径距离内。
以上是## 如何优化 MySQL 查询以使用纬度和经度进行准确的地理位置搜索?的详细内容。更多信息请关注PHP中文网其他相关文章!