最初写这个程序是应老大的要求解决“更新Oracle中的空间数据时会因为wkt字符串太长而报错”这个问题,之前的更新都是在程序中插入一条SQL语句来进行更新,由于SQL语句本身的一些限制,在wkt字符串中包含几万个以上的点时就会报“ORA-01074:字符串文字太长”错误,这里提出了两种解决方法:

第一种:将之前传入简单的SQL更新语句,改为传入存储过程;

DECLARE
geom sdo_geometry;

BEGIN

geom:=sdo_geometry
(2003,
null,
null,
sdo_elem_info_array(1,1003,1),
sdo_ordinate_array(58184.2949999999, 39390.5210000016, 58208.6500000013, 39291.8900000025, 58499.0099999998, 39310.700000003, 58482.4699999997, 39409.8360000011, 58184.2949999999, 39390.5210000016)
);

execute immediate 'update zd_test set shape=:gm where objectid=242137' using geom;

END;

select objectid,shape from zd_test

select objectid,SDO_UTIL.TO_WKTGEOMETRY(shape) as ShapeString from zd_test where objectid=242137

第二种:使用参数方法进行传值

这种方法主要是参考了http://www.cnblogs.com/Anders888/p/3542288.html这篇文章,最终问题解决,代码如下:

这里SdoGeometry 、SdoPoint都已经经过封装,可参考http://blog.csdn.net/rrrrssss00/article/details/22879719

最终传参使用:

//单点
string wkt = "POINT (63918.6936862222 39311.6724619204)";
string conn_str = "Data Source=ORCL162; User ID = gttest; Password = gttest";//连接Oracle数据库的字符串
GeoneOracleGeometry geo = new GeoneOracleGeometry();
geo.UpdateGeometryData(conn_str, "zd_test", "objectid", "230361", "shape", wkt);

一、根据wkt创建几何对象:点、线、面

#region 创建几何对象:点、线、面

private SdoGeometry CreateGeometryByWkt(string wkt)
{
if (wkt.Contains("POLYGON"))
{
if (wkt.Contains("MULTIPOLYGON"))
{
//多边形:多个面
SdoGeometry MultiPolygon = new SdoGeometry();
MultiPolygon.Sdo_Gtype = 2007;
MultiPolygon.Sdo_Srid = null;
MultiPolygon.Point = null;
MultiPolygon.ElemArray = CreateMultiPolygonArray(wkt);
MultiPolygon.OrdinatesArray = ConvertPointToArray(wkt);
return MultiPolygon;
}
else if (wkt.Contains("),"))
{
//多边形:环(有岛多边形)
SdoGeometry CirculPolygon = new SdoGeometry();
CirculPolygon.Sdo_Gtype = 2003;
CirculPolygon.Sdo_Srid = null;
CirculPolygon.Point = null;
CirculPolygon.ElemArray = CreateCurArray(wkt);
CirculPolygon.OrdinatesArray = ConvertPointToArray(wkt);
return CirculPolygon;
}
else
{
//多边形:简单面
SdoGeometry SimplePolygon = new SdoGeometry();
SimplePolygon.Sdo_Gtype = 2003;
SimplePolygon.Sdo_Srid = null;
SimplePolygon.Point = null;
SimplePolygon.ElemArray = new decimal[] { 1, 1003, 1 };
SimplePolygon.OrdinatesArray = ConvertPointToArray(wkt);
return SimplePolygon;
}
}
else if (wkt.Contains("LINESTRING"))
{
//直线
SdoGeometry SimpleLine = new SdoGeometry();
SimpleLine.Sdo_Gtype = 2002;
SimpleLine.Sdo_Srid = null;
decimal[] dest = ConvertPointToArray(wkt);
SimpleLine.Point = null;
SimpleLine.ElemArray = new decimal[] { 1, 2, 1 };
SimpleLine.OrdinatesArray = dest;
return SimpleLine;
}
else if (wkt.Contains("CIRCULARSTRING"))
{
//曲线
SdoGeometry CirculLine = new SdoGeometry();
CirculLine.Sdo_Gtype = 2002;
CirculLine.Sdo_Srid = null;
decimal[] dest = ConvertPointToArray(wkt);
CirculLine.Point = null;
CirculLine.ElemArray = new decimal[] { 1, 2, 2 };
CirculLine.OrdinatesArray = dest;
return CirculLine;
}
else if (wkt.Contains("POINT"))
{
if (wkt.Contains("MULTIPOINT "))
{
//多点
SdoGeometry MultiPoint = new SdoGeometry();
MultiPoint.Sdo_Gtype = 2005;
MultiPoint.Sdo_Srid = null;
decimal[] dest = ConvertPointToArray(wkt);
MultiPoint.Point = null;
MultiPoint.ElemArray = new decimal[] { 1, 1, dest .Length/ 2 };
MultiPoint.OrdinatesArray = dest;
return MultiPoint;
}
else
{
//单点
SdoGeometry SimplePoint = new SdoGeometry();
SimplePoint.Sdo_Gtype = 2001;
SimplePoint.Sdo_Srid = null;
decimal[] dest = ConvertPointToArray(wkt);
SimplePoint.Point = new SdoPoint();
SimplePoint.Point.X = dest[0];
SimplePoint.Point.Y = dest[1];
SimplePoint.Point.Z = null;
SimplePoint.ElemArray = null;
SimplePoint.OrdinatesArray = null;
return SimplePoint;
}
}
return null;
}

二、读取wkt字符串并转换为数组

#region 读取wkt字符串并转换为数组

public decimal[] ConvertPointToArray(string wkt)
{
string RegExp = @"(\d+\.\d+|\d+)\s(\d+\.\d+|\d+)";
Regex regex = new Regex(RegExp, RegexOptions.Singleline | RegexOptions.IgnoreCase);
Match m = regex.Match(wkt);
int count = 0;
while (m.Success)
{
count++;
m = m.NextMatch();
}
count *= 2;
decimal[] dest = new decimal[count];
m = regex.Match(wkt);
int arrayIndex = 0;
while (m.Success)
{
string[] arr = m.Value.Trim().Split(new Char[] { ' ' });

decimal x0 = Convert.ToDecimal(arr[0]);
decimal y0 = Convert.ToDecimal(arr[1]);

dest[arrayIndex++] = x0;
dest[arrayIndex++] = y0;

m = m.NextMatch();
}
return dest;
}

#endregion

三、多边形:环 类型数组

#region 多边形:环 类型数组

public decimal[] CreateCurArray(string wkt)
{
string[] aa = wkt.Replace("),", "@").Split('@');
decimal[] bb = new decimal[aa.Length * 3];
bb[0] = 1;
bb[1] = 1003;
bb[2] = 1;
for (int i = 1; i < aa.Length; i++)
{
int length = aa[i - 1].Length - aa[i - 1].Replace(",", "").Length + 1;
bb[i * 3] = length * 2 + 1;
bb[i * 3 + 1] = 2003;
bb[i * 3 + 2] = 1;
}
return bb;
}

#endregion

四、多边形:多面 类型数组

#region 多边形:多面 类型数组
public decimal[] CreateMultiPolygonArray(string wkt)
{
string[] aa = wkt.Replace(")),", "@").Split('@');
decimal[] bb = new decimal[aa.Length * 3];
bb[0] = 1;
bb[1] = 1003;
bb[2] = 1;
int s = 0;
for (int i = 1; i < aa.Length; i++)
{
int length= aa[i-1].Length - aa[i-1].Replace("," , "").Length+1 ;
s = s + length;
bb[i* 3] = s * 2 + 1;
bb[i* 3 + 1] = 1003;
bb[i* 3 + 2] = 1;
}
return bb;
}

#endregion

五、更新几何对象:点、线、面

#region 更新几何对象:点、线、面

public string UpdateGeometryData(string conn_str, string tableName, string keyId, string KeyValuePar, string shapeId,string wkt)
{
try
{
OracleConnection conn = new OracleConnection(conn_str);
conn.Open();

string sql = string.Format("update {0} set {1}=:shape where {3}=:objectid", tableName, shapeId, wkt, keyId, KeyValuePar);

OracleCommand cmd = new OracleCommand(sql, conn);
//图形参数
OracleParameter pra = new OracleParameter();
pra.OracleDbType = OracleDbType.Object;
pra.UdtTypeName = "MDSYS.SDO_GEOMETRY";
//图形
pra.Value = CreateGeometryByWkt(wkt);
cmd.Parameters.Add(pra);
//关键字参数
OracleParameter prc = new OracleParameter(":objectid", KeyValuePar);
cmd.Parameters.Add(prc);
cmd.ExecuteNonQuery();
conn.Close();
cmd.Dispose();
}
catch (Exception ex)
{
throw ex;
}

return null;
}

