一、位置服务(搜索周边商家POI)
- 自身有海量的周边搜索数据,并且一定要有经纬度坐标;(数据来源可以从网上购买,如果要直接从地图API中获取,那是要付费的,而且费用不菲)
- 手机定位后将经纬度发送给服务器,服务器根据经纬度在数据库中匹配数据,并按照距离由近到远排序(此处省略一万字...)
SQL实现经纬度匹配以及距离排序代码
1、SQL计算经纬度距离的自定义函数
CREATE FUNCTION dbo.GetDistance ( @LatBegin REAL , @LngBegin REAL , @LatEnd REAL , @LngEnd REAL ) RETURNS FLOAT AS BEGIN DECLARE @Distance REAL DECLARE @EARTH_RADIUS REAL SET @EARTH_RADIUS = 6378.137 DECLARE @RadLatBegin REAL, @RadLatEnd REAL, @RadLatDiff REAL, @RadLngDiff REAL SET @RadLatBegin = @LatBegin * PI() / 180.0 SET @RadLatEnd = @LatEnd * PI() / 180.0 SET @RadLatDiff = @RadLatBegin - @RadLatEnd SET @RadLngDiff = @LngBegin * PI() / 180.0 - @LngEnd * PI() / 180.0 SET @Distance = 2 * ASIN(SQRT(POWER(Sin(@RadLatDiff / 2), 2) + COS(@RadLatBegin) * COS(@RadLatEnd) * POWER(SIN(@RadLngDiff/2),2))) SET @Distance = @Distance * @EARTH_RADIUS --SET @Distance = Round(@Distance * 10000) / 10000 RETURN @Distance * 1000 END
2、获取周边数据的存储过程
CREATE PROCEDURE Up_Data_GetPOI @lngbegin nvarchar(50), --当前经度 @latbegin nvarchar(50), --当前纬度 @distance int, --搜索半径,单位为米 @WhereStr nvarchar(200) --附加搜索条件,如and 1=2 AS declare @SqlStr nvarchar(2000) set @SqlStr='select *, dbo.GetDistance('+@latbegin+','+@lngbegin+',纬度字段,经度字段) as distance from [存储商家的数据表名] where (纬度字段<>'' and 经度字段<>'') and dbo.GetDistance('+@latbegin+','+@lngbegin+',纬度字段,经度字段)<'+Convert(nvarchar(10),@distance)+' '+@WhereStr+' order by distance asc' --print @SqlStr Execute Sp_ExecuteSql @SqlStr GO
二、位置交友
- 要有会员数据,同样也得有客户端是否在线以及经纬度的字段(不一定要获取到经纬度,默认为空)
- 手机客户端定位后,更新该会员的经纬度坐标以及客户端在线状态
- 通过上面的SQL代码即可实现数据列表,只要输出JSON/XML给手机客户端解析即可