从MySQL

时间:2017-02-24 11:57:24

标签: mysql leaflet coordinates bounding-box

我目前正在构建一个应用程序来显示特定城市中所有地理标记的树。 我用来从表中获取数据的主要列如下,

+-----------------+-------------+------+-----+---------+-------+
| 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;找不到符合我要求的东西。请帮帮我。在此先感谢.. !!

2 个答案:

答案 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/