如今,大多数餐馆和其他企业在其网站上都有“查找位置”功能,其中列出了给定地址/邮编的最近位置。这是如何实施的?将邮政编码与 DB 匹配是一种简单易行的方法,但可能并不总是有效,例如,可能有一个靠近给定位置的分支,但可能位于不同的邮政编码中。我想到的一种方法是将给定的邮政编码/地址转换为地图坐标并列出落入预定义半径的任何分支。我欢迎您对如何实现这一点的想法。如果可能,请提供更详细的实现细节,例如使用的任何 Web 服务等,
8 回答
许多地理空间框架将帮助您解决这个问题。在地理空间世界中,邮政编码只是一个“多边形”,它只是地图上定义清晰边界的区域(不是数学意义上的多边形)。例如,在 SQL 2008 空间中,您可以基于原始多边形创建一个新多边形。因此,您可以动态创建一个多边形,该多边形是您的邮政编码在每个点上扩展一定距离。它考虑了邮政编码的时髦形状。有了地址,这很容易,因为您只需创建一个多边形,它是一个围绕一个点的圆。然后,您可以查询以任一方法创建的新多边形内的所有点。
很多这些网站基本上就是这样做的。它们为您提供 5 英里扩展多边形内的所有点,然后可能是 10 英里扩展多边形,依此类推。他们实际上并没有计算距离。网络上的大多数 ma 东西一点也不复杂。
您可以在此处查看一些基本示例,以大致了解我在说什么。
有一个标准的邮政编码/位置数据库可用。这是 Access 格式的一个版本,其中包括邮政编码的纬度/经度以及其他信息。然后,您可以使用 PostgreSQL GIS 扩展来搜索位置。
(当然假设您提取访问数据库并插入更友好的数据库,如 PostgreSQL)
首先,您对地址进行地理编码,将其转换为(通常)纬度和经度。然后,您对数据库执行最近邻查询以查找兴趣点。
大多数空间索引不直接支持最近邻查询,所以这里常用的方法是在一个合理大小的边界框上进行查询,地理编码点位于中心,然后在内存中对结果进行排序以选择最接近的结果。
就像你说的那样。将地址/ZIP 转换为 2D 世界坐标,并将其与其他已知位置进行比较。选择最近的。:) 我认为一些数据库(Oracle,MSSQL 2008)甚至提供了一些可以提供帮助的功能,但我从未使用过它们。
我认为这是相当普遍的。他们获取地址或邮政编码并将其转换为“地图坐标”(取决于实施方式,可能是纬度/经度),然后使用数据库中事物的“地图坐标”很容易计算距离。
请注意,一些糟糕的实现会将邮政编码转换为代表邮政编码区域中心的坐标,这有时会产生不好的结果。
你对如何做的想法就是我可能会如何做。您可以对 zip 的坐标进行地理编码,然后在此基础上进行计算。我知道 SQL Server 2008 有一些特殊的新功能可以帮助基于这些地理编码的 lon/lat 坐标进行查询。
有实际的几何算法和/或数据结构支持对点、线和/或区域数据的较低 O(...) 最近位置查询。
请参阅本书作为其中一些信息的示例,例如:Voronoi 图、四叉树等。
但是,我认为这里的其他答案在您今天在软件中找到的大多数情况下都是正确的:
- 地理编码(单个点)搜索区域
- 边界框查询以获得初始球场
- 在内存排序/选择中
我有一个表,我每 6 个月编译一次数据库表,它包含 3 列,我将它用于澳大利亚的一些客户,它包含大约 40k 行,运行查询非常轻量级。如果只是想为客户准备一些东西,这很快
- 邮政编码来自
- 邮政编码
距离
SELECT Store_ID, Store_AccountName, Store_PostalCode, Store_Address, Store_Suburb, Store_Phone, Store_State, Code_Distance FROM Store, (SELECT Code_To As Code_To, Code_Distance FROM Code WHERE Code_From = @PostalCode UNION ALL SELECT Code_From As Code_To, Code_Distance FROM Code WHERE Code_To = @PostalCode UNION ALL SELECT @PostalCode As Code_To, 0 As Code_Distance) As Code WHERE Store_PostalCode = Code_To AND Code_Distance <= @Distance ORDER BY Code_Distance
你可以做很多优化来加速这个查询!