【发布时间】:2012-03-10 02:40:30
【问题描述】:
我在 mysql 数据库中有一系列地点,其中每个地点都有字段:纬度、经度和地址。我会从通过地理定位获得的实际位置计算最近的位置。我会使用这里的函数:Google Map - find markers 但是我怎样才能从 db 中获取所有值并放入 javascript 数组中?
【问题讨论】:
标签: javascript mysql google-maps-api-3
我在 mysql 数据库中有一系列地点,其中每个地点都有字段:纬度、经度和地址。我会从通过地理定位获得的实际位置计算最近的位置。我会使用这里的函数:Google Map - find markers 但是我怎样才能从 db 中获取所有值并放入 javascript 数组中?
【问题讨论】:
标签: javascript mysql google-maps-api-3
选项 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 甚至不会费心尝试计算这些行的距离。它只计算落在边界框内的那些行的距离,以查看它们是否也在圆圈内。
【讨论】:
你可以在mysql中使用cos和sin等数学函数,这样你就不需要把整个db导入javascript,你可以在mysql中运行查询。
我在这里找到了答案:http://www.movable-type.co.uk/scripts/latlong-db.html(太长,无法包含在答案中)
【讨论】: