SQL Group By。在不同城市重复lat / lng

时间:2015-03-19 20:15:25

标签: mysql group-by geolocation

我很久以前买了一个地理数据库,我正在将其精度更新为lat / lng值。但我发现了一些奇怪的东西。有些城市具有相同的纬度/经度坐标。事情在地理上是不可能的。

id   City    State   Lat    Lng
1     A        sA     XX     XX
2     B        sA     XX     XX
3     C        sA     YY     YY
4     D        sA     ZZ     ZZ

所以我尝试了Group By City,Lat,Lng但是由于我需要更新记录的id,group by子句会要求我添加'id'列。

表ids 1和2应该更新,留下3和4。它不应该是具有相同Lat / Lng的2个(或更多)城市。该表有22K行。我可以将所有内容发送到gmap API,但我正在寻找使用时间,带宽和尽可能智能的API,但我已经没时间考虑我可以使用免费API访问每秒发出请求。< / p>

我试过

    SELECT DISTINCT postcodes_id, Latitude, Longitude, Region1Name, Region2Name, Nation_D
      FROM postcodes
      where Latitude + Longitude  IN 
      (
             SELECT Latitude + Longitude
             FROM
             (  
                        SELECT postcodes_id, Latitude, Longitude, count(distinct(Region2Name))  as cantidad 
                        FROM postcodes
                        where Nation_D is not null
                        GROUP BY Latitude, Longitude
                        having count(distinct(Region2Name)) > 1
             ) A
      )
      AND Nation_D IS NOT NULL

  ORDER BY  Latitude, Longitude, Region1Name, Region2Name, Nation_D

但是没有按预期工作。我觉得它对于一双新眼睛来说非常明显。

我编写了一个python脚本来使用Google Map地理编码来获取当前的Lat / Lng,如果它不同则更新它。这个脚本工作正常。

希望有人有个主意。谢谢!

在CentOS 7上运行MySQL 5.5和Python 2.7。

1 个答案:

答案 0 :(得分:0)

给你一些指示,这可能会有所帮助:

  1. 你不应该在lat / lon或它们的任何组合上使用group bydistinct,因为它们是连续的浮点数而不是离散的整数或字符串。

    < / LI>
  2. 出于同样的原因,你不应该在lat / lon或它们的总和上使用WHERE子句。如果您要检查两个位置的接近程度,请改用st_distance()功能。

  3. 多个城市名称可以指向同一位置。例如,纽约,纽约和曼哈顿,纽约。

  4. 非技术性问题:在您的数据库中存储Google地理编码数据违反了他们的许可协议。考虑使用其他来源(例如YAddress,由我工作的公司制作)。