【问题标题】:MySQL Nested Statement for Geographic Coordinates地理坐标的 MySQL 嵌套语句
【发布时间】:2011-09-25 10:41:28
【问题描述】:

不确定这是逻辑问题还是 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 值,但这些最小值和最大值代表了对最小纬度、最大纬度等的单独查询......这给了我一个很好的面积估计所以我可以在谷歌地图上画一个多边形……但它们是正方形,有很多重叠,我知道我可以做得更好……这些结果代表了任何地方的最大北、南、东、西记录在城市记录组中..

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    或联合

    (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))
    

    【讨论】:

    • 进一步描述问题:不是有四个结果,而是按城市分组的一系列坐标中的最大纬度和经度以及最小纬度和经度值......我想要四个记录;最大纬度和经度坐标的城市,最大纬度和最小经度坐标的城市,最小纬度和最小经度坐标的城市,以及最小纬度和最大纬度坐标的城市。跨度>
    • 您可以根据需要多次 UNION。如果你有菱形定位,你必须在坐标上玩并选择一个流行的
    【解决方案2】:

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

    但几乎可以肯定不会有一条记录同时具有最大纬度和最大长度。当一个地方更北而另一个地方更东时,你想要的结果是什么?

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

    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 中涉及的事情太多了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      相关资源
      最近更新 更多