通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  新兵

注册:2019-10-18
跳转到指定楼层
1#
发表于 2021-4-7 18:13:27 |只看该作者 |倒序浏览
如何用SQLSERVER数据库计算距离并像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进行自定义计算经纬度函数,具体函数如下:
函数.jpg
计算方法:
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区域是否包含第二个里面的点
本人无不为,QQ345071917,本人愿意和大家一起共同学习!!!

举报本楼

本帖有 2 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

版规|手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2025-8-2 20:34 , Processed in 0.635457 second(s), 20 queries , Gzip On.

Copyright © 1999-2025 C114 All Rights Reserved

Discuz Licensed

回顶部