在 MySQL 中使用 GPS 坐标快速检索 SELECT 语句

Posted

技术标签:

【中文标题】在 MySQL 中使用 GPS 坐标快速检索 SELECT 语句【英文标题】:fast retrieval of SELECT statement with GPS coordinates in MySQL 【发布时间】:2011-10-03 18:21:08 【问题描述】:

我在 mysql db 中有一个表,其中两列是给定地理点的纬度和经度。它被定义为 Float(2,6)。 我只想从给定点选择特定半径内的记录。

我在 Java 中找到了以下代码,用于检查地理点之间的距离:

public class Location 

private int latitudeE6;
private int longitudeE6;
    ...


public static double CalculateDistance(Location StartP, Location EndP) 

      double lat1 = StartP.getLatitudeE6()/1E6;
      double lat2 = EndP.getLatitudeE6()/1E6; 
      double lon1 = StartP.getLongitudeE6()/1E6;     
      double lon2 = EndP.getLongitudeE6()/1E6;
      double dLat = Math.toRadians(lat2-lat1); 
      double dLon = Math.toRadians(lon2-lon1);   
      double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
      Math.sin(dLon/2) * Math.sin(dLon/2); 
      double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
      return earthradius * c;
   

目前,我在没有位置的情况下执行 SELECT,然后我检查结果集并检查它是否在给定的半径内。 (在 Java 中)。 这肯定不是最优雅、最有效的方法。 你能想出更好的方法吗?

【问题讨论】:

MySQL 内置了 sin/cos/radian 数学函数。您可以轻松地将计算函数转换为 SQL 语法,以便在 WHERE 子句中使用。或者更好的是,您可以将计算指定为用户定义的函数,以便在多个查询中重复使用。 如果你对GIS很认真,你应该看看postGreSQL,它对GIS的支持要好得多,可以做基于函数的索引。 【参考方案1】:

这是一个演示文稿,描述(我认为)如何在 MySQL 中完成您尝试完成的工作:Geo/Spatial Search with MySQL

【讨论】:

以上是关于在 MySQL 中使用 GPS 坐标快速检索 SELECT 语句的主要内容,如果未能解决你的问题,请参考以下文章

想在 C# 代码隐藏中获取 GPS 坐标

从 GPS 坐标中获取区域的文本描述

使用科尔多瓦地理定位插件没有互联网的 GPS 坐标

在谷歌地图中插入可变 GPS 坐标

PHP / MySQL - 从实际 gps 坐标查找半径 500 米内的所有项目

检索到 Android GPS 虚假位置