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示例)计算点是否在适当的正交距离内,并采用一个子集(由黑点组成). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |