MsSQLSpatial试用笔记
一、基本介绍
MsSQLSpatial是基于.net 2.0实现的Microsoft SQL Server 2005的空间数据引擎。关于它的介绍可以参考http://news.csdn.net/n/20070327/102334.html。它支持二维空间对象的存储与转换,并且是一个开源项目。
其官方项目地址是:
http://www.codeplex.com/Wiki/View.aspx?ProjectName=MsSQLSpatial
在Google Code的地址是:http://code.google.com/p/mssqlspatial/
Svn地址是:http://mssqlspatial.googlecode.com/svn/trunk
建议使用TortoiseSVN(http://tortoisesvn.tigris.org/)获取源码,也可在官方地址上下载源码。
MsSqlSpatial基于GeoAPI(http://geoapi.sourceforge.net/stable/site/index.html,基于OGC空间数据模型建立标准空间对象接口)、NetTopologySuite(http://code.google.com/p/nettopologysuite/, JTS Topology Suite的C#/.net版本,简称NTS,实现了GeoAPI定义的接口)和Proj.NET(http://www.codeplex.com/ProjNET,提供二维空间对象的坐标转换)三个开源项目构建。
MsSqlSpatial当前版本(
Ø 遵循OGC针对SQL制定的简单特征规范1.1修订版;
Ø 支持二维几何对象:点(Point)、线(LineString)、面(Polygon)、多点(MultiPoint)、多线(MultiLineString)、多面(MultiPolygon)、几何对象集合(GeometryCollection);
Ø 基本功能:Equals, Disjoint, Intersects, Touches, Crosses, Within, Contains, Overlaps, Covers, CoveredBy, Relate, IsWithinDistance;
Ø 空间分析功能: ConvexHull, Intersection, Union, Difference, SymDifference;
Ø 线性参考功能:LineInterpolatePoint, LineLocatePoint, LineSubstring;
Ø 空间关系及处理功能:Distance, Length, Area, Buffer, Centroid, PointOnSurface, Simplify, Polygonize, LineMerge等;
Ø 坐标系统:SRID, SetSRID, Transform;
Ø 空间索引:通过表值函数实现(FilterQuery, JoinFilterQuery, IsWithinDistanceQuery, RelateQuery);
Ø 定义集合函数,解决了用户定义集合函数小于8000字节的限制:UnionAggregate, EnvelopeAggregate, IntersectionAggregate;
Ø GML支持:AsGML function;
Ø 从Shape文件和PostGIS数据导入。
目前该项目还存在一些问题:仅支持有限的数据类型、不支持栅格数据、没有提供高级空间索引功能,实现也比较简单,不过个人觉得这个项目很有潜力,希望将来能很好的解决这些问题。
二、相关配置
步骤1:
MsSQLSpatial包括两个工程:MsSqlSpatialConsole及MsSqlSpatialLibrary。MsSqlSpatialLibrary提供了对空间数据的基本操作的封装。MsSqlSpatialConsole是控制台应用程序,以命令行的方式提供数据库配置和数据导入操作。
在对项目编译前需要了解一下ILMerge。ILMerge可以将多个程序集合并成为一个程序集。
使用方法为:(参见http://blogs.msdn.com/jomo_fisher/archive/
1、 下载并安装ILMerge
2、 将下列代码保存为C:\Program Files\msbuild\Ilmerge.CSharp.targets文件。
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/None.gif)
18
![](/Images/OutliningIndicators/None.gif)
3、 在VS2005中,右键单击要编译的项目选择卸载项目
4、 右键单击项目选择编辑*****.csproj(*****表示项目名称)
5、 找到<Import>节点,并将该节点内容更改为<Import Project="$(MSBuildExtensionsPath)\Ilmerge.CSharp.targets" />并保存
6、 右键单击项目选择重新加载项目
7、 编译项目
通过以上操作可以将项目引用的程序集和项目本身生成的程序集合并成为一个程序集。
MsSqlSpatialLibrary项目已经配置为可以将多个程序集编译成一个程序集(引用GeoAPI、NetTopologySuite、Proj.NET),MsSqlSpatialConsole项目中也需要引用这些程序集,因此通过ILMerge将这些程序集和MsSqlSpatialLibrary进行合并,MsSqlSpatialConsole就不必再额外添加引用了。
步骤2:
MsSqlSpatial通过CLR集成功能将应用程序集是直接部署在数据库服务器上,因此需要配置SQL Server 2005,使其支持CLR集成,配置过程如下:(关于CLR集成可以参考http://www.microsoft.com/china/msdn/library/data/sqlserver/sqlclrguidance.mspx?mfr=true)
1、 选择开始菜单——>程序——>Microsoft SQL Server 2005——>配置工具——>SQL Server 外围应用配置器
2、 点击功能的外围应用配置器
3、 选择CLR集成,选择启用CLR集成
三、导入数据
MsSqlSpatial支持Shape文件和PostGIS数据两种形式数据的导入。在调试MsSqlSpatialConsole时发现一个bug,在导入Shape文件时,数据连接误使用了PostGIS连接,具体代码在Utility目录下的Command.cs文件中的ImportShapefile方法中:
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
2
![](/Images/OutliningIndicators/InBlock.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
29
![](/Images/OutliningIndicators/None.gif)
其中connection.GetPostGisConnectionString()一句个人认为应改为connection.GetSqlServerConnectionString()。
这里导入数据以Shape文件为例,具体过程如下:
1、 首先在SQL Server 2005中建立一个数据库,本例建立的数据库名称为mssql_database。
2、 通过deploy参数在mssql_database数据库中建立基础数据表、存储过程、函数、触发器、CLR宿主程序集等。命令行格式如下(使用Windows信任连接):
msscmd -deploy -server=LOCALHOST\SQLEXPRESS -db=mssql_database
其中msscmd.exe是由MsSqlSpatialConsole项目编译生成的控制台应用程序(具体命令行参数可参见MsSqlSpatialConsole项目中的README.txt文件)。调试时可以在调试的命令行参数中添加-deploy -server=LOCALHOST\SQLEXPRESS -db=mssql_database,具体调试方式请参见控制台应用程序调试。
server参数是连接的SQL Server服务器名称,db参数是数据库名称。
通过deploy操作后,数据库中建立两个表:
GEOMETRY_COLUMNS:空间数据表的元数据描述,记录数据表的名称、存储空间数据的字段、数据的维数(二维是2),SRID值以及空间数据存储方式(坐标串、二进制等方式)。
SPATIAL_REF_SYS:存储了一些常见的空间参考系统。
同时建立了大量的存储过程、函数,用于支持常见的空间数据操作,比如Equals, Disjoint, Intersects, Touches, Crosses, Within, Contains, Overlaps, Covers, CoveredBy, Relate, IsWithinDistance等。
3、 通过import参数导入Shape文件。命令行格式如下:
msscmd -server=LOCALHOST\SQLEXPRESS -db=mssql_database -table=mssql_table -import=shp -shp_filename="D:\shapefile.shp"
其中sever和db参数同上,table是要存储数据的表名,import参数可以选择shp和pgsql,分别代表导入Shape文件和PostGIS数据,shp_filename指示Shape文件地址。
导入数据成功后,新增加了表mssql_table,默认情况下通过oid存储主键;the_geom存储空间数据;the_geom_Envelope_MinX、the_geom_Envelope_MinY、the_geom_Envelope_MaxX、the_geom_Envelope_MaxY存储空间对象的坐标范围(bound);其它字段存储空间数据的属性数据。
实验了一些Shape文件,有一些可以成功导入,有的导入会抛出异常,看来MsSqlSpatial还有待完善。