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

时间:2011-04-11 16:09:06

标签: c#-4.0 map distance postal-code

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

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

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

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

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

每个工人都有一个名为WillingMaximumDistanceTravel的属性,这是一个代表里程的整数,工人愿意去找工作。

现在这里很头疼:我有超过1500名工人。我有一个实用程序函数,它使用Newtonsoft的Json Convert来反序列化来自Google Maps的响应流。我需要提供邮政编码A和B.

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

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

如果有人对代码感兴趣,请删除一行,然后将其粘贴。

2 个答案:

答案 0 :(得分:1)

(我在Google工作,但我不代表Google发言。我与地图API没有任何关系。)

我怀疑使用Google Maps API并不是一个很好的情况,因为你正在推动这么多数据。你真的不想发出那么多请求,即使你可以在directions limits下完成。

当我在之前的工作中处理类似的事情时,我们购买了一个本地托管的地图API - 但即便如此,这种工作还不够快。我们最终预先计算了从每个邮政编码“区域”的质心开始的时间(可能是错误的名称,但邮政编码的第一部分后跟剩余部分的第一个数字,例如“SW1W 9”表示“SW1W 9TQ” “)到其他所有区域,将结果存储在一张巨大的桌子上。我认为我们只为100英里或类似的邮政编码做了这件事,以减少预处理量。

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

  • 制定邮编区域(子串工作)
  • 查找序列中每个邮政编码区域的索引
  • 检查我们是否加载了文件的那部分(我们为启动速度加载了延迟)
  • 如有必要,请加载行,否则只需访问

这些字节的精确度是滑动的,因此对于前60分钟它是每分钟,然后每个额外的值意味着额外的2分钟,然后是5等。(这些不是确切的值,但它就是这样的。)

当您找到“好的候选人”时,您可以询问现场API或Google Maps API,以获得有关完全邮政编码的更准确说明。

答案 1 :(得分:1)

您想要寻找空间索引或空间填充曲线。空间索引将2d问题减少为1d问题,并且recursivley将表面细分为更小的图块,但它基本上是图块的重新排序。您可以使用索引或字符串使用4个字符细分曲面。后一个对您有用,因为它允许您使用隐藏在数据库引擎中的所有字符串操作来查询字符串。你想要寻找Nick的空间索引quadtree hilbert-curve博客。