SQL Server2008推出后最大的变化就是提供了支持空间数据存储的Geometry和Geography,这个也是如果将ArcSDE和SQLServer数据库相结合后可以供用户选择的一种数据存储模式,因为SQLServer2008前的数据库版本都是BLOB来存储空间数据对象的,目前没有测试来判断哪

SQL Server2008推出后最大的变化就是提供了支持空间数据存储的Geometry和Geography,这个也是如果将ArcSDE和SQLServer数据库相结合后可以供用户选择的一种数据存储模式,因为SQLServer2008前的数据库版本都是BLOB来存储空间数据对象的,目前没有测试来判断哪个性能更优,但是个人倾向于Geometry和Geography。

使用这两种存储,一个优点就是,使用SQL Server数据库也可以像使用Oracle、PostgreSQL一样,使用SQL来进行操作。

在以前的文章中我们也介绍了关于SQL的操作,但是都是在SQl Server的manger studio里面进行的

相关参考:ArcSDE for SQLServer的SQL操作

本文介绍的如何使用编程的方式C#来对SQL Server空间数据存储的Geometry和Geography来进行操作。

首先我们需要引用一个Microsoft.SqlServer.Types.dll,

该文件根据32Bit和64Bit的不同分布情况不同

32Bit:C:\Program Files \Microsoft SQL Server\100\SDK\Assemblies

64Bit:C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies

注意如果你的SQL Server是2008和2012也是有相关区别的。

引用相关dll我们就可以进行开发了

以下代码环境:VS2010,引用dll版本SQL Server2012using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using Microsoft.SqlServer.Types;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using System.Configuration;

namespace SQL

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

object s= GetSRID("sde101", "sde", "CHINACITYTABLE");

}

//连接串

string connstring = "Data Source=192.168.100.111;Initial Catalog=sde101;Persist Security Info=True;User ID=sde;Password=sde";

//获得数据连接

public SqlConnection GetSQLConnection()

{

try

{

return new SqlConnection(connstring);

}

catch (Exception)

{

return null;

}

}

//将Geometry对象转换为WKT串

public void QuerytoWKT()

{

string sql = "select shape from xzq where objectid=45";

SqlGeometry g = GetGeometry(sql);

if (g != null)

{

//以WKT输出

Console.WriteLine(g);

}

}

//获得Geometry对象

// 直接使用SQL语句获得SQLGeometry对象

/public SqlGeometry GetGeometry(string sql)

{

try

{

SqlCommand cmd = GetCommand(sql);

SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())

{

SqlBytes sb = reader.GetSqlBytes(0);

//Deserialize方法只有引用SQLServer2012的dll才能使用,2008不支持

SqlGeometry g = SqlGeometry.Deserialize(sb);

return g;

}

return null;

}

catch (Exception e)

{ return null; }

}

// 根据WKT串获得SQLGeometry对象

public SqlGeometry GetGeometry(string sWKT, int sSRID)

{

// var sql = "POLYGON((509827.650 3848402.022,509763.336 3847282.564,509268.926 3847640.308,509827.650 3848402.022))";

SqlChars polyText = new SqlChars(sWKT);

return SqlGeometry.STGeomFromText(polyText, sSRID);

}

public SqlCommand GetCommand(string sql)

{

SqlConnection conn = GetSQLConnection();

conn.Open();

SqlCommand cmd = new SqlCommand(sql, conn);

return cmd;

}

//增删改直接写上不同的SQL语句即可

public void EditData()

{

try

{

string sWKT = "POLYGON((513132.704 3847868.592,513860.309 3846638.277,512682.911 3846598.589,513132.704 3847868.592))";

string sql = "insert xzq (objectid,shape) values(11111,'"+sWKT+"')";

SqlCommand cmd = GetCommand(sql);

cmd.ExecuteNonQuery();

}

catch (Exception e)

{ }

}

//获得相交数据

// Unable to load DLL 'SqlServerSpatial110.dll': 找不到指定的模块。 (Exception from HRESULT: 0x8007007E)

///public void GetInterps()

{

try

{

string sql1 = "select shape from xzq where objectid=86";

string sql2 = "select shape from xzq where objectid=71";

SqlGeometry g1 = GetGeometry(sql1);

SqlGeometry g2 = GetGeometry(sql2);

//获得相交的图形

SqlGeometry g3 = g1.STInterp(g2);

if (g3 != null)

{

//以WKT输出

Console.WriteLine(g3);

}

}

catch (Exception e)

{ }

}

//获得两点距离

public string GetDistance(SqlGeometry p1, SqlGeometry p2)

{

return p1.STDistance(p2).ToString();

}

// //根据表名获得SRID

/// 主要是直接进入GDB_ITEMS表里面获得制定表对象的SRID值

/// GDB_ITEMS表是安装了ArcSDE后才有的表

/// select shape from [sde101].[sde].[CHINACITYTABLE]

///public object GetSRID(string sDatabasename,string sUser,string sTableName)

{

//如果找不到,返回0

object SRID = null;

//如果熟悉ArcSDE的库的表结构,只要是解析相关的XML文件,来获得SRID

string sql = "SELECT Definition.value('(/DEFeatureClassInfo/SpatialReference/LatestWKID)[1]','nvarchar(max)') FROM "+

sDatabasename+"."+sUser+".[GDB_ITEMS] WHERE Name='"+sDatabasename+"."+sUser+"."+sTableName+"'";

SqlCommand cmd = GetCommand(sql);

SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())

{

SRID= reader.GetSqlValue(0);

}

return SRID;

}

}

}

以上代码有几个需要说明

1:在使用Geometry对象解析过程中,使用Deserialize,该方法只有SQL Server2012有,如果你使用SQL Server2008没有该方法

2:Geometry和Geography的区别在于你所使用的投影是平面坐标和地理坐标

3:在使用空间关系中,系统会提示Unable to load DLL 'SqlServerSpatial110.dll': 找不到指定的模块。 (Exception from HRESULT: 0x8007007E)

这是因为,Microsoft.SqlServer.Types.dll文件需要使用操作系统C:\Windows\System32\SqlServerSpatial110.dll(同样安装了SQL Server不同版本,在该路径下的版本号不一样,110代表2012版本),该dll不是加载的,是需要存储放在系统路径下的,注意两者的版本一致。

4:获得SRID,我是直接从ArcSDE的Schema的XML来获得的。

最后强调一下,因为这是Mircosoft提供的空间存储对象,所以相关帮助查看微软帮助即可。

相关dll下载地址

更深一步,如果对该方面的内容非常感兴趣,建议看看

SQL Server Spatial Tools

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql stdistance_C#开发SQLServer的Geometry和Geography存储相关推荐

  1. MySQL数据库开发规范-EC

    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库.今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例.因为规范大部分还是 ...

  2. 强烈推荐一款完全免费的绿色JRE+Tomcat+MySQL集成开发工具 - JTM

    为什么80%的码农都做不了架构师?>>>    因为工作需要经常要将JSP项目拿到客户电脑上进行演示,但客户经常在安装配置JDK.Tomcat.MySQL的过程中出现很多问题,给客户 ...

  3. 《PHP和MySQL Web开发从新手到高手(第5版)》一2.9 删除存储的数据

    本节书摘来自异步社区<PHP和MySQL Web开发从新手到高手(第5版)>一书中的第2章,第2.9节,作者[澳]Kevin Yank,更多章节内容可以访问云栖社区"异步社区&q ...

  4. 《PHP和MySQL Web开发从新手到高手(第5版)》一1.7 万事俱备,摩拳擦掌

    本节书摘来自异步社区<PHP和MySQL Web开发从新手到高手(第5版)>一书中的第1章,第1.7节,作者[澳]Kevin Yank,更多章节内容可以访问云栖社区"异步社区&q ...

  5. 《PHP和MySQL Web开发从新手到高手(第5版)》一一第1章 安装

    第1章 安装 PHP和MySQL Web开发从新手到高手(第5版) 在本书中,我们将帮助你跨出超越静态页面构建的第一步.静态页面,是使用HTML.CSS和JavaScript这样的纯客户端技术构建的. ...

  6. php spry文本域_《PHP和MySQL Web 开发》第8章 设计Web数据库

    封面人物 刘承羽 前言 这是我学习<PHP和MySQL Web 开发>的读书笔记,一些重要的知识点我会记录下来,当然只会写我觉得重要的. 如果有幸有人看到这个学习笔记了,你要结合着书看,不 ...

  7. MySQL数据库开发的 36 条军规

    转载自  MySQL数据库开发的 36 条军规 核心军规 尽量不在数据库做运算 控制单表数据量 纯INT不超过10M条,含Char不超过5M条 保持表身段苗条 平衡范式和冗余 拒绝大SQL,复杂事务, ...

  8. 使用Struts2,Hibernate和MySQL BLOB开发个人迷你相册应用程序–第1部分

    概述: 在本研讨会中,我们将开发一个Web应用程序,可用于创建漂亮的照片库. 您可以将其托管在Web服务器中,也可以在自己的PC中使用以维护和管理照片集. 使用本教程,您将能够了解与Struts2和H ...

  9. Django Python MySQL Linux 开发环境搭建

    Django Python MySQL Linux 开发环境搭建 1.安装Python 进行Python开发,首先必须安装python,对于linux 或者Mac 用户,python已经预装. 在命令 ...

最新文章

  1. 李宏毅2020机器学习资料汇总
  2. 如何将APP安装包发布到360手机助手上
  3. 【软路由】旁路由使用配置教程
  4. 完美数——C++代码及思路分析 leetcode507
  5. VS2015 LoadLibrary加载DLL失败的解决方案,GetLastError()返回值193
  6. Oracle表空间(tablespaces)
  7. 推荐系统实战——自动化构建用户以及物料画像
  8. opencv阈值图像Threshold方法
  9. UE4 Geometry Polygon
  10. Python爬虫实践2,企业工商信息查询
  11. 职场摸爬滚打的卑微软件测试工!外包干了三年后,我废了...
  12. 新版本 chrome 手机浏览器关闭为您推荐的文章方法
  13. python怎么画地图空间分异图_基于地形梯度的赣南地区生态系统服务价值对人为干扰的空间响应...
  14. 服务器1075错误服务修复,错误1075:依存服务不存在,或已标记为删除
  15. 搜索包含关键字的文本
  16. GPO:在 Start/Logon 中使用 PowerShell 脚本
  17. Ubuntu如何修改grub启动项
  18. python编写会计凭证金蝶_怎么在金蝶财务软件中录入会计凭证
  19. uniapp tab 栏选项卡与内容区域联动
  20. 区块链溯源防伪码和传统溯源防伪码有什么区别?

热门文章

  1. 生物化学《第四章蛋白质》
  2. zt围棋是世界上最大的伪科学
  3. 几何向量:空间三角形外心和法向量
  4. 上海迪士尼乐园重新开放,欢迎游客回到充满欢乐的奇妙世界
  5. (转)WebQQ协议开发实战
  6. 转主流蓝牙BLE控制芯片详解(1):TI CC2540
  7. Secure Boot什么意思?BIOS中Secure Boot灰色无法更改解决方法详解
  8. 大数据之数据仓库建设(三)
  9. 如何有效开展小组教学_小学语文教学中如何有效开展小组合作学习
  10. 将Openfire中的MUC改造成类似QQ群一样的永久群