我目前正在构建一个应用程序来显示特定城市中所有地理标记的树。 我用来从表中获取数据的主要列如下,
+-----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| tree_geotags_id | int(11) | NO | PRI | None | |
| lattitude_dl | double(9,7) | YES | | NULL | |
| longitude_dl | double(9,7) | YES | | NULL | |
+-----------------+-------------+------+-----+---------+-------+
该表有超过158000行。
目前我使用以下查询来获取输出
SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl,
SQRT(
POW( 69.1 * ( gt.latitude_dl - [ center_lat ] ), 2) +
POW( 69.1 * ( [ center_lon ] - gt.longitude_dl ) * COS( gt.latitude_dl / 57.3 ), 2 )
) AS distance
FROM tree_geotags_t gt
HAVING distance < 0.4 ORDER BY distance
这样做,它获取半径为0.4的所有记录。 我使用ajax调用来获取数据,每次地图的中心坐标发生变化(在地图平移或缩放上),将获取的数据转换为geojson格式,然后将其作为图层加载到地图上。我遇到的问题是,在树木密度非常高的地方,地图放置所有点需要很长时间,因为它在半径上取得它会加载甚至在外面的点视口。
我需要一个查询,只在视口内的坐标中加载数据,使用东北和西南坐标作为边界。 我在这里搜索了很长时间但是没有# 39;找不到符合我要求的东西。请帮帮我。在此先感谢.. !!
答案 0 :(得分:3)
如果有人还在寻找,我会从这篇文章中得到答案。
Get all records from MySQL database that are within Google Maps .getBounds?
无论如何,谢谢你的帮助。
答案 1 :(得分:0)
你非常接近。您的(否则严重不正确)距离公式包含您的边界框检查的种子。
试试这个
SET @distance_unit := 69.0; /* for miles, use 111.045 for km. */
SET @radius := 1.0; /* for radius */
SET @center_lat := target_latitude_in_degrees;
SET @center_lon := target_longitude_in_degrees;
SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl
FROM tree_geotags_t gt
WHERE gt.latitude_dl
BETWEEN @center_lat - (@radius/@distance_unit) /*east boundary*/
AND @center_lat + (@radius/@distance_unit) /*west*/
AND gt.longitude_dl
BETWEEN @center_lon - (@radius / (@distance_unit * COS(RADIANS(@center_lat)))) /*south*/
AND @center_lon + (@radius / (@distance_unit * COS(RADIANS(@center_lat)))) /*north*/
假设您知道边界框的东,西,北和南边界而不是其中心。这很容易适应上面的代码。
SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl
FROM tree_geotags_t gt
WHERE gt.latitude_dl BETWEEN @east AND @west
AND gt.longitude_dl BETWEEN @south AND @north
只要边界框坐标以度为单位,如何从边角派生边界框的边界的问题是微不足道的。如果它们以某些投影单位(如transverse UTM coordinate s)给出,那么答案将无法适合Stack Overflow帖子。
此查询可以通过(latitude_dl, longitude_dl, tree_geotags_id)
上的复合索引快速进行。纬度搜索将使用索引范围扫描,然后可以直接从索引中检索经度和ID。
您的距离公式有什么问题?它是笛卡尔坐标,但是你需要球面余弦定律公式,因为你正在处理球面坐标。
这不会靠近北极或南极(因为cos(纬度)趋于零)但这没关系;你正在处理树木,但它们还没有生长在那里。
这是关于该主题的综合性文章。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/