我正在尝试创建一个Python脚本,它将以地址为输入,并输出其纬度和经度,或在多个匹配项的情况下输出多个纬度和经度,就像Nominatim一样。
因此,可能的输入和输出如下:
但问题在于用户可能提供不完整的地址,例如2、4和5。
因此,我接下来考虑使用搜索树,并在每个节点中存储完全合格的地址。但这也很糟糕,因为:
- 这将在每个节点中存储高度冗余的数据。由于这将是一个非常大的数据,因此空间保留至关重要。 - 它将无法利用用户缩小搜索空间的事实。
我有一个额外的要求。我需要检测拼写错误。我想这将必须作为一个单独的问题处理,并将每个节点视为通用字符串。
更新1
稍作解释。输入将是一个列表,其中较低索引上的项是较高索引上的项的父项;它们当然可以是或不是直接父项或子项。因此,对于查询1,输入将是["USA","NEW YORK"]。因此,
用户应该能够找到建筑物,如果他有地址,而我们的数据是如此详细。
更新2(省略案例)
如果用户查询“Pearl Street, USA”,那么我们的算法应该能够定位到该地址,因为它知道“Pearl Street”有“New York”作为父级,而“USA”是其父级。
更新3(剩余情况):
假设用户查询“101 C, Alley A, Pearl Street, New York”。还假设我们的数据确实知道“101 C”,但不知道“Alley A”。根据它,“101 C”是“Pearl Street”的直接子项。即使在这种情况下,它也应该能够找到地址。
因此,可能的输入和输出如下:
- 输入: 美国纽约 => 输出: 纽约 (纬度:x1 经度:y1)
- 输入: 纽约 => 输出: 纽约 (纬度:x1 经度:y1)
- 输入: 美国纽约珍珠街 => 输出: 珍珠街 (纬度:x2 经度:y2)
- 输入: 美国珍珠街 => 输出: 珍珠街 (纬度:x2 经度:y2), 珍珠街 (纬度:x3 经度:y3)
- 输入: 珍珠街 => 输出: 珍珠街 (纬度:x2 经度:y2), 珍珠街 (纬度:x3 经度:y3)
- 输入: 美国纽约Alkazam大街103号 => 输出: 纽约 (纬度:x1 经度:y1)
在第6个例子中,由于找不到地址为美国纽约Alkazam大街103号
的地点,因此返回了美国纽约
。
起初,我考虑构建一棵树来表示层级关系,其中兄弟节点按字母顺序排序。它可能会像这样:
GLOBAL
|
---------------------------------------------
| | ...
USA
---------------
| | ...
CALIFORNIA NEW YORK
| |
----------- -------------
| |.. | |....
PEARL STREET PEARL STREET
但问题在于用户可能提供不完整的地址,例如2、4和5。
因此,我接下来考虑使用搜索树,并在每个节点中存储完全合格的地址。但这也很糟糕,因为:
- 这将在每个节点中存储高度冗余的数据。由于这将是一个非常大的数据,因此空间保留至关重要。 - 它将无法利用用户缩小搜索空间的事实。
我有一个额外的要求。我需要检测拼写错误。我想这将必须作为一个单独的问题处理,并将每个节点视为通用字符串。
更新1
稍作解释。输入将是一个列表,其中较低索引上的项是较高索引上的项的父项;它们当然可以是或不是直接父项或子项。因此,对于查询1,输入将是["USA","NEW YORK"]。因此,
USA, New York
没有返回结果是完全可以的。用户应该能够找到建筑物,如果他有地址,而我们的数据是如此详细。
更新2(省略案例)
如果用户查询“Pearl Street, USA”,那么我们的算法应该能够定位到该地址,因为它知道“Pearl Street”有“New York”作为父级,而“USA”是其父级。
更新3(剩余情况):
假设用户查询“101 C, Alley A, Pearl Street, New York”。还假设我们的数据确实知道“101 C”,但不知道“Alley A”。根据它,“101 C”是“Pearl Street”的直接子项。即使在这种情况下,它也应该能够找到地址。