用于地理坐标的MySQL嵌套语句

时间:2011-06-29 19:22:23

标签: mysql geolocation geometry google-maps-api-3

不确定这是一个逻辑问题,还是一个MySQL问题......但仍然需要帮助。

我有一个区域列表,每个区域都有坐标。该数据库大小约为115MB。以下是记录的样本:

|  PC1  |  PC2  |   CITY    | PROV  | AREACODE  |    LAT      |     LNG      | 
|  A1A  |  0B8  | ST. JOHNS |  NL   |    709    |47.5986880000|-52.7255210000|
|  A1A  |  0B9  | ST. JOHNS |  NL   |    709    |47.5505750000|-52.7460720000|

等等,等等......

我需要做的是,获取每个城市的记录,表示最大纬度经度值,然后是最大纬度最小经度值,然后是记录最小纬度值最小纵向值,然后记录最小纬度值最大纵向值。

我开始的是:

SELECT MAX(lat), MAX(lng), MIN(lat), MIN(lng), city FROM places GROUP BY city

这给了我每个城市一条记录,我要求的MAX / MIN值,但那些最小值和最大值代表了最小纬度,最大纬度等的个别查询...这给了我一个相当不错的区域估计所以我可以在谷歌地图上绘制一个多边形...但它们是正方形,并且有很多重叠,我知道我可以做得更好......这些结果代表了任何北,南,东,西的任意一个记录城市记录组。

我想要做的是搜索具有最大纬度和最大纵向值的一条记录,然后是最大纬度和最小纵向值,等等。

不确定如何嵌套这些SQL语句...我尝试了一些IN语句,但总是导致一条记录不能代表任何最大值或最小值。

2 个答案:

答案 0 :(得分:0)

不确定我是否正确理解了您的问题,但您可以查看HAVING子句

SELECT lat, lng, city FROM places GROUP BY city HAVING lat=MAX(lat)

或UNION

(SELECT MAX(lat), MAX(lng), city FROM places GROUP BY city)
 UNION
(SELECT MAX(lat), MIN(lng), city FROM places GROUP BY city)

或两者的混合

(SELECT MAX(lat), MAX(lng), city FROM places GROUP BY city HAVING lat=MAX(lat))
 UNION
(SELECT MAX(lat), MIN(lng), city FROM places GROUP BY city HAVING lng=MIN(lng))

答案 1 :(得分:0)

  

我想要做的是搜索具有最大纬度和最大纵向值的一条记录

但几乎肯定不会有一条记录同时包含max lat和max long。当一个地方向北,而另一个地方在更远的地方时,你的理想结果是什么?

您是否正在寻找每个城市“最偏东北”的地方?在这种情况下:

SELECT * FROM places WHERE city='ST. JOHNS'
ORDER BY MAX(lat+lng) DESC LIMIT 1;

与其他对角线方向的MIN和/或lat-lng类似。

为了获得每个城市的最东北偏东,你有一个'每组最大'的问题,这是一个常见的SQL问题。请参阅例如this question进行讨论。每个城市最东北部地区的一个例子:

SELECT p0.*
FROM places AS p0
LEFT JOIN places AS p1 ON p1.city=p0.city AND p1.lat+p1.lng>p0.lat+p0.lng
WHERE p1.city IS NULL

然而,这些计算顺序查询是不可索引的,因此除非您实际为lat + lng添加索引列,否则可能效率低下。

然后您遇到了尝试将所有四个查询(NE,SE,SW和NW版本)放入同一查询的问题。解决此问题的最佳方法通常不是:执行四个单独的查询。通常情况下,您尝试将四个单独的操作压缩到一个查询中的各种扭曲会使您的效率低于四个单独的查询,并且可读性低得多。

在任何情况下,我都没有真正看到任何这样的东西。如果您尝试围绕一组地图点绘制最小的非矩形多边形,则必须选择城市的每个点并使用convex hull algorithm或某种四叉树。在SQL中也很容易参与。