几何空间类型初探

之前一直做记录地点的坐标,都是使用一个lat 一个 long 的浮点型来计算。这样计算是有偏差的,所以尝试了一下GEOMETRY 的数据(另外一个更加贴切的地理类型是GEOGRAPHY,如果用来存坐标,其实使用起来比较类似,但是这次先不说)

DECLARE

    @GEO1 GEOMETRY,

@GEO2 GEOMETRY

从简单的说起,这里我定义了2个点,求出2个点的距离

SELECT @GEO1=GEOMETRY::STGeomFromText(‘POINT(1 1 1)‘,0),

@GEO2=GEOMETRY::STGeomFromText(‘POINT(2 2 2)‘,0)

--Distance的方法和Z点和M点的值无关,并且Distance的计算距离也可以使用几何公式计算出一样的结果。

SELECT @GEO1.STDistance(@GEO2),

POWER(POWER(@[email protected],2)+POWER(@[email protected],2),0.5) --还记得两点之间的距离公式吗_(:з」∠)_,忽然感觉对不起数学老师

Distance                公式

---------------------- ----------------------
1.4142135623731 1.4142135623731

*其实就是根号2 ╮(╯_╰)╭。

*还有一点,Distance的方法只对应X,Y坐标有效。对于Z,M这2个坐标系是无关的。

然而实际在运算效率上,简单点的运算可以先取值然后再套公式进行运算,比起直接使用Distance会快不少。

比如这样

DECLARE @GEO1 GEOMETRY,
        @GEO2 GEOMETRY,
        @Lat1 FLOAT,
        @Long1 FLOAT,
        @Lat2 FLOAT,
        @Long2 FLOAT

SELECT @GEO1=GEOMETRY::STGeomFromText(‘POINT(1 1 1)‘,0),
            @GEO2=GEOMETRY::STGeomFromText(‘POINT(2 2 2)‘,0)

SELECT @GEO1.STDistance(@GEO2)
        --,@GEO1,@GEO2
SELECT @Lat1 = @GEO1.STX,
        @Long1 = @GEO1.STY,
        @Lat2 = @GEO2.STX,
        @Long2 = @GEO2.STY
SELECT POWER(POWER(@Lat1-@Lat2,2) + POWER(@Long1-@Long2,2),0.5)

其实结果是一样的,但是看下执行计划,直接调用Distance的方法占用运算比例就100%了。如果在数据量比较大的时候,这个运算带来的性能差异就会越来越明显。所以如果是简单应用的话,可以考虑直接套用几何公式而不要直接调用函数,当然也可以看下能否使用空间索引

参考地址:https://msdn.microsoft.com/zh-cn/library/ff929109(v=sql.120).aspx

*HasZ ,HasM 的方法是12以上版本才提供

时间: 2024-10-03 14:55:48

几何空间类型初探的相关文章

MySQL空间类型测试

Mysql空间类型介绍: MySQL支持空间扩展,允许生成.保存和分析地理特征.这些特征可用于MyISAM.InnoDB.NDB.BDB和ARCHIVE表(但是,ARCHIVE引擎不支持索引功能,因此,不能为ARCHIVE列中的空间列编制索引). 测试目的: 想用mysql的专用空间类型来代替整数类型存储坐标信息,从而在地图搜索的时候提高效率. 参考文档: http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.htm

mysql空间类型使用笔记

创建表,填充测试数据 create table geom1(id int not null auto_increment primary key,geo geometry); insert into geom1(geo)values(ST_GeomFromText('point(1 1 )',3857)); insert into geom1(geo)values(ST_GeomFromText('polygon((0 0,10 0,10 10,0 10,0 0))',3857)); selec

DirectX11 With Windows SDK--15 几何着色器初探

# 前言 从这一部分开始,感觉就像是踏入了无人深空一样,在之前初学DX11的时候,这部分内容都是基本上跳过的,现在打算重新认真地把它给拾回来. [DirectX11 With Windows SDK完整目录](http://www.cnblogs.com/X-Jun/p/9028764.html) [Github项目源码](https://github.com/MKXJun/DirectX11-With-Windows-SDK) # 几何着色器 首先用一张图来回顾一下渲染管线的各个阶段,目前为止

把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 相关的内存,因为vetcor是类模版,对应多个不同类型,比如int,string,或者自己定义的数据类型等. 程序开头应如下声明 #include <iostream> #include <vector> #include <string> using std::strin

SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应的GIS专业理论知识. 5.其他相关知识. SQL Serve

MYSQL的空间查询(转帖)

SELECT x(location),y(location) FROM frddata.points; 本文将向各位介绍如何使用MySql5.x中的空间数据库,并展示一下它高效的性能(前提是正确使用). 本文适合于对SQL和MYSQL熟悉的人员. 步骤1:创建支持空间查询的表 首先来说一下如何创建一个包含空间数据的名为Points的表. CREATE TABLE `points` ( `name` varchar(20) NOT NULL DEFAULT '', `location` point

深入理解数据类型、变量类型属性、内存四区和指针

数据类型可理解为创建变量的模具(模子):是固定内存大小的别名. 数据类型的作用:编译器预算对象(变量)分配的内存空间大小. 既能读又能写的内存对象,称为变量:若一旦初始化后不能修改的对象则称为常量. 变量本质:(一段连续)内存空间的别名. 内存四区 栈区(stack):也叫临时区,由编译器自动分配释放,存放函数的参数值,局部变量的值等. 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收. 全局区(静态区)(static):全局变量和静态变

Oracle bigfile 大文件表空间

Database 是由一个或多个被称为表空间(tablespace)的逻辑存储单位构成.表空间内的逻辑存储单位为段(segment),段又可以继续划分为数据扩展(extent).而数据扩展是由一组连续的数据块(datablock)构成. 大文件表空间 在Oracle中用户可以创建大文件表空间(bigfile tablespace).这样Oracle数据库使用的表空间(tablespace)可以由一个单一的大文件构成,而不是若干个小数据文件.这使Oracle可以发挥64位系统的能力,创建.管理超大

DB2表空间重定向恢复数据库实战

DB2的备份恢复有点坑,当源系统和目标系统的路径设置不同时,要手动进行重定向恢复,本文是我一次实战操作之后总结的过程,仅供参考. 一.发出重定向恢复命令 DB2 RESTORE DB OLDDB FROM "C:\OLDDBbak" TAKEN AT 20150717164847 TO "C:" INTO NEWDB REDIRECT 其中,OLDDB是旧数据库.备份的数据库名称,NEWDB是新数据库名称,不用事先创建也可以,C:\OLDDBbak是备份文件放置的目