SQL 查询地理信息中指定距离范围内的记录
来源:互联网 发布:天庭淘宝店无常 编辑:程序博客网 时间:2024/05/21 17:05
目标:选取在指定位置1公里范围的记录
测试数据:指定时间范围内,16万记录
跟据测试结果,如果不是需要很高精度,用第一种方法就可以了
方法1:按矩形算
优点:快,缺点:不是圆型的范围,平均执行150ms
DECLARE @GGP_LOCATE_POINT GEOGRAPHY = GEOGRAPHY::Point( 22.26663,113.821256666667, 4326); DECLARE @FLT_LONGITUDE FLOAT, @FLT_LATITUDE FLOAT --纬度SELECT @FLT_LONGITUDE =113.821256666667, @FLT_LATITUDE =22.26663SELECT @GGP_LOCATE_POINT.STDistance(GEOGRAPHY::Point([LATITUDE],[LONGITUDE], 4326)) as [验证距离], * FROM [目标表]WHERE [ALERT_TIME] BETWEEN '2015-09-08' AND '2015-09-28'AND [LATITUDE] BETWEEN @FLT_LATITUDE-0.010 AND @FLT_LATITUDE+0.010AND [LONGITUDE] BETWEEN @FLT_LONGITUDE-0.010 AND @FLT_LONGITUDE+0.010
方法2:计算每个坐标的距离(圆),平均执行5500ms
DECLARE @GGP_LOCATE_POINT GEOGRAPHY = GEOGRAPHY::Point( 22.26663,113.821256666667, 4326); SELECT * FROM [dbo].[ALERT]WHERE [ALERT_TIME] BETWEEN '2015-09-08' AND '2015-09-28'AND @GGP_LOCATE_POINT.STDistance(GEOGRAPHY::Point([LATITUDE],[LONGITUDE], 4326))<=1000
方法3:计算目标是否在范围内,平均执行7500ms
DECLARE @GGP_LOCATE_POINT GEOGRAPHY = GEOGRAPHY::Point( 22.26663,113.821256666667, 4326); DECLARE @buffer GEOGRAPHY;set @buffer=@GGP_LOCATE_POINT.STBuffer(1000);SELECT * FROM [dbo].[ALERT]WHERE [ALERT_TIME] BETWEEN '2015-09-08' AND '2015-09-28'AND @buffer.Filter(GEOGRAPHY::Point([LATITUDE],[LONGITUDE], 4326))>1000
补充:计算指定范围对应的经纬度大小
//地球子午线(南极到北极的连线)长度39940.67公里,纬度一度合110.94公里,一分合1.849公里,一秒合30.8米,不同纬度的间距是一样的。//地球赤道圈长度40075.36公里,深圳在北纬22度左右,纬度圈长为111.32*cos(a),//因此这里的经度一度合103.566436555110152670083196192/// <summary>/// 获取指定距离的经度/// </summary>/// <param name="org">对应的纬度</param>/// <param name="range"></param>/// <returns></returns>public double GetLongitude(double org, float range){ // 1 经度的距离为 111.32*cos(a) const double n = 1113200f; double angle = Math.PI * org / 180.0; return range / (n * Math.Cos(angle));}/// <summary>/// 获取指定距离的纬度/// </summary>/// <param name="org"></param>/// <param name="range"></param>/// <returns></returns>public double GetLatitude( float range){ // 1 纬度的距离为 110.94公里 const double n = 1109400f; return range / n;}
0 0
- SQL 查询地理信息中指定距离范围内的记录
- 查询文件中指定字符的记录
- 查询数据库中指定字段符合条件的记录数
- 拼接查询sql中指定列的结果集
- sql语句 查询字段中指定字符之间的数据
- 修改数据表中指定记录的信息
- 使用SQL语句查询经纬度之间的距离和一定范围内的数据
- matlab 修改rbg图像中指定范围内像素点的rgb值
- 检索数据库中指定页的记录(SqlServer 2000示例)
- 查找数据库中指定字段按拼音首字母的记录
- 怎样删除MSHFlexGrid控件中指定的记录
- 如何取出表中指定区间的记录
- 查看SQL SERVER中指定数据库的每个表的数据量和每行记录所占用的空间
- 查询text字段中指定字符的出现次数
- 查询text字段中指定字符的出现次数
- 一个关于HINT中指定索引查询的问题
- Linq 中查询一个表中指定的字段
- javascript中的获取URL中指定的查询字符串
- Android知识库
- poj1743 Musical Theme(后缀数组|后缀自动机)
- 正则表达式中的匹配,替换,切割,获取,这四个使用时具体用哪一个,进行案例分析
- 数据结构 - 简单的单链表结构
- poj3261 Milk Patterns(后缀数组)
- SQL 查询地理信息中指定距离范围内的记录
- Ural1297 Palindrome(后缀数组)
- android学习四(Activity的生命周期)
- poj2406 Power Strings(kmp失配函数)
- 求解二叉树的深度(高度)_C语言
- poj2774 Long Long Message(后缀数组)
- [总结]后缀数组: 注释+模板
- 1020. 月饼
- poj3294 Life Forms(后缀数组)