如何用SQLSERVER数据库计算距离并像MapInfo一样圈选数据 在MapInfo因为版权的问题不让使用和存在大量的经纬度数据计算的背景下,本人提供3种方法进行经纬度的计算和Buffer数据圈选。(要求你有一点数据库的基础) 准备工作准备一张基础数据表,表数据和表头如下,表名:T1 在该表数据基础上面增加空间字段(这一步很重要),表名:T1_Point SELECT [Site_Name_Chinese] ,[Site_Name_English] ,[CGI] ,[gNBId] ,[经度] ,[纬度] ,geography::STGeomFromText('POINT('+convert(varchar(50),[经度])+ ' '+convert(varchar(50),[纬度])+')', 4326) [经纬度点] into [T1_POINT] FROM [dbo].[T1] 新表数据展示 新表空间点展示 方法一(利用自定义函数计算距离)方法1需要在sql server进行自定义计算经纬度函数,具体函数如下: 计算方法: SELECT * ,[dbo].[fnGetDistance] (A.[经度],A.[纬度],B.[经度],B.[纬度]) [DIS] FROM [dbo].[T1] A,[dbo].[T1] B where [dbo].[fnGetDistance] (A.[经度],A.[纬度],B.[经度],B.[纬度])<=500 解释一下: 直接像调用系统函数如max(),avg()一样调用该自定义函数进行求两个点的距离。 方法二(利用空间类型数据进行计算距离)计算方法: SELECT * ,A.[经纬度点].STDistance(B.[经纬度点]) distance FROM [dbo].[T1_Point] A,[dbo].[T1_Point] B where A.[经纬度点].STDistance(B.[经纬度点])<=500 解释一下: 将度量该实例与调用 STDistance() 的实例之间的距离。 如果 other_geography 是一个空集,则 STDistance() 返回 null。 方法三(利用空间类型数据制造Buffer对点数据进行圈选)计算方法: SELECT * ,A.[经纬度点].STDistance(B.[经纬度点]) distance FROM [dbo]. [T1_Point] A,[dbo]. [T1_Point] B where A.[经纬度点].STBuffer(500).STContains(B.[经纬度点])=1 解释一下: STBuffer为geography的缓冲区,同mapinfo的buffer类似,里面的500指的是500米范围内。 STContains()为调用 geography 实例在空间上包含传递给该方法的 geography 实例,则返回 1;否则,返回 0。 如果两个 geography 实例的 SRID 不同,则返回 null。 大白话就是以第一个点制作的buffer区域是否包含第二个里面的点 本人无不为,QQ345071917,本人愿意和大家一起共同学习!!!
|