2011-10-03 120 views
0

我在MySQL数据库中有一个表,其中两列是给定地理点的纬度和经度。它被定义为Float(2,6)。 我想从给定的点只选择特定半径内的记录。在MySQL中快速检索带有GPS坐标的SELECT语句

我发现在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)。 这当然不是最优雅,有效的做法。 你能想出更好的方法吗?

+0

MySQL的有正弦/余弦/弧度数学运算功能内置到它。您可以轻松地将您的计算函数转换为在WHERE子句中使用的SQL语法。或者更好的是,您可以将计算指定为用户定义的函数,以便它可以在多个查询中重用。 –

+0

如果你对GIS很认真,你应该查看postGreSQL,对GIS有更好的支持,并且可以根据功能做索引。 – Johan

回答