从我的地理位置计算最近的地方

时间:2012-02-19 13:29:15

标签: javascript mysql google-maps-api-3

我在mysql数据库中有一系列的地方,每个地方都有字段:lat,lon和address。我会根据通过地理位置获得的实际位置计算出最近的位置。我会在这里使用函数:Google Map - find markers但是如何从db所有值中获取并放入javascript数组?

2 个答案:

答案 0 :(得分: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以及经度BETWEEN minLong和maxLong)。然后,MySQL只需要为该行子集执行距离计算。

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

使用边界框就像在地图上首先绘制一个正方形,左边,右边,顶边和底边与我们的中心点保持适当的距离。然后我们的圆圈将被绘制在该框内,圆圈上的最北端,最东端,最南端和最西端的点接触到框的边界。有些行会落在该框之外,因此SQL甚至不愿意尝试计算这些行的距离。它只计算那些落在边界框内的行的距离,看它们是否也属于圆圈。

答案 1 :(得分:1)

你可以在mysql中使用cos和sin以及其他数学函数,这样你就不需要将整个db转换成javascript,你可以在mysql中运行查询。

我在这里找到答案:http://www.movable-type.co.uk/scripts/latlong-db.html(在答案中包含的时间太长)