2012-02-19 85 views

回答

2

选项1: 通过切换到支持的GeoIP数据库做数据库的计算。

选项2: 做数据库的计算:如果你使用MySQL,所以下面的存储过程应该可以帮助

CREATE FUNCTION distance (latA double, lonA double, latB double, LonB double) 
    RETURNS double DETERMINISTIC 
BEGIN 
    SET @RlatA = radians(latA); 
    SET @RlonA = radians(lonA); 
    SET @RlatB = radians(latB); 
    SET @RlonB = radians(LonB); 
    SET @deltaLat = @RlatA - @RlatB; 
    SET @deltaLon = @RlonA - @RlonB; 
    SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) + 
    COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2); 
    RETURN 2 * ASIN(SQRT(@d)) * 6371.01; 
END// 

方案3: 如果你有一个指数纬度和经度,你可以通过用你选择的脚本语言(minLat,maxLat,minLong和maxLong)计算一个初始边界框,并将行限制为一个子集来减少需要计算的计算次数您的条目基于(WHERE纬度BETWEEN minLat和maxLat和minLong和maxLong之间的经度)。那么MySQL只需要执行该行子集的距离计算。

如果您使用SQL语句或存储过程来计算距离,则SQL仍需查看数据库中的每条记录,并计算数据库中每条记录的距离,然后才能决定是否返回该行或丢弃它。 由于计算执行起来相对较慢,因此如果您可以减少需要计算的行集合,消除明显超出所需距离的行,那么会更好,因此我们只执行昂贵的计算为更少的行数。

使用边界框就像在地图上首先绘制一个正方形,左边,右边,顶部和底部边距离我们中心点的适当距离。然后我们的圈子将被绘制在该框内,圆圈上最北端,最东端,最南端和最西端的点与框的边界接触。有些行将落在该框之外,所以SQL甚至不打算计算这些行的距离。它仅计算落在边界框内的那些行的距离,以查看它们是否落入圆内。