从另一个表MySQL更新地理信息

时间:2015-04-11 16:37:13

标签: mysql geolocation geocoding openstreetmap

大家好日子,

我在构建以下更新时遇到了性能问题:

表POI(兴趣点)包含1000万条记录,包含经度和纬度字段(从OSM提取)

Table City包含世界上大多数城市的145,000条记录,还包含经度和纬度字段

我想将表POI中的外键City_ID(此字段中没有数据)与city表中的主ID相关联。完成后,我将能够将所有POI与城市相关联。我已经尝试过反向地理编码,但事实证明这是一次糟糕的经历,我不知道如何反转地理编码1000万条记录,因此我打赌将最近的城市带到每个POI。但似乎我的SQL查询在我的全新Macbook Pro 2015上带有16个演出或RAM。我在这里做的事情还不错......所有lat和long字段都在MySQL数据库中编入索引

我尝试过以下查询:

update poi
set (poi.city_ID, poi.distance) = 

(    select city.ID,
      MIN(111.045* DEGREES(ACOS(COS(RADIANS(poi.latitude))
                 * COS(RADIANS(city.latitude))
                 * COS(RADIANS(poi.longitude) - RADIANS(city.longitude))
                 + SIN(RADIANS(poi.latitude))
                 * SIN(RADIANS(city.latitude))))) AS distance_in_km
     FROM city 
)

Halp!

干杯

范数。

1 个答案:

答案 0 :(得分:0)

对存储为浮点数的两个单独的lat和lon列进行索引无济于事。您需要利用数据库的空间特征,将纬度/经度位置存储在单个地理类型列中,并在该列上创建空间索引。有关MySQL空间特征的详细信息,请参阅此article