我正在尝试创建一个 Python 脚本,该脚本将地址作为输入,并会吐出它的纬度和经度,或者在多个匹配的情况下吐出纬度和经度,就像Nominatim一样。
因此,可能的输入和输出可能是:-
- 输入:美国纽约=> 输出:纽约(纬度:x1 经度:y1)
- 输入:纽约=> 输出:纽约(纬度:x1 经度:y1)
- 输入:美国纽约珍珠街=> 输出:珍珠街(纬度:x2 经度:y2)
- 输入:美国珍珠街=> 输出:珍珠街(纬度:x2 经度:y2),珍珠街(纬度:x3 经度:y3)
- 进:珍珠街=> 出:珍珠街(纬度:x2 经度:y2),珍珠街(纬度:x3 经度:y3)
- 输入: 103 Alkazam,纽约,美国=> 输出:纽约(纬度:x1 经度:y1)
在上面的 6 中,由于没有找到带有 address 的地方,所以返回了 New York 103 Alkazam, New York, USA
,但它至少可以找到New York, USA
。
最初我想建立一个树来表示兄弟姐妹按字母顺序排序的层次关系。可能是这样的:-
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
。即使在这种情况下,它也应该能够找到地址。