sql – 最有效的方式来保存路线点并进行比较?

前端之家收集整理的这篇文章主要介绍了sql – 最有效的方式来保存路线点并进行比较?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道你的意见.我创建了一个应用程序,用户创建路由,并跟踪此路由并保存数据库中的所有路线.然后,应用程序对用户的方式点进行比较.

目前,我使用MSsql Server,使用两个表,一个用于路由,另一个用于存储路径点(具有空间数据类型).比较是在存储过程中使用sql Server地理功能,如st_distance …

我已经调查了其他选择.我实现的是使用Oracle 11g使用对象.我仅存储一个对象表中的所有数据,并将点存储在具有纬度和经度属性的类型的Varray中.这样就可以非常有效地保存和检索数据,但在比较时会变得复杂.

我正在寻找一个Nosql解决方案,一些算法或方法来有效地做到这一点.你怎么看?

解决方法

对所有n个记录使用像 STDistance这样的数据库函数是次优的.您的cpu开销会呈指数级增长.

你应该做的是检查你正在搜索的当前震中周围的矩形内的点数.这里有一个例子(在MysqL中):

SELECT * FROM `points`
    WHERE `latitude` >= X1 AND `latitude` <= X2
    AND `longitude` >= Y1 AND `longitude` <= Y2

这提供了一个减少的点集,然后应该使用Haversine formula通过计算正交距离(相对于地球的曲率)来进一步减少.

不要忘记在纬度和经度上设置一个composite index.

这里是PHP

<?PHP
function haversine($latitude1,$longitude1,$latitude2,$longitude2,$unit = 'Mi') {
    $theta = $longitude1 - $longitude2;
    $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) +
    (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
    $distance = acos($distance);
    $distance = rad2deg($distance);
    $distance = $distance * 60 * 1.1515;
    switch ($unit) {
    case 'Mi':
        break;
    case 'Km':
        $distance = $distance * 1.609344;
    }
    return (round($distance,2));
}
?>

总结:

这是一个示例图,说明要做什么:

第一个搜索将涉及边界框碰撞搜索(MysqL示例)来确定超集,不包括红点.第二个验证过程将涉及如何使用Haversine公式(PHP示例)计算点是否在适当的正交距离内,并采用一个子集(由黑点组成).

原文链接:https://www.f2er.com/mssql/76203.html

猜你在找的MsSQL相关文章