mysql-如何有效地将数百万个地点与其最近的城镇/城市进行匹配?

mysql-如何有效地将数百万个地点与其最近的城镇/城市进行匹配?,mysql,spatial-index,Mysql,Spatial Index,有这两张桌子。(A) 包含由横向/纵向数据定义的位置。(B) 是一个城市字典,每个城市的质心由lat/long数据定义。任务是为每个位置(在A中找到)找到最近的城市(在B中找到) 是否有一种方法可以通过计算连接(例如a.lat和B.lat之间的最小绝对差+a.long和B.long方法)立即更新a 现在我逐行处理表,但这很耗时 你会怎么做?如果你加入,MySQL也会这么做:对每一行进行耗时的一行计算。加入并不会让它更快。您必须为一行选择您的代码(例如,使用)。您可能仍然希望分批执行,因为这仍然需

有这两张桌子。(A) 包含由横向/纵向数据定义的位置。(B) 是一个城市字典,每个城市的质心由lat/long数据定义。任务是为每个位置(在A中找到)找到最近的城市(在B中找到)

是否有一种方法可以通过计算连接(例如a.lat和B.lat之间的最小绝对差+a.long和B.long方法)立即更新a

现在我逐行处理表,但这很耗时


你会怎么做?

如果你加入,MySQL也会这么做:对每一行进行耗时的一行计算。加入并不会让它更快。您必须为一行选择您的代码(例如,使用)。您可能仍然希望分批执行,因为这仍然需要一段时间;您可以尝试进行预筛选:例如,靠近法国巴黎的位置将最靠近靠近巴黎的城市,而不是靠近华盛顿特区的城市,因此您可以节省一些距离计算。一种方法是使用逐步舍入的值,迭代尝试在lat/long上进行精确匹配。i、 e.第一次尝试是使用6位小数精度将位置与城市质心匹配,然后使用5位小数四舍五入,然后使用4位小数等。在2M+位置上进行的测试运行速度比迭代计算最接近的匹配速度至少快3个数量级。结果不同,但不清楚哪种方法更好。当一个位置在一个大城市的外围被小地方包围时,匹配城市质心会产生很差的结果。是的,这是一种做预滤波部分的方法。巴黎和马赛的拉特/朗比马赛和华盛顿特区的拉特/朗更接近四舍五入。只需注意你如何绕圈,100.94°可能比100.86°更接近101.01°,北极1°的距离比赤道1°的距离更大(以“km”为单位)。不过,在使用lan/long相似性对可能的候选对象进行预筛选后,您仍然应该计算实际距离,这基本上是使用一个围绕城市的矩形;由于计算距离的代价很高,所以仍然使用gis功能,因为它们要快得多。。。四舍五入lat/long上的匹配不属于预筛选。当前数据的精度为6位小数(约6英寸/10厘米)。因此,一种方法不是以荒谬的精度计算位置和城市质心之间的(全部)距离,而是在较低的分辨率下寻找是否存在精确匹配。给大城市更多的权重(即更低的分辨率)似乎改善了整个过程。但关键的区别在于,不同分辨率下的精确匹配要比计算每个距离快得多。(最终将发布一个更完整的答案)。如果它对你有效,那就好了。然后你基本上是“预筛选”到一个可能的候选人,然后接受它。但是,一旦您得到多个候选对象(这将以更高的“分辨率”发生,并且如果您执行类似于
update…join on roundfct()=roundfct()
,您可能看不到这些候选对象),因为这将只需要在所有可能的候选对象中选择一个,而不必抱怨),您仍然需要计算精确的距离(但只针对这些经过预筛选的候选者)。这就是我称之为预筛选的原因。但正如我所说的,如果它起作用,就可以了。如果你加入,MySQL也会做到这一点:对每一行进行耗时的一行计算。加入不会加快速度。你将不得不对一行代码进行优化(例如,使用。您可能仍然希望分批进行,因为这仍然需要一段时间;您可以尝试进行预筛选:例如,靠近法国巴黎的位置将最靠近巴黎的城市,而不是靠近华盛顿特区的城市,因此您可以节省一些距离计算。一种方法是迭代尝试加入精确匹配使用逐步四舍五入的值在lat/long上进行s。即,第一次尝试是使用6位小数的精度将位置与城市质心进行匹配,然后使用5位小数进行四舍五入,然后使用4位小数等。在2M+位置上进行的测试运行速度比迭代计算最接近的匹配速度至少快3个数量级。结果不同,但不清楚是哪一个方法更好。当一个位置位于一个大城市的外围,周围环绕着一些小地方时,匹配城市质心会产生很差的结果。是的,这将是做预过滤部分的一种方法。巴黎和马赛的Lat/Long比马赛和华盛顿特区的Lat/Long更接近圆形。注意你的圆形,100.94°可以更接近101.01°而不是100.86°,北极1°的距离也将更大,单位为“km”赤道处的距离大于1°。但在预筛选具有lan/long相似性的可能候选对象后,仍应计算实际距离,这基本上是使用一个围绕城市的矩形;由于计算距离的成本很高,因此仍然使用gis功能,因为它们要快得多。嗯……匹配圆形lat/long不会是预筛选环。当前数据的精度为6位小数(约6英寸/10厘米)。因此,与其以荒谬的精度计算位置和城市质心之间的(全部)距离,一种方法是在较低分辨率下查找是否存在精确匹配。赋予更多权重(即,较低分辨率)对于大城市来说,这似乎改善了整个过程。但关键的区别在于,在不同分辨率下的精确匹配比计算每个距离都要快得多。(最终会给出更完整的答案)。如果它对你有效,那就没问题。那么你基本上是在“预过滤”找到一个可能的候选者并接受它。但是一旦你得到了多个候选者(这将以更高的“分辨率”发生,并且如果你做类似于
update的事情,你可能看不到),加入roundfct()=roundfct()
,因为这只会接受所有可能的候选者中的一个