Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在MySQL数据库中搜索半径范围内的值(lat/long)_Java_Php_Mysql - Fatal编程技术网

Java 在MySQL数据库中搜索半径范围内的值(lat/long)

Java 在MySQL数据库中搜索半径范围内的值(lat/long),java,php,mysql,Java,Php,Mysql,我没有那么多SQL方面的经验,老实说,我也不知道该怎么办,大多数问这样问题的人都在使用MS Server或其他什么东西,可以使用一堆我无法使用的参数/值。我正在使用MySQL 下面是我用来在X英里内创建随机位置的Java代码 public static GeoPosition randomLocation(GeoPosition location, double radius) { Random random = new Random(); // Convert

我没有那么多SQL方面的经验,老实说,我也不知道该怎么办,大多数问这样问题的人都在使用MS Server或其他什么东西,可以使用一堆我无法使用的参数/值。我正在使用MySQL

下面是我用来在X英里内创建随机位置的Java代码

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);
    }
这些地理位置(经度/纬度组)存储在数据库中。但是现在我需要弄清楚如何在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,因为我将使用它来轮询数据库

在您的位置,我只是将距离计算移到mysql端。虽然您的代码很复杂,但可以计算出使用它的时间,而不是。这里还可以看到mysql代码的计算示例,它甚至不需要存储函数

不幸的是,这个简单的公式已经太复杂,无法从mysql中进行索引。这个解决方案将解决您的带宽消耗问题,但可能会使您的mysql过载。这将取决于你的查询率和职位数量

在mysql过载的情况下,我建议用一个新问题来回答这个问题


有一个用于地理信息系统的stackexchange站点。

如果您在客户端这样做,似乎所有行都需要向下传递,为什么不换一种方式,计算服务器上的行并向下传递呢?@DCR-“是否有一种正确的方法来处理从数据库返回纬度/经度X英里范围内的所有结果,因为从服务器返回每个结果将非常快地成为带宽杀手。“在数据库中查找与lat/long坐标最近的点的问题经常在堆栈溢出时出现——解决方案是在MySQL查询中进行。”。我看到你接受了在这篇文章中提供的帮助,并提出了一个新问题——太好了!但是,请记住,评论中的帮助或确定的副本都代表志愿者帮助您所花费的时间。如果您能抽出时间在评论中对帮助做出回应,我们将不胜感激——毕竟,我们是这里的一个社区。我投了否决票,并表示歉意。@halfer-对不起,我的印象是,将答案标记为重复项锁定了问题。对不起,我的问题是计算搜索坐标的半径。如果我可以计算半径并得到4个角(长/宽),那么我可以轻松编写一个中间查询,但这就是我遇到的问题。@Christian.tucker不,这不是你的问题。你的问题是:“是否有一种正确的方法来处理从数据库返回纬度/经度X英里范围内的所有结果,因为从服务器返回的每个结果都会很快成为带宽杀手。”这是我为Peter写的答案,您可以在lat/long系统中使用哈弗森公式进行最近坐标发现(参见我在问题注释中的链接)。然而,您的答案有时被用作事先的优化步骤,因为它比trig函数便宜得多。@Christian.tucker嗯,看来您是对的。我正在研究我的答案。@peterh-谢谢你的更新,它帮助了很多。