如何表示地理位置查找的街道地址范围?
Posted
技术标签:
【中文标题】如何表示地理位置查找的街道地址范围?【英文标题】:How to represent street address ranges for geo location lookups? 【发布时间】:2011-02-26 13:54:40 【问题描述】:我有以下类型的输入:
Zone 1 =>
Alabama street, 1 to 135, west side
Alabama street, 2 to 144, east side
Bahama square, 2 to 4
Zone 2 =>
Bahama square, 5 to 8
Cecil street, 3 to 27
等等
这些数据代表一个区域内的某些区域。就像城市中的一个小区域,由几条封闭的街道定义。
如果给定了一个地理位置(纬度、经度),我如何将此值映射到上述上下文中的区域?很明显,谷歌地图查找会给我地址,但是如何从那里开始呢?表示此类数据(地址范围)以进行有效区域建立的最佳方式是什么?
(哇,1 内有 3 个问题)
【问题讨论】:
【参考方案1】:假设您将依赖外部资源(如 Google 或 Yahoo PlaceFinder)进行反向地理编码,您将获得街道编号和街道(假设城市、州等都匹配)。一旦你有了街道和门牌号,就可以查询你的区域“数据库”了。
因此,您真正需要的是一个索引来帮助您识别正确的区域。您可以选择对街道编号、街道名称或两者的组合进行索引。例如,假设您使用像 Yahoo PlaceFinder 这样的常量源,可以安全地假设您获得的输出将被标准化,并且使用(街道号码,街道)索引可能是可行的。
但是,在街道名称的规范化形式上创建索引可能会更稳健(即,由于名称+数字变化而不易出错)。当您查询索引时,您将询问每个街道节点以查看您拥有的数字是否在该范围内。
因此,例如,您的索引可能如下所示:
w. alabama ==> 1 <to> 135 ==> zone 1
e. alabama ==> 2 <to> 144 ==> zone 1
bahama ==> 2 <to> 4 ==> zone 1
==> 5 <to> 8 ==> zone 2
etc.
以上显示我已经以与我的外部反向地理编码器同步的方式对街道地址(大小写加上“west”与“east”之类的内容)进行了标准化。然后我在索引的第二级实现范围查找(这就是我写的原因,暗示您需要实现该逻辑),这样我就不必枚举它们之间的所有数字。 注意:这里的格式/表示形式的许多细节将取决于您的反向地理编码源所遵循的惯例,因此您必须考虑此数据的规范/规范化形式,否则您会得到很多假阴性。
当然,您可以在关系数据库的帮助下完成大部分工作,具体取决于它们对范围索引的支持。但是,如果您手边没有一个或不想与一个集成,我认为上述自定义索引会起作用。
【讨论】:
很好而彻底的答案。但是它没有解决以下问题:我有地址“Zeta street 5”,它位于由 6 条街道定义的区域 1,它们都不是 Zeta。如何获得这条街道的正确区域? 嗯,我刚刚意识到我需要重新表述我的问题,因为您的回答非常适合我的要求,但实际上我需要的不止这些。【参考方案2】:我将尝试回答后续问题。我假设 1 区的街道 1 .. 6 是主要街道,Zeta 是地址范围内这些街道之间的一条小街。
我的解决方案是为区域形成一个 shapefile,然后检查要检查的地址的 lat/lng 是否在 shapefile 中。以下是一些方法细节:
使用反向 API 获取每个街道端点的纬度/经度(例如,1 w. alabama、135 w. alabama 等)。
使用这些端点在您的区域周围创建一个多边形形状(shapefile)。
使用反向 API 获取要检查的地址的 lat/lng。
检查该纬度/经度是否在多边形形状内。
如果您决定使用按地址匹配,这里是美国邮政地址标准的链接。您可以使用此标准来规范您的地址。
http://pe.usps.gov/text/pub28/welcome.htm
安德鲁 OpenGeoCode.Org 的团队
【讨论】:
以上是关于如何表示地理位置查找的街道地址范围?的主要内容,如果未能解决你的问题,请参考以下文章
在 iPhone 上进行反向地理编码 - 获取准确的街道号码