SQL Server 2008空间数据库应用程序开发演练

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
 

SQL Server   2008空间数据库 应用程序开发演练

卢世松

(云南省测绘工程院  650033)

     摘要 :SQL Server 2008在空间数据支持上提供了许多强大的功能,使用其提供的空间数据类型对象,利用强大的开发工具Visual Studio开发工具基于.NET平台 ,使用 现代的面向对象编程语言C#可快速的开发出操控空间数据的应用程序。本文通过使用C#开发一个基于SQL Server2008创建、操控空间数据的GDI+图形应用程序,介绍SQL Server 2008空间数据库应用程序的开发

    关键词:空间数据库;SQL Server; C#; GIS ;GDI+。

1.  引言

地理信息系统(GIS)具有强大的地图制图、空间分析功能,其目的是提供一个空间框架,以支持地球资源的合理利用决策和管理人工环境。随着数据库技术的发展,对于海量空间数据的存储和管理,都已经交由数据库系统来完成。 由于空间数据具有空间位置、非结构化、空间关系、分类编码、海量数据等特征,一般的 关系 数据库管理系统难以满足要求。 为满足空间海量数据存储、管理的需求,各大 数据库厂商借鉴面向对象技术,发展了对象关系型数据库管理系统 增加空间数据类型及相关函数,从而将空间数据 的存储、查询和索引 传统GIS软件厂商的 空间数据引擎中间件转移到了数据库管理系统中, 让用 可以 使用 扩充的 空间数据类型和函数的标准扩展型SQL语言来操作空间数据。

SQL Server 2008作为微软公司的新一代智能化数据存储平台,提供了对空间数据存储、查询、索引的原生支持,在其强大的.NET平台支持下,可以很容易的开发操控空间数据的应用程序。而免费的的SQL Server 2008 Express中依然提供了空间数据扩展支持,这很大程度上方便了基于Windows平台桌面空间数据应用程序的开发。以下笔者将一步一步使用C#和SQL Server 2008 CTP版(社区技术版)开发一个简单的操控空间数据的应用程序。

2.  程序功能描述

程序目标功能主要分为三部分:

(1) 创建三个存储点、线、面的数据库表并在相应的表中添加空间数据;

(2) 绘制数据库中所有图形;

(3) 绘制指定矩形范围内的图形。

3.  创建项目并实现用户界面

首先,使用SQL Server 2008创建一个名为SQLSpatial的数据库,用Visual C# 2005创建一个名为SQLSpatial的Windows窗体应用程序项目。将Form1的窗体标题改为“SQL Server 2008空间数据库示例”,修改窗体背景色为白色,并为其添加菜单。完成后的用户界面如图1所示。

4.  编写代码

(1)  在Visual Studio的解决方案管理器中右击SQLSpatial项目添加程序集 Microsoft.SqlServer.Types.dll 的引用,这是对空间数据类型geometry和geography的支持库。程序集位于SQL Server 2008安装实例的MSSQL/Binn目录下,例如笔者的目录为C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER2008/MSSQL/Binn。

(2)  在程序Form1窗体类的代码中加入以下命名空间的引用。

using  System.Data.SqlClient;       //使用SQL Server .NET提供者命名空间

using  Microsoft.SqlServer.Types;     //引用空间数据类型对象命名空间

using  System.Drawing.Drawing2D;    //引用GDI+绘图类命名空间

(3)  双击各个菜单添加消息响应函数并输入代码。

A、 创建PointTable表并添加点数据的函数代码如下:

             //创建数据库连接字符串

             SqlConnectionStringBuilder  conBuilder =  new   SqlConnectionStringBuilder ();

            conBuilder.DataSource =  @"KFB-AS/SQLSERVER2008" ;       // 客户服务器名称

            conBuilder.InitialCatalog =  "SQLSpatial" ;             // 数据库名称

            conBuilder.IntegratedSecurity =  true ;

             try

            {     using  ( SqlConnection  con =  new   SqlConnection (conBuilder.ConnectionString))

                   //创建PointTable表

                     string  cmdStr =

  "IF OBJECT_ID ('dbo.PointTable','U') IS NOT NULL DROP TABLE dbo.PointTable" ;

                     SqlCommand  cmd =  new   SqlCommand (cmdStr, con);

                    con.Open();

                    cmd.ExecuteNonQuery();

                    cmd.CommandText 

"CREATE TABLE PointTable(ID int IDENTITY(1,1), Geometry geometry)" ;

                    cmd.ExecuteNonQuery();

                     //添加点数据

                     SqlDataAdapter  adapter =  new   SqlDataAdapter ( "SELECT * FROM PointTable" , con);

                     SqlCommandBuilder  cmdBuilder =  new   SqlCommandBuilder (adapter);

                     DataSet  ds =  new   DataSet ();

                    adapter.Fill(ds,  "PointTable" );

                     for  ( int  i = 0; i < 1000; i += 10)

                     {    string  wkt =  String .Format( "POINT({0} {1})" , i + 100, i + 20);

                         SqlGeometry  g =  new   SqlGeometry ();

                        g =  SqlGeometry .Parse(wkt);

                         DataRow  drow = ds.Tables[ "PointTable" ].NewRow();

                        drow[ "Geometry" ] = g;

                        ds.Tables[ "PointTable" ].Rows.Add(drow);

                    }

                    adapter.Update(ds,  "PointTable" );

                }

                 MessageBox .Show( "数据库PointTable中已经成功添加点数据!" );

            }

             catch  ( Exception  ex)

            {   MessageBox .Show(ex.Message);

    }

B、 创建LineTable表并添加线数据的主要代码如下:

                     //创建LineTable表

                     string  cmdStr = 

"IF OBJECT_ID ('dbo.LineTable','U') IS NOT NULL DROP TABLE dbo.LineTable" ;

                     SqlCommand  cmd =  new   SqlCommand (cmdStr, con);

                    con.Open();

                    cmd.ExecuteNonQuery();

                    cmd.CommandText = 

"CREATE TABLE LineTable(ID int IDENTITY(1,1), Geometry geometry)" ;

                    cmd.ExecuteNonQuery();

                     //添加线数据

                     SqlDataAdapter  adapter =  new   SqlDataAdapter ( "SELECT * FROM LineTable" , con);

                     SqlCommandBuilder  cmdBuilder =  new   SqlCommandBuilder (adapter);

                     DataSet  ds =  new   DataSet ();

                    adapter.Fill(ds,  "LineTable" );

                     for  ( int  i = 0; i < 1000; i += 50)

                     {   string  wkt =  String .Format( "LINESTRING({0} {1},{2} {3})" , 20, i, 300, i);

                         SqlGeometry  g =  new   SqlGeometry ();

                        g =  SqlGeometry .Parse(wkt);

                         DataRow  drow = ds.Tables[ "LineTable" ].NewRow();

                        drow[ "Geometry" ] = g;

                        ds.Tables[ "LineTable" ].Rows.Add(drow);

                    }

                    adapter.Update(ds,  "LineTable" );          

C、 创建PolygonTable表并添加多边形数据的主要代码如下:

               string  cmdStr =

                  "IF OBJECT_ID ('dbo.PolygonTable','U') IS NOT NULL DROP TABLE dbo.PolygonTable" ;

                     SqlCommand  cmd =  new   SqlCommand (cmdStr, con);

                    con.Open();

                    cmd.ExecuteNonQuery();

                    cmd.CommandText = 

"CREATE TABLE PolygonTable(ID int IDENTITY(1,1), Geometry geometry)" ;

                    cmd.ExecuteNonQuery();

                     //添加多边形数据

                     SqlDataAdapter  adapter =  new   SqlDataAdapter ( "SELECT * FROM PolygonTable" , con);

                     SqlCommandBuilder  cmdBuilder =  new   SqlCommandBuilder (adapter);

                     DataSet  ds =  new   DataSet ();

                    adapter.Fill(ds,  "PolygonTable" );

                     for  ( int  i = 0; i < 1000; i += 60)

                     {   string  wkt = 

String .Format( "POLYGON(({0} {1},{2} {3},{4} {5},{6} {7},{8} {9}))" , i, i, i + 50, i, i + 50, i + 50, i, i + 50, i, i);

                         SqlGeometry  g =  new   SqlGeometry ();

                        g =  SqlGeometry .Parse(wkt);

                         DataRow  drow = ds.Tables[ "PolygonTable" ].NewRow();

                        drow[ "Geometry" ] = g;

                        ds.Tables[ "PolygonTable" ].Rows.Add(drow);

                    }

                    adapter.Update(ds,  "PolygonTable" ) ;   

(4) 为Form1窗体类添加两个私有绘图函数用于使用GDI+在窗品中绘制图形;

private   void  DrawAllFeature( Graphics  gdi)

           {      

          // 代码为DrawSelect(Graphics gid)函数中去掉带下划线部分的代码

}

          private   void  DrawSelect( Graphics  gdi)

           {   //创建数据库连接字符串

             SqlConnectionStringBuilder  conBuilder =  new   SqlConnectionStringBuilder ();

            conBuilder.DataSource =  @"KFB-AS/SQLSERVER2008" ;         // 客户服务器名称

            conBuilder.InitialCatalog =  "SQLSpatial" ;               // 数据库名称

            conBuilder.IntegratedSecurity =  true ;

             //创建绘图区域对象

              string  wkt =  "POLYGON((60 60,200 60,200 200,60 200,60 60))" ;

             SqlGeometry  gRect =  SqlGeometry .Parse(wkt);

             try

            {   using  ( SqlConnection  con =  new   SqlConnection (conBuilder.ConnectionString))

                 {     con.Open();

                     //绘多边形数据

                   SqlDataAdapter  adPolygon =  new   SqlDataAdapter ( "SELECT * FROM PolygonTable" , con);

                     SqlCommandBuilder  cmdBuilderPolygon =  new   SqlCommandBuilder (adPolygon);

                     DataSet  ds =  new   DataSet ();

                    adPolygon.Fill(ds,  "PolygonTable" );

                     foreach  ( DataRow  row  in  ds.Tables[ "PolygonTable" ].Rows)

                    {   SqlGeometry  g = ( SqlGeometry )row[ "Geometry" ];

                         //如果被绘图区域包含或与绘图区域相交则绘图形

                         if  (gRect.STIntersects(g) || gRect.STContains(g))

                        {   int  pointSum = ( int )g.STNumPoints();

                             PointF [] points =  new   PointF [pointSum];

                             byte [] pointTypes =  new   byte [pointSum];

                             for  ( int  i = 0; i < pointSum; i++)

                            {   points[i].X = ( float )g.STPointN(i + 1).STX;

                                points[i].Y = ( float )g.STPointN(i + 1).STY;

                                pointTypes[i] = ( byte ) PathPointType .Line;

                            }

                             GraphicsPath  path =  new   GraphicsPath (points, pointTypes);

                            gdi.FillPath( Brushes .Red, path);

                        }

                    }

                     //绘线数据

                     SqlDataAdapter  adLine =  new   SqlDataAdapter ( "SELECT * FROM LineTable" , con);

                     SqlCommandBuilder  cmdBuilderLine =  new   SqlCommandBuilder (adLine);

                    adLine.Fill(ds,  "LineTable" );

                     using  ( Pen  bluePen =  new   Pen ( Color .Blue, 2))

                    {   foreach  ( DataRow  row  in  ds.Tables[ "LineTable" ].Rows)

                        {   SqlGeometry  g = ( SqlGeometry )row[ "Geometry" ];

                             //如果被绘图区域包含或与绘图区域相交则绘图形

                             if  (gRect.STIntersects(g) || gRect.STContains(g))

                            {gdi.DrawLine(bluePen,  new   PointF (( float )g.STPointN(1).STX,   ( float )g.STPointN(1).STY),   new   PointF (( float )g.STPointN(2).STX,    ( float )g.STPointN(2).STY));

                            }

                        }

                    }

                     //绘点数据

                     SqlDataAdapter  adPoint =  new   SqlDataAdapter ( "SELECT * FROM PointTable" , con);

                    adPoint.Fill(ds,  "PointTable" );

                     using  ( Pen  greenPen =  new   Pen ( Color .Green, 2))

                    {   foreach  ( DataRow  row  in  ds.Tables[ "PointTable" ].Rows)

                        {   SqlGeometry  g = ( SqlGeometry )row[ "Geometry" ];

                             if  (gRect.STIntersects(g) || gRect.STContains(g))

                            {   // 绘一个半径为1的圆表示点

        gdi.DrawEllipse(greenPen, ( float )g.STPointN(1).STX - 1, ( float )g.STPointN(1).STY - 1, 2, 2);

                            }

                        }

                    }

                }

            }

             catch  ( Exception  e)

             {   essageBox .Show(e.Message);   }

  }

(5) 添加绘图消息响应代码

A 为Form1添加一个私有字段用于控制绘制所有图形还是绘制矩形范围图形;

private   int  drwType=-1;

B、为Form1添加OnPaint消息响应函数并添加下列代码

               if (drwType==1)

                 DrawAllFeature(e.Graphics);

             else   if (drwType==2)

       DrawSelect(e.Graphics);

C、在菜单“绘数据库中所有图形”的消息响应函数中添加如下代码:

            drwType=1;      

             this .Invalidate();

D、在菜单“绘60,60 200,200矩形范围内的图形”的消息响应函数中添加如下代码:

            drwType = 2 ;      

    this .Invalidate();

5. 程序运行结果

依次点击菜单创建点、线、面数据,然后执行“ 绘数据库中所有图形”菜单后的运行结果如图2所示。执行“绘60,60 200,200矩形范围内的图形”将绘制在矩形(60,60 200,200)范围内的图形或与该矩形相交的图形,运行结果如图3所示。

        

图2.绘制所有的图形数据           图3. 绘制指定矩形范围的图形数据

6.小结

程序通过引入 Microsoft.SqlServer.Types.dll 程序集,使用geometry空间数据类型的封装类SqlGeometry的方法来完成空间对象的创建并存入数据库中,在判断图形是否绘制时使用了SqlGeometry类的方法很容易的完成,最后将数据库中的图形读出并使用GDI+完成图形绘制。SQL Server 2008在空间数据支持上提供了许多强大的功能,使用SQL Server 2008提供的空间数据类型对象,利用强大的开发工具Visual Studio开发工具基于.NET平台及现代的面向对象编程语言C#可快速的开发出操控空间数据的应用程序。本文意在抛砖引玉,欠妥之处,敬请指正。

参考文献:

[1]Visual C# 2005文件IO与数据存取秘诀——章立民研究室 著

[2]SQL Server 2005数据库开发实战——章立民研究室著

[3]GDI+图形程序设计——Mahesh Chand 著

[4]为我们的世界建模-ESRI地理数据库设计指南——Michael Zeiler著

 
SQL Server 2008数据库迁移到SQL Server 2019 安装缘由、安装步骤、附加数据库、生成数据库脚本、运行数据库脚本生成数据库 阅读详情

相关推荐

SQL Server 2008 数据仓库与分析服务全面教程

SQL Server 2008 Analysis Services(SSAS)是Microsoft推出的一个用于创建在线分析处理(OLAP)和数据挖掘解决方案的服务器产品。SSAS是SQL Server的一个关键组成部分,旨在提供企业级的数据分析能力。自从SQL Server 2000引入了第一个商业智能(BI)组件以来,SSAS经历了多个版本的迭代和改进,每个新版本都增加了新的特性和功能。

weixin_35826166的博客 973

空间数据库实习SQL保存点和线

在界面上画出点、线,点击保存,可以将他们保存到SQL数据库中。还可以将他们读取出来。

SQL Server 2008数据库实战操作指南

SQL Server 2008是微软公司发布的一个企业级数据库管理系统,提供了更为强大的数据存储和处理能力。它为开发者和数据库管理员提供了高性能的事务处理,丰富的报表服务和分析功能。SQL Server 2008引入了多项新技术,比如支持空间数据和数据压缩,以及新增的“数据清理”功能,使数据质量管理更加高效。

weixin_29859471的博客 1443

C#打造一个开源webgis(二)空间数据库

空间数据库,是为了存储和分析空间数据的,也有一些GIS系统采用空间文件来实现,如mapinfo、shape文件格式,但是空间数据库有着其特有的优势,其实基本也就数据库系统与文件系统的特点比较: 1、数据库设计时面向数据模型对象,数据库设计的基础是数据模型。 2、数据库系统的数据冗余度小、数据共享度高。 3、数据库系统的数据和程序之间具有较高的独立性。 4、数据库系统通过DBMS进行数据安全

IT晴天 4270

SQL Server 支持空间数据(Geometry和Geography)的空间索引概述

SQL Server 2008之后支持了空间数据存储(geometry和Geography),那么我们在使用ArcGIS10.1桌面打开这些数据看到相关索引时会看到如下界面:下面就针对SQL Server空间索引做一下介绍!关于空间索引将索引空间分解成网格层次结构在 SQL Server 中,空间索引使用 B 树构建而成,也就是说,这些索引必须按 B 树的线性顺序表示二维空间数据。 因此,将数据

积思园 1万+

创建一个DataTable,并为之添加数据(自定义DataTable)

