我有一个带有客户邮政编码的数据库,我想创建一个页面,用户输入一个邮政编码并选择例如50英里并按搜索,然后该页面应该显示所有其他具有该范围的邮政编码的客户这50英里 在50英里范围内的给定邮政编码附近的手段 是否有API,Lib或其他什么东西可以给我这个功能?
答案 0 :(得分:3)
如果您使用的是sql 2008或更高版本,则可以使用sys.geography数据类型将您的位置数据存储在数据库中,让服务器为您进行计算。这样,您可以将API调用保存为其他内容。
如果您使用某种地理编码服务(如Google地图或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调用中引出存储过程,如果您直接从数据库查询地理数据,这是不必要的),将距离变量设置为英里(这需要转换,因为默认测量值以米为单位),然后告诉它给我任何记录具有与缓冲区相交的地理位置点我们刚刚成立。容易过敏,快速启动。
答案 1 :(得分:2)
更好的解决方案:
使用Google Maps Places API并按照给定的here
插入客户的自定义位置然后,您可以申请一个半径范围内的自定义地点列表,甚至可以使用这个简单的http网址排序它们与当前地点的距离
https://maps.googleapis.com/maps/api/place/nearbysearch/output?parameters
如果您希望它按照距离排序,则参数者将为radius in meters
,并且可选rankby distance
。这将返回JSON,其中包含该半径内的所有客户位置
请参阅this了解如何搜索
除了使用Google地图API之外,您还可以在地图上显示指定半径的圆圈以及其中的所有客户......这看起来很酷..
答案 2 :(得分:1)
你可以获得免费的邮政编码数据库(我不提供链接,你可以通过谷歌这样做)里面的经纬度,然后你可以轻松计算每个邮政编码之间的距离,英里,然后你就可以选择任意半径的所有邮政编码