3

我有一个带有客户邮政编码的数据库,我想创建一个页面,用户在其中输入邮政编码并选择例如 50 英里并按搜索,然后该页面应显示所有其他邮政编码在这 50 范围内的客户英里。
表示在 50 英里半径内的给定邮政编码附近。
是否有 API、Lib 或其他东西可以给我这个功能?

4

3 回答 3

3

如果您使用的是 sql 2008 或更高版本,您可以使用 sys.geography 数据类型将您的位置数据存储在数据库中,并让服务器为您进行计算。这样你就可以保存你的 API 调用来做其他事情。

如果您使用某种地理编码服务(如 Google Maps 或 Bing)来获取和存储邮政编码的位置数据,则此方法有效。

我用一个简单的存储过程完成了这个,在我的最新项目中效果很好

CREATE PROCEDURE [dbo].[RadiusSearch]
    @point varchar(500),
    @distance int
AS
begin
    declare @geoPoint geography
    set @geoPoint = geography::STGeomFromText('POINT (' + @point + ')', 4326).STBuffer(@distance / 0.0006213712)
    select [Whatever fields and inner joins you need to get the info you wanted]
    where ClientZipCodes.Geolocation.STIntersects(@geoPoint) = 1
end

所以基本上我正在做的是将点数据作为字符串传递并将其转换为二进制地理点数据(因为在这种情况下,我正在从网页的异步 javascript 调用中设置存储的过程,这是不必要的如果您直接从数据库中查询地理数据),将距离变量设置为英里(这需要转换,因为默认测量单位是米),然后告诉它给我任何记录有地理定位点与我们刚刚设置的缓冲区相交向上。轻松小便,快速启动。

于 2013-10-18T21:23:46.740 回答
2

更好的解决方案:

使用Google Maps Places API并插入您的客户的自定义位置,如下所示

然后,您可以请求特定半径内的自定义地点列表,甚至可以使用这个简单的 http url 按它们与当前地点的接近程度进行排序

https://maps.googleapis.com/maps/api/place/nearbysearch/output?parameters

如果您希望根据距离对其进行排序,则可以radius in meters选择参数在哪里。这将返回 JSON 以及该半径内的所有客户位置rankby distance

请参阅内容以了解如何搜索


除了使用谷歌地图 API 之外,您还可以在地图上显示一个具有指定半径的圆圈以及其中的所有客户......那看起来很酷......

于 2013-10-18T18:45:08.853 回答
1

你可以得到免费的邮政编码数据库(我不提供链接,你可以通过谷歌来做)里面有纬度和经度,然后你可以很容易地计算每个邮政编码之间的距离,以英里为单位,然后你就可以选择所有的邮政编码在任何半径

于 2013-10-18T18:36:38.147 回答