【问题标题】:calculate nearest place from my geolocated position从我的地理位置计算最近的地方
【发布时间】:2012-03-10 02:40:30
【问题描述】:

我在 mysql 数据库中有一系列地点,其中每个地点都有字段:纬度、经度和地址。我会从通过地理定位获得的实际位置计算最近的位置。我会使用这里的函数:Google Map - find markers 但是我怎样才能从 db 中获取所有值并放入 javascript 数组中?

【问题讨论】:

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


    【解决方案1】:

    选项 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 latitude BETWEEN minLat AND maxLat AND longitude BETWEEN minLong AND maxLong)。那么 MySQL 只需要对该行的子集执行距离计算。

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

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

    【讨论】:

      【解决方案2】:

      你可以在mysql中使用cos和sin等数学函数,这样你就不需要把整个db导入javascript,你可以在mysql中运行查询。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多