MSCBSC 移动通信论坛
搜索
登录注册
网络优化工程师招聘专栏 4G/LTE通信工程师最新职位列表 通信实习生/应届生招聘职位

  • 阅读:6206
  • 回复:1
如何用SQL SERVER数据库计算距离并像MapInfo一样圈选数据
无不为
VIP会员
鎵嬫満鍙风爜宸查獙璇


 发短消息    关注Ta 

积分 168
帖子 51
威望 20096 个
礼品券 10 个
专家指数 -87
注册 2011-11-4
专业方向  移动网络优化
回答问题数 0
回答被采纳数 0
回答采纳率 0%
 
发表于 2021-03-31 18:40:17  只看楼主  QQ

如何用SQL SERVER数据库计算距离并像MapInfo一样圈选数据

在MapInfo因为版权的问题不让使用和存在大量的经纬度数据计算的背景下,本人提供3种方法进行经纬度的计算和Buffer数据圈选。(要求你有一点数据库的基础)

准备工作

准备一张基础数据表,表数据和表头如下,表名:T1

T1.png

在该表数据基础上面增加空间字段(这一步很重要),表名: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]

新表数据展示


空间字段.jpg

新表空间数据点展示

空间数据点展示.jpg

方法一(利用自定义函数计算距离)

方法1需要在sql server进行自定义计算经纬度函数,具体函数如下:

CREATE FUNCTION [dbo].[fnGetDistance](@lon1 REAL, @lat1 REAL, @lon2 REAL, @lat2 REAL) RETURNS FLOAT

  AS

BEGIN

  --距离单位(米)

  DECLARE @a_2d REAL,@e_2d REAL,@h_2d Integer,@DEG_2_RAD REAL,@RAD_2_DEG REAL 

  DECLARE @x_rads REAL,@y_rads REAL,@n_2ds REAL,@x_2d REAL,@y_2d REAL,@z_2d REAL,@x_radm REAl,@y_radm REAL,@n_2dm REAL,@x_2d_mark REAL,@y_2d_mark REAL,@z_2d_mark REAL

  DECLARE @curdistance REAL

 

  SET @a_2d = 6378137

  SET @e_2d = 0.00669438

  SET @h_2d = 15

  SET @DEG_2_RAD = 0.01745329252

  SET @RAD_2_DEG = 57.2957795129

 

    SET @x_rads = Abs(@lon1) * @DEG_2_RAD

    SET @y_rads = Abs(@lat1) * @DEG_2_RAD

   

    SET @n_2ds = @a_2d / Sqrt(1 - @e_2d * Sin(@y_rads) * Sin(@y_rads))

   

    SET @x_2d = (@n_2ds + @h_2d) * Cos(@y_rads) * Cos(@x_rads)

    SET @y_2d = (@n_2ds + @h_2d) * Cos(@y_rads) * Sin(@x_rads)

    SET @z_2d = (@n_2ds * (1 - @e_2d) + @h_2d) * Sin(@y_rads)

   

    SET @x_radm = Abs(@lon2) * @DEG_2_RAD

    SET @y_radm = Abs(@lat2) * @DEG_2_RAD

   

    SET @n_2dm = @a_2d / Sqrt(1 - @e_2d * Sin(@y_radm) * Sin(@y_radm))

   

    SET @x_2d_mark = (@n_2dm + @h_2d) * Cos(@y_radm) * Cos(@x_radm)

    SET @y_2d_mark = (@n_2dm + @h_2d) * Cos(@y_radm) * Sin(@x_radm)

    SET @z_2d_mark = (@n_2dm * (1 - @e_2d) + @h_2d) * Sin(@y_radm)

   

    SET @curdistance = (@x_2d_mark - @x_2d) * (@x_2d_mark - @x_2d) + (@y_2d_mark - @y_2d) * (@y_2d_mark - @y_2d) + (@z_2d_mark - @z_2d) * (@z_2d_mark - @z_2d)

    SET @curdistance = Sqrt(@curdistance)

 

    RETURN @curdistance

END

 

计算方法:

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

解释一下:

STBuffergeography的缓冲区,同mapinfobuffer类似,里面的500指的是500米范围内。

STContains()为调用 geography 实例在空间上包含传递给该方法的 geography 实例,则返回 1;否则,返回 0 如果两个 geography 实例的 SRID 不同,则返回 null

大白话就是以第一个点制作的buffer区域是否包含第二个里面的点

如何用SQL SERVER数据库计算距离并像MapInfo一样圈选数据.docx


 

本人无不为,QQ345071917,本人愿意和大家一起共同学习!!!



查看积分策略说明
附件下载列表:
2021-3-31 18:40:10  下载次数: 20
如何用SQL SERVER数据库计算距离并像MapInfo一样圈选数据.docx (56.68 KB)
扫码关注5G通信官方公众号,免费领取以下5G精品资料
  • 1、回复“YD5GAI”免费领取《中国移动:5G网络AI应用典型场景技术解决方案白皮书
  • 2、回复“5G6G”免费领取《5G_6G毫米波测试技术白皮书-2022_03-21
  • 3、回复“YD6G”免费领取《中国移动:6G至简无线接入网白皮书
  • 4、回复“LTBPS”免费领取《《中国联通5G终端白皮书》
  • 5、回复“ZGDX”免费领取《中国电信5G NTN技术白皮书
  • 6、回复“TXSB”免费领取《通信设备安装工程施工工艺图解
  • 7、回复“YDSL”免费领取《中国移动算力并网白皮书
  • 8、回复“5GX3”免费领取《 R16 23501-g60 5G的系统架构1
  • 对本帖内容的看法? 我要点评

     
    [充值威望,立即自动到帐] [VIP贵宾权限+威望套餐] 另有大量优惠赠送活动,请光临充值中心
    充值拥有大量的威望和最高的下载权限,下载站内资料无忧
    无不为
    VIP会员
    鎵嬫満鍙风爜宸查獙璇


     发短消息    关注Ta 

    积分 168
    帖子 51
    威望 20096 个
    礼品券 10 个
    专家指数 -87
    注册 2011-11-4
    专业方向  移动网络优化
    回答问题数 0
    回答被采纳数 0
    回答采纳率 0%
     
    发表于 2021-04-01 08:39:08  只看楼主  QQ
    技术问题,回答得专家指数,快速升级


    QUOTE:
    原帖由 yin00jian 于 2021-3-31 18:40:17 发表
    如何用SQL SERVER数据库计算距离并像MapInfo一样圈选数据在MapInfo因为版权的问题不让使用和存在大量的经纬度数据计算的背景下,本人提供3种方法进行经纬度的计算和Buffer数据圈选。(要求你有一点数据库的基础 ...

    补充一下空间字段展示:

    空间字段.jpg

    空间字段的点显示:

    image.png

    对本帖内容的看法? 我要点评

     
    [立即成为VIP会员,百万通信专业资料立即下载,支付宝、微信付款,简单、快速!]

    快速回复主题    
    标题
    内容
     上传资料请点左侧【添加附件】

    (勾选中文件为要删除文件)


    当前时区 GMT+8, 现在时间是 2026-06-15 17:41:22
    渝ICP备11001752号  Copyright @ 2006-2016 mscbsc.com  本站统一服务邮箱:mscbsc@163.com

    Processed in 0.643156 second(s), 17 queries , Gzip enabled
    TOP
    清除 Cookies - 联系我们 - 移动通信网 - 移动通信论坛 - 通信招聘网 - Archiver