0

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

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

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

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

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

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

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

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

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

如果有人对代码感兴趣,请留下一行,我会粘贴它。

4

2 回答 2

1

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

我怀疑这不是使用 Google Maps API 的好情况,仅仅是因为您要通过大量数据。你真的不想提出那么多请求,即使你可以在方向限制下这样做。

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

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

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

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

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

于 2011-04-11T16:17:08.657 回答
1

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

于 2011-04-11T16:19:10.887 回答