#endregion

转载于:https://www.cnblogs.com/khfang/p/5782717.html

C#创建Oracle中的几何对象:点、线、面相关推荐

  1. php对象持久化,在 Oracle 中完成 PHP5 对象的持久

    在 Oracle 中完成 PHP5 对象的持久 作者:Barry McKay 在数据库驱动的 Web 应用程序中实现 PHP5 对象的持久,朝着完全面向对象的 Web 应用程序开发迈进重要的一步. 2 ...

  2. oracle中的数据对象

    oracle中的数据对象有表.视图.索引.序列等 表的相关操作 1.创建表 方式一: 方式二:create table person( create table person1 id number(1 ...

  3. ArcObjects中的几何对象简介(一)

    几何对象是ArcObjects中使用最广泛的对象之一,用户在新建.删除.编辑何进行地理分析的时候,就是在处理一个包含几何形体的矢量对象.几何对象用于表达要素(Feature)或图形元素(Graphic ...

  4. oracle失效对象是什么意思,Oracle中无效数据库对象的处理方法

    Oracle中无效数据库对象的处理方法 Oracle总是会尝试自动重编译无效的PL/SQL对象和视图,但是可能不会成功.虽然Oracle可能建议手动地进行编译,不过我们并非必须进行这个操作.通常无效对 ...

  5. Oracle中的数据库对象

    原文地址:https://www.cnblogs.com/linhuide/p/5804878.html 参考地址:http://www.cnblogs.com/lovemoon714/archive ...

  6. Oracle中的sequence对象

    Oracle中提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方.下面就主要介绍一下关于sequence对象的生成,修改,删除等常用的操作: 1. ...

  7. Oracle中清理LOBSEGMENT对象

    文章目录 问题描述 解决步骤 相关知识 CLOB 数据类型 NCLOB 数据类型 BLOB 数据类型 BFILE 数据类型 问题描述 开发环境中做测试时,发现某个tablespace空间不足,再根据下 ...

  8. oracle中的几大对象,oracle 4个大对象(lobs)类型介绍

    oracle 4个大对象(lobs)类型介绍 在oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob. 下面是对lob数据类型的简单介绍. blob:二进 ...

  9. Oracle的ONS创建,Oracle中的ONS

    Oracle中的ONS ONS(Oracle notification service) ONS--A publish and subscribe service for communicating ...

最新文章

  1. 本科4篇顶会!清华特奖高天宇干货分享:我是这样写论文、做实验、与导师相处...
  2. python基础教程第三版怎么样-Python基础教程(第三版)(七)再谈抽象
  3. html文件上传限制类型,html input file accept 上传文件类型限制格式 MIME 类型列表
  4. 三年经验前端社招——腾讯微保
  5. http协议的各类状态码
  6. PTA14、生日悖论 (10 分)
  7. 华为开源构建工具_5个开源工具可快速构建地图应用
  8. android中将日志文件输出到sd卡
  9. [Ext JS 4] 动态加载
  10. 利用SCCM 2012 SP1为客户端进行软件批量自动安装
  11. 20155220 Exp5 MSF基础应用
  12. python编程入门经典-Python编程入门经典
  13. cuteFTP使用教程
  14. C++ 实现程序暂停
  15. ECNUOJ 2616 游黄山
  16. Tracing event
  17. 算法系列之二十:计算中国农历(一)
  18. ctrl键频繁失灵,但不是键盘本身的问题,换个键盘同样失灵
  19. linux下查看服务器的cpu、内存大小、硬盘大小
  20. CSDN:2018年度CSDN博客之星评选竞赛——094号,感谢您,投上的宝贵一票,感谢!感恩!

热门文章

  1. 图解第一个Matlab仿真实例
  2. Python入门图文解说
  3. java生成0~9个9个不相等的整数
  4. (转)创业的注意事项
  5. 2.CCGridAction(3D效果),3D反转特效,凸透镜特效,液体特效,3D翻页特效,水波纹特效,3D晃动的特效,扭曲旋转特效,波动特效,3D波动特效...
  6. js 根据所输内容生成助记码
  7. Build与Version
  8. Transaction And Lock--事务中使用return会回滚事务吗?
  9. 基于vmware服务器虚拟化管理,基于Vmware的服务器虚拟化管理论文.doc
  10. Sigmoid是品优函数吗?