首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在radius (lat/long)内搜索MySQL数据库中的值

问在radius (lat/long)内搜索MySQL数据库中的值
EN

Stack Overflow用户
提问于 2015-04-25 21:25:13
回答 1查看 1.2K关注 0票数 1

我没有那么多的SQL经验,老实说,我也不知道从哪里去,大多数问这样问题的人都是使用MySQL之类的,而且可以使用一些我不能使用的参数/值。我正在使用MySQL。

下面是我用Java编写的代码,用于在X英里内创建一个随机位置。

代码语言:javascript
复制
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方法如下所示:

代码语言:javascript
复制
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,因为这就是我将要用来轮询数据库的内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-25 21:48:19

在您的位置上,我只是将距离计算移到mysql一侧。虽然您的代码很复杂,但可以计算的Haversine formula不是。这里还可以看到mysql代码的计算示例,它甚至不需要存储函数。

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

在mysql超载的情况下,我建议在一个新的问题中问这个问题。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29870911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档