【发布时间】:2012-04-24 19:48:04
【问题描述】:
我正在尝试创建一个 Python 脚本,该脚本将地址作为输入并吐出它的纬度和经度,或者在多个匹配的情况下吐出纬度和经度,就像Nominatim。
因此,可能的输入和输出可能是:-
- 输入: 美国纽约 => 输出: 纽约(纬度:x1 经度:y1)
- 输入: 纽约 => 输出: 纽约(lat:x1 lon:y1)
- 输入: 美国纽约珍珠街 => 输出: 珍珠街(纬度:x2 经度:y2)
- 输入: 美国珍珠街 => 输出: 珍珠街 (lat:x2 lon:y2),珍珠街 (lat:x3 lon:y3)
- 进: 珍珠街=> 出: 珍珠街(lat:x2 lon:y2),珍珠街(lat:x3 lon:y3)
- 输入: 103 Alkazam,纽约,美国 => 输出: 纽约(纬度:x1 经度:y1)
在上面的6中,由于没有找到地址为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 的直系孩子。即使在这种情况下,它也应该能够找到地址。
【问题讨论】:
-
那么唯一的位置是街道,还是街道和城镇/城市,或者是街道(即珍珠街 63 号)、街道和城镇/城市,还是更多?
-
可以是平号、街道、城镇/城市、州、国家。任何部分都可能丢失。
-
我认为标签 [missing-data] 在这里比较合适。
-
通过丢失数据我的意思是它在用户的查询中丢失。例如,检查上面的查询 4。它没有
New York。我们的数据可能非常详细,也可能不非常详细。所以,在这种情况下,用户说,找我Pearl Street,它在USA,这应该可以工作,因为我们的数据知道虽然它不是直接在USA,但通过New York它是。 -
@AppleGrew - 我试图在给出太多答案与剥夺解决问题的所有乐趣之间取得平衡,或者没有提供足够的帮助,并造成挫败感(每个人都有他们自己的哲学)。你 :-)'d 的事实表明,也许我说得对,你有一个“尤里卡”时刻:-)
标签: python openstreetmap geocoding large-data-volumes large-data