先看看sql server 2008 spatial的函数定义 http://msdn.microsoft.com/zh-cn/library/bb933917(v=SQL.100).aspx
所有的空间计算是以这些函数为基础的
搜索距离内的地理对象(几何形状),其实就是电子地图的"显示视野内 酒店/商场..." 功能, 这里可以有两种方式来实现.
方法1: 使用 STDistance
STDistance(geography 数据类型)
返回一个 geography 实例中的点与另一个 geography 实例中的点之间的最短距离。
语法
.STDistance ( other_geography )
算法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 declare @urplace = geometry::STPointFromText('POINT(nnnn mmmm)',4326);
2
3 select
4 name,lng,lat,location.STDistance(@urplace) as distance
5 from
6 geotable
7 where
8 location.STDistance(@urplace)<1000
9
2
3 select
4 name,lng,lat,location.STDistance(@urplace) as distance
5 from
6 geotable
7 where
8 location.STDistance(@urplace)<1000
9
这个方法计算精度高(STDistance返回精确的距离),但是作为where条件,也因此导致效率低,一般推荐在查询的数据量比较少的情况下(几百)使用
方法2:使用STBuffer
STBuffer(geography 数据类型)
返回一个地理对象,该对象表示所有与 geography 实例的距离小于或等于指定值的点的并集。
语法
.STBuffer ( distance )
算法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 declare @urplace = geometry::STPointFromText('POINT(nnnn mmmm)',4326);
2 declare @bufArea = @urplace.STBuffer(1000)
3
4 select
5 name,lng,lat,location.STDistance(@urplace) as distance
6 from
7 geotable
8 where
9 location.Filter(@bufArea) = 1
2 declare @bufArea = @urplace.STBuffer(1000)
3
4 select
5 name,lng,lat,location.STDistance(@urplace) as distance
6 from
7 geotable
8 where
9 location.Filter(@bufArea) = 1
此方法先是对原来地理对象建立缓冲区,然后通过Filter()与缓冲区有交集的数据集,再进行精确的STDistance 计算,Filter会使用到你为该表建立spatial索引,因此会极大地提高性能
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf