设为首页 收藏本站
查看: 876|回复: 0

[经验分享] 利用ArcSDE C API向SQL SERVER空间数据库中添加实体图形

[复制链接]

尚未签到

发表于 2015-7-3 07:47:45 | 显示全部楼层 |阅读模式
摘要:本文以一个C/C++实例分步讲述了利用ArcSDE C API向空间数据库中添加实体图形的方法。

利用ArcSDE8.1 C API向空间数据库中添加实体图形大致可分为六步。步骤如下:

第一步:与空间数据库建立连接。

SE_CONNECTION handle; //空间数据库连接对象

SE_ERROR Connect_error; //错误状态

LONG rc; //执行结果状态

CHAR server[30] = "LCR"; //空间数据库服务器名

CHAR instance[30] = "esri_sde"; //空间数据库实例名

CHAR database[30] = ""; //数据库名

CHAR user[30] = "sa"; //用户名

CHAR passwd[30] = "sapassword"; //密码



/* 创建连接 */

rc = SE_connection_create(

server, instance, database, user, passwd, &Connect_error, &handle);

/*错误检查 */

check_error (handle, NULL, rc, "SE_connection_create");



第二步:建立用户定义属性表。

LONG num_cols; //列数

SE_SHAPE shape; //形

SE_ENVELOPE rect; //矩形范围

LONG part_offsets[2], int_val;

CHAR **attrs; //属性列

CHAR column[32], table[32]; //列与表

SE_COORDREF coordref; //坐标系引用

SE_POINT pt[10]; //坐标点

SE_LAYERINFO layer; //层信息

SE_COLUMN_DEF *column_defs; //列定义对象

SE_STREAM stream; //数据流



/* 创建数据流连接 */

SE_stream_create (handle, &stream);

check_error (handle, NULL, rc, "SE_stream_create");



/* 创建用户表 */

strcpy(table, "MYTABLE");

num_cols = 1;

column_defs = (SE_COLUMN_DEF *) calloc (num_cols, sizeof(SE_COLUMN_DEF));

strcpy (column_defs[0].column_name, "ATTR_COL");

column_defs[0].sde_type = SE_INTEGER_TYPE; //为整形列

column_defs[0].nulls_allowed = TRUE; //允许为空

rc = SE_table_create(handle, table, num_cols, column_defs,"DEFAULTS");

check_error (handle, NULL, rc, "SE_table_create");

第三步:创建并设置图层信息。

/* 创建层的坐标系参考 */

rc = SE_coordref_create (&coordref);

check_error (handle, NULL, rc, "SE_coordref_create");

//设置假定坐标源点与比例尺

rc = SE_coordref_set_xy (coordref,0,0,10000);

check_error (handle, NULL, rc, "SE_coordref_set_xy");

//分配并初始化层信息结构layer

rc = SE_layerinfo_create (coordref, &layer);

check_error (handle, NULL, rc, "SE_layerinfo_create");



//设置层的格网尺寸、允许的形类型、创建关键字和空间列

rc = SE_layerinfo_set_grid_sizes (layer,1000,0,0);

check_error (handle, NULL, rc, "SE_layerinfo_set_grid_sizes");

rc = SE_layerinfo_set_shape_types(layer, SE_NIL_TYPE_MASK |

SE_POINT_TYPE_MASK |

SE_LINE_TYPE_MASK |

SE_SIMPLE_LINE_TYPE_MASK |

SE_AREA_TYPE_MASK |

SE_MULTIPART_TYPE_MASK );

check_error(handle, NULL, rc, "SE_layerinfo_set_shape_types");

rc = SE_layerinfo_set_creation_keyword (layer, "DEFAULTS");

check_error (handle, NULL, rc, "SE_layerinfo_set_creation_keyword");

strcpy(column, "SPATIAL_COL");

rc = SE_layerinfo_set_spatial_column (layer, table, column);

check_error (handle, NULL, rc, "SE_layerinfo_set_spatial_column");



/* 创建层 */

rc = SE_layer_create (handle, layer, 0,0);

check_error (handle, NULL, rc, "SE_layer_create");



第四步:创建图形实体对象,并设置属性与空间列。

/* 创建形 */

rc = SE_shape_create (coordref, &shape);

check_error (handle, NULL, rc, "SE_shape_create");



/* 将表插入数据流 */

attrs = (CHAR **) malloc (sizeof(CHAR *) * 2);

attrs[0] = "ATTR_COL";

attrs[1] = column;

rc = SE_stream_insert_table (stream, table, 2, (const CHAR**) attrs);

check_error (handle, NULL, rc, "SE_stream_insert_table");



free (attrs);





/* 设置矩形的最值并产生矩形*/

rect.minx = 5000.0;

rect.miny = 1000.0;

rect.maxx = 8000.0;

rect.maxy = 4000.0;



//生成矩形

rc = SE_shape_generate_rectangle (&rect, shape);

check_error (handle, NULL, rc, "SE_shape_generate_rectangle");



/* 设定形和属性列 */

int_val = 2;

rc = SE_stream_set_integer (stream, 1, &int_val);

check_error (NULL, stream, rc, "SE_stream_set_integer");

rc = SE_stream_set_shape (stream, 2, shape);

check_error (NULL, stream, rc, "SE_stream_set_shape");

/*插入行 */

rc = SE_stream_execute (stream);

check_error (NULL, stream, rc, "SE_stream_execute");



/* 对面域设定坐标数组 – 一个中间有洞的矩形,并生成多边形 */

part_offsets[0] = 0;

pt[0].x = 1000.; pt[0].y = 1000.;

pt[1].x = 4000.; pt[1].y = 1000.;

pt[2].x = 4000.; pt[2].y = 4000.;

pt[3].x = 1000.; pt[3].y = 4000.;

pt[4].x = 1000.; pt[4].y = 1000.;

pt[5].x = 2000.; pt[5].y = 2000.;

pt[6].x = 2000.; pt[6].y = 3000.;

pt[7].x = 3000.; pt[7].y = 3000.;

pt[8].x = 3000.; pt[8].y = 2000.;

pt[9].x = 2000.; pt[9].y = 2000.;



//生成多边形

rc = SE_shape_generate_polygon (10,1,part_offsets,pt,NULL,NULL,shape);

check_error (handle, NULL, rc, "SE_shape_generate_polygon");



/* 设定形及属性列 */

int_val = 3;

rc=SE_stream_set_integer (stream, 1, &int_val);

check_error (NULL, stream, rc, "SE_stream_set_integer");

rc = SE_stream_set_shape (stream, 2, shape);

check_error (NULL, stream, rc, "SE_stream_set_shape");



/* 插入行 */

rc = SE_stream_execute (stream);

check_error (NULL, stream, rc, "SE_stream_execute");



第五步:释放资源,例如,形对象、坐标参考对象、数据流对象等。

SE_shape_free (shape);

SE_coordref_free (coordref);

SE_stream_free (stream);



第六步:关闭与空间数据库的连接。

SE_connection_free (handle);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-82676-1-1.html 上篇帖子: SQL Server 2008 R2 数据库之间的数据同步热备份 下篇帖子: Login failed for user 'username'. The user is not associated with a trusted SQL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表