我想知道你的意见.我创建了一个应用程序,用户创建路由,并跟踪此路由并保存数据库中的所有路线.然后,应用程序对用户的方式点进行比较.
目前,我使用MSsql Server,使用两个表,一个用于路由,另一个用于存储路径点(具有空间数据类型).比较是在存储过程中使用sql Server地理功能,如st_distance …
我已经调查了其他选择.我实现的是使用Oracle 11g使用对象.我仅存储一个对象表中的所有数据,并将点存储在具有纬度和经度属性的类型的Varray中.这样就可以非常有效地保存和检索数据,但在比较时会变得复杂.
解决方法
对所有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示例)计算点是否在适当的正交距离内,并采用一个子集(由黑点组成).