通过匹配邮政编码字符串查找最接近其他英国邮政编码的英国邮政编码

Posted

技术标签:

【中文标题】通过匹配邮政编码字符串查找最接近其他英国邮政编码的英国邮政编码【英文标题】:Find UK PostCodes closest to other UK Post Codes by matching the Post Code String 【发布时间】:2011-04-11 16:09:06 【问题描述】:

这是一个让我醒了好几天的问题。到目前为止,我得出的唯一结论是 Red Bull 通常不会帮助编码人员。

我的应用程序中有一个场景,我有几份工作(1 到 50 个)。该工作有一个地址,我有一个地址的以下属性:邮政编码、纬度和经度。

我还有一张工人表,他们也有地址。虽然工作或工人是通过屏幕创建的,但我使用 Google 地图查询来确保提供的邮政编码有效并且在英国,因此所有地址都经过验证。

我正在使用调度程序控件在 y 轴上显示一些工作人员,在 x 轴上显示时间线。每个作业都有一个日期,并且只能在作业日期的调度程序上垂直移动。用户选择多个作业,它们将显示在靠近调度程序的篮子中。然后,用户可以针对工作人员拖放作业。所有这些都是手动的,所以它可以工作。

我的任务是自动执行此操作,以便用户除了验证和分配工作之外不需要做太多事情。因此,我必须自动化这个过程。

每个工人都有一个名为 WillingMaximumDistanceTravel 的属性,它是一个整数,代表英里,工人愿意为工作而旅行。

现在令人头疼的是:我有超过 1500 名工人。我有一个实用函数,它使用 Newtonsoft 的 Json Convert 来反序列化来自谷歌地图的响应流。我需要输入邮政编码 A 和 B。

我还计划向 DB 引入一个新表,以将找到的距离存储为邮政编码 A、邮政编码 B 和距离。因此,如果我发现自己再次比较相同的邮政编码,我只会从 DB 中检索结果,并且慢慢地,最终,我将不再需要打扰 Google,因为该表会非常全面。

我不能使用简单的 Haversine 公式,因为我不要求 Crow-fly 路径。这样做的痛苦是需要花费大量时间来计算。有些工人可以行驶超过 10 英里,而有些则从 15 英里到 80 英里不等。我必须从列表中选择第一份工作,并与系统中每个适用的工人一起运行它!我想知道英国邮政编码有一个模式。如果我们对英国邮政编码列表进行排序,我们能否根据字母数字模式粗略估计,我们将在哪里达到 100 英里标记、200 英里标记等等?

如果有人对代码感兴趣,请留言,我会贴上去。

【问题讨论】:

好的,我有这个 SQL 查询。为了在附近搜索,我在纬度和经度上加减 0.100000: 嗨@HassanGulzar - 这个查询运气好吗?您是否找到任何工具/文件将给定的英国邮政编码映射到最接近的英国邮政编码? 你好,@DanielaRodrigues!我相信我做到了,因此我可以按需调用付费版本的 Google Maps API,而不是预先计算系统中每个地址之间的距离。一旦用户进行调度,系统将仅针对所涉及的地址求解距离。已经很久了。 【参考方案1】:

(我为 Google 工作,但我不代表 Google 发言。我与地图 API 无关。)

我怀疑这对于使用 Google Maps API 来说不是一个很好的情况,仅仅是因为您要通过大量数据。你真的不想提出那么多请求,即使你可以在directions limits 下这样做。

当我在之前的工作中处理类似的事情时,我们购买了本地托管的地图 API - 但即使这样也不够快,无法完成此类工作。我们最终预先计算了从每个邮政编码“区域”的质心出发的时间(可能是错误的名称,但邮政编码的第一部分后跟余数的第一位,例如“SW1W 9”代表“SW1W 9TQ” ") 到其他所有区域,将结果存储在一个巨大的表中。我认为我们只对 100 英里或类似范围内的邮政编码进行了处理,以减少预处理量。

即便如此,一个简单的数据库并没有我们想要的那么快 - 所以我们将结果存储在一个巨大的文件中,每个源/目标对只有一个字节。 (我们有一个固定的源邮政编码和目标邮政编码序列,所以我们不需要指定这些。)此时,计算行程时间包括:

计算邮政编码区域(子字符串工作) 在序列中查找每个邮政编码区域的索引 检查我们是否加载了文件的那一部分(我们延迟加载以提高启动速度) 必要时加载行,否则只访问它

字节的准确度是浮动的,所以前 60 分钟是按每分钟计算的,然后每个额外的值意味着额外的 2 分钟,然后是 5 分钟,依此类推。(这些不是确切的值,但就是这样。)

当您找到“优秀的候选人”后,您当然可以向现场 API 或 Google Maps API 询问更准确的确切邮政编码方向。

【讨论】:

我理解这种担忧。这就是为什么我想在进行任何 Google Call 之前对此进行研发。我想我会更加摸不着头脑。【参考方案2】:

您想查找空间索引或空间填充曲线。空间索引将 2d 问题简化为 1d 问题,并递归地将表面细分为更小的块,但它基本上是块的重新排序。您可以使用索引或使用 4 个字符的字符串来细分曲面。后一种可能对您有用,因为它可以让您在数据库引擎中隐藏所有字符串操作来查询字符串。您想查找 Nick 的空间索引四叉树希尔伯特曲线博客。

【讨论】:

学习算法推荐。谢谢。 感谢您的投票。我在 phpclasses.org (hilbert-curve) 上为 php 中的邮政编码查找编写了一个四叉树实现。它为每个邮政编码使用字符串索引。

以上是关于通过匹配邮政编码字符串查找最接近其他英国邮政编码的英国邮政编码的主要内容,如果未能解决你的问题,请参考以下文章

SQL中最接近的部分字符串匹配

英国邮政编码列表 - 最近的五个邮政编码列表

正则表达式匹配英国邮政编码

获取当前邮政编码,并显示来自 NSArray 的最接近的结果

仅获取英国邮政编码的第一部分

正则表达式匹配英国邮政编码的前半部分