创建一个DataTable,并为之添加数据(自定义DataTable) DataTable dt=new DataTable(“cart”); DataColumn dc1=new DataColumn(“prizename”,Type.GetType(“System.String”)); DataColumn dc2=new DataColumn(“point”,Type.GetType(“Sy...

zhu58252601的博客 1万+

PostGIS 测试 - 点(POINT)

1.建表 创建包含空间数据的表mytable。 CREATE TABLE pointtable ( id SERIAL PRIMARY KEY, name VARCHAR(128), geom GEOMETRY(Point, 26910) ); 2.添加GIST索引 CREATE INDEX pointtable_gix ON pointtable USING ...

万里归来少年心 4532

SQL Server 2008空间数据库 应用程序开发演练

SQLServer 2008空间数据库 应用程序开发演练 卢世松 (云南省测绘工程院650033) 摘要 :SQLServer2008空间数据支持上提供了许多强大的功能,使用其提供的空间数据类型对象,利用强大的开发工具VisualStudio开发工具基于.NET平台 ,使用 现代的面向对象编程语言C#可快速的开发出操控空间数据的应用程...

ddy491001的博客 244

SQL Server 2008R2下载及安装教程

sql server 2008R2安装教程,简单实用。

qq_40699947的博客 8万+

解析SQL Server 2008 数据仓库

AnalysisServices的专栏 1987

SQL SERVER 2008 压缩备份

/*    SQL SERVER 2008 压缩备份       SQL SERVER 2008 在企业版和开发版中引入了备份压缩.使用者个功能可以更快速的备份数据库并且    消耗更少的磁盘空间.压缩量依赖于数据库中存储的数据.例如,含有重复值字符数据的数据库可以有    比包含有更多数字或者加密数据的数据库有更高的压缩率.     下面进行配置和进行压缩备份

晃蕩旳年華 6827

64位Win10系统下Navicat连接SQL Server 2008配置指南

Navicat 的核心功能包括但不限于以下几点:功能模块描述数据库连接支持连接多种数据库类型,包括本地与远程数据库查询构建器提供可视化查询构建工具,帮助用户编写复杂 SQL数据同步支持不同数据库之间的结构与数据同步数据建模图形化设计数据库结构,支持正向与逆向工程报表生成提供可视化报表生成工具,支持导出为 PDF、Excel 等格式安全管理支持用户权限管理、SSL 加密连接等安全特性自动化任务。

weixin_31961675的博客 1436

Windows Server 2008SQL Server 2008 R2安装实战教程

随着企业数据需求的不断增长,SQL Server数据库管理系统成为许多组织不可或缺的组成部分。SQL Server 2008 R2作为其中的一个重要版本,其高效的数据处理能力和可靠的安全特性使得它在数据仓库和商业智能解决方案中占据了一席之地。本文将为读者提供一个全面的安装指南,确保在遵循最佳实践的同时,快速、正确地安装并配置SQL Server 2008 R2。我们将从检查系统要求开始,详细讨论安装前的准备、媒介制作、安装步骤,以及安装后的配置与优化。

weixin_36064575的博客 1184

[SQL Server 2008]SQL Server 2008 安装示例数据库

下载地址:http://msftdbprodsamples.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=19353我下载的是SQL2008.AdventureWorks_All_Databases.x86.msi,本不想下载这种安装文件,但脚本文件总是执行出错,原因没具体深究。这种安装文件安装后会创建六个库AdventureWorks

迭代生活,程序人生 5705

SQL Server 2008 日志收缩

SQL Server 2008 日志收缩

简单的快乐 9158

2008 r2 server sql 中文版补丁_SQL Server 2008 SP4 补丁

SQL Server 2008 SP4 补丁对于客户而言,Microsoft SQL Server 2008 Service Pack 4 中的几个关键改进如下所示:改进了从 SQL Server 的以前版本到 SQL Server 2008 SP4 的升级体验。 此外,我们还改善了安装体验的效果和可靠性。在 SQL Server Integration Services 中,现在日志可以显示在数...

weixin_28818559的博客 1296

SQL Server 2008 R2 下移动数据库的存储位置

SQL Server 2008 R2 下移动数据库的存储位置今天在做移动数据库操作时,从网上搜了一些文章,在多篇文章的结合下,解决了问题。使用场景:1.数据库增长的较大,存储磁盘空间不足; 在特定情况下该数据库需要移动到另外一块磁盘上(呵呵。。。我的情况就是之前的磁盘要还给别人) 步骤: 1. 新建查询 SELECT name, physical_name FROM sys.master_f

海阔凭鱼跃,天高任鸟飞 5040

SQL Server 2008简介与安装前提

SQL Server 2008简介2008Microsoft公式发布的SQL Server 2008 该版本提供了一系列丰富的集成服务,可以对数据进行查询、搜索、同步、报告和分析之类的操作。数据可以存储在各种设备上,从数据中心最大的服务器一直到桌面计算机和移动设备,并且可以控制数据而不管数据存储在哪里。其主要功能有:1、保护数据库资料它提供整个数据库、数据表与Log加密的机制,并且程序存取加密数...

朱海燕的博客日记 2669
ynchlss
博客等级 码龄20年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值