我没有那么多的SQL经验,老实说,我也不知道从哪里去,大多数问这样问题的人都是使用MySQL之类的,而且可以使用一些我不能使用的参数/值。我正在使用MySQL。
下面是我用Java编写的代码,用于在X英里内创建一个随机位置。
public static GeoPosition randomLocation(GeoPosition location, double radius) {
Random random = new Random();
// Convert radius from miles to meters
double meters = radius * 1609.34;
// Convert radius from meters to degrees
double radiusInDegrees = meters / 111300f;
double u = random.nextDouble();
double v = random.nextDouble();
double w = radiusInDegrees * Math.sqrt(u);
double t = 2 * Math.PI * v;
double x = w * Math.cos(t);
double y = w * Math.sin(t);
// Adjust the x-coordinate for the shrinking of the east-west distances
double new_x = x / Math.cos(location.latitude());
double foundLongitude = new_x + location.longitude();
double foundLatitude = y + location.latitude();
return new GeoPosition(foundLongitude, foundLatitude);
}这些GeoPositions (经纬度组)存储在数据库中。然而,现在我需要弄清楚如何在X英里半径内获取数据库中的所有行。
在用Java编写此代码时,distanceBetween方法如下所示:
public static double distanceBetween(GeoPosition a, GeoPosition b) {
double longDif = a.longitude() - b.longitude();
double distance =
Math.sin(deg2rad(a.latitude()))
*
Math.sin(deg2rad(b.latitude()))
+
Math.cos(deg2rad(a.latitude()))
*
Math.cos(deg2rad(b.latitude()))
*
Math.cos(deg2rad(longDif));
distance = Math.acos(distance);
distance = rad2deg(distance);
distance = distance * 60 * 1.1515; // Convert to meters
distance = distance * 0.8684; // Convert to miles.
return distance;
}
private static double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
private static double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}我只需要遍历一个集合就可以找到所有的位置,其中distanceBetween是true。然而,这似乎需要对客户端进行更多的工作。
是否有正确的方法从数据库返回在经度/纬度X英里范围内的所有结果?因为从服务器返回的每个结果都会很快成为带宽杀手。
问题也被标记为PHP,因为这就是我将要用来轮询数据库的内容。
发布于 2015-04-25 21:48:19
在您的位置上,我只是将距离计算移到mysql一侧。虽然您的代码很复杂,但可以计算的Haversine formula不是。这里还可以看到mysql代码的计算示例,它甚至不需要存储函数。
不幸的是,这个简单的公式已经太复杂了,无法从mysql中索引。这个解决方案将解决带宽问题,但可能会使mysql超载。这将取决于您的查询率和您的职位数目。
在mysql超载的情况下,我建议在一个新的问题中问这个问题。
有一个用于地理信息系统here的stackexchange站点。
https://stackoverflow.com/questions/29870911
复制相似问题