`
marsprj
  • 浏览: 65427 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ArcSDE C API读取数据

    博客分类:
  • GIS
阅读更多

#include "stdafx.h"
#include "windows.h"
#include "sdetype.h"
#include "sdeerno.h"
#include "assert.h"
#include <iostream>
#pragma comment(lib, "sde.lib")


using namespace std;


SE_LAYERINFO FindLayerInfo(const char* szName, SE_LAYERINFO *layerinfo_list, long count);

int main(int argc, char* argv[])
{
	const char* szServer = "127.0.0.1";
	const char* szInstance = "5151";
	const char* szDatabase = "sde";
	const char* szUser = "sde";
	const char* szPassword = "sde";

	const char* szName = "SDE.cities";
	LONG rc;
	long lyrcount = 0;
	SE_ERROR pseError;
	SE_CONNECTION seConnection;
	SE_STREAM seStreamCursor=NULL;
	SE_COORDREF coordref=NULL;
	SE_LAYERINFO layerinfo = NULL;
	SE_LAYERINFO *layerinfo_list = NULL;
	SE_SQL_CONSTRUCT *sql=NULL;
	SE_COLUMNINFO* pColumnList = NULL;
	SHORT m_num_columns = 1; // 字段个数
	CHAR **m_columns = new CHAR*[m_num_columns]; // 字段名称数组
	m_columns[0] = "SHAPE";

	DWORD ts = GetTickCount();
	DWORD ts_con = GetTickCount();
	rc = SE_connection_create(szServer, szInstance, szDatabase, szUser, szPassword, &pseError, &seConnection);
	assert(rc==SE_SUCCESS);
	DWORD te_con = GetTickCount();
	cout<<"Connect Time"<<((DWORD)(te_con-ts_con))<<endl;

	rc = SE_layer_get_info_list(seConnection, &layerinfo_list, &lyrcount);
	assert(rc==SE_SUCCESS);

	layerinfo = FindLayerInfo(szName, layerinfo_list, lyrcount);
	assert(layerinfo!=NULL);

	rc = SE_stream_create(seConnection, &seStreamCursor);
	assert(rc==SE_SUCCESS);

	rc = SE_coordref_create (&coordref);
	assert(rc==SE_SUCCESS);

	rc = SE_layerinfo_get_coordref (layerinfo, coordref);
	assert(rc==SE_SUCCESS);

	CHAR table[SE_MAX_TABLE_LEN];
	CHAR column[SE_MAX_COLUMN_LEN];
	rc = SE_layerinfo_get_spatial_column(layerinfo,table,column);
	assert(rc == SE_SUCCESS);

	rc = SE_sql_construct_alloc(1, &sql);
	assert(rc == SE_SUCCESS);
	strcpy(sql->tables[0], table);
	sql->where = strdup("");
	rc = SE_stream_query(seStreamCursor, 1, (const CHAR **)m_columns, sql);
	assert(rc == SE_SUCCESS);
	rc = SE_stream_execute(seStreamCursor);
	assert(rc==SE_SUCCESS);
	free(sql->where);
	SE_sql_construct_free(sql);

	LONG wktLen = 0;
	LONG wkbLen = 0;
	LONG binarySize = 0;
	SE_SHAPE pShape = NULL;
	char* pWKB = NULL;
	char* pWKT = NULL;
	while(SE_stream_fetch(seStreamCursor)==SE_SUCCESS)
	{
		rc = SE_shape_create(coordref, &pShape);
		rc = SE_stream_get_shape(seStreamCursor, 1, pShape);
		if(rc==SE_SUCCESS)
		{
			rc = SE_shape_get_text_size(pShape, &wktLen);
			if(rc==SE_SUCCESS)
			{
				pWKT = new char[wktLen];
				memset(pWKT, 0, wktLen);
				SE_shape_as_text(pShape, wkbLen, pWKT);
				printf("\r%s",pWKT);
				delete pWKT;
			}
			SE_shape_free(pShape);
		}
	}
	
	delete[] m_columns;
	
	SE_layer_free_info_list(lyrcount, layerinfo_list);
	SE_coordref_free(coordref);
	SE_stream_free(seStreamCursor);
	SE_connection_free(seConnection);

	return 0;
}

SE_LAYERINFO FindLayerInfo(const char* szName, SE_LAYERINFO *layerinfo_list, long count)
{
	CHAR name[SE_MAX_COLUMN_LEN];
	CHAR cachedColumnName[SE_MAX_COLUMN_LEN];

	for(long i=0; i<count; i++)
	{
		SE_layerinfo_get_spatial_column(layerinfo_list[i], name, cachedColumnName);
		if(stricmp(name, szName)==0)
		{
			return layerinfo_list[i];	
		}
	}
	return NULL;
}



分享到:
评论

相关推荐

    ArcSDE C API示例

    C API是开发者用C语言与ArcSDE进行交互的接口,它提供了丰富的函数和结构,使得开发人员能够创建应用程序,实现对地理数据的读取、写入和管理。 在描述中提到,这是一个预研性质的示例,意味着它可能还不是完整的...

    基于ArcSDE C API的ArcSDE客户端实现方法

    2. **数据读写**:C API提供了丰富的函数,用于读取和写入空间数据。这包括了数据表的创建、数据记录的插入、更新和删除,以及空间对象的处理等功能。 3. **空间查询**:C API支持复杂的空间查询,如点查询、矩形...

    基于ArcSDE C API的ArcSDE客户端实现方法.zip

    总之,《基于ArcSDE C API的ArcSDE客户端实现方法》这份资料详细介绍了如何使用C API来开发ArcSDE客户端应用,涵盖了从初始化到操作数据、错误处理以及资源释放的全过程。通过学习和实践,开发者能够熟练掌握这一...

    ArcSDE 矢量数据访问类的设计与实现.pdf

    1. **非托管层**:负责调用ArcSDE的C API实现核心的数据访问功能。这一层主要包括与数据库交互的具体实现细节,例如连接数据库、执行查询等操作。 2. **托管层**:作为非托管层与上层应用程序之间的接口,该层将非...

    基于ArcSDE与Oracle9i Spatial的空间数据转换及备份.pdf

    本文针对ArcSDE和Oracle9i Spatial的空间数据转换和备份进行了探讨,阐述了如何通过ArcSDE的CAPI从数据库中读取数据,然后将这些数据转换为Oracle9i Spatial支持的格式。同时,讨论了空间数据备份的重要性和实施方法...

    FileGDB_API_1_5_1-64clang.zip

    通过这个API,开发者可以创建读取、写入、修改地理数据的应用程序,实现数据的导入导出,空间分析,以及与其他GIS系统的集成。 3. **64-bit Clang编译环境**: Clang是一个开源的C、C++、Objective-C和Objective-C++...

    FileGDB_API-RHEL7-64gcc83.tar.gz

    在RHEL7上,FileGDB API提供了开发人员与地理空间数据交互的能力,这包括创建、读取、更新和删除FileGDB中的要素类、表、字段、索引等对象。由于它是基于64位GCC 8.3编译,这意味着它可以利用64位计算的优势,处理更...

    MoView-VC.rar_mapobject_moview_visual c

    它能够与多种数据库系统集成,如ArcSDE、Oracle Spatial、MS SQL Server等,支持多种地理数据格式,如Shapefile、Geodatabase等。通过Visual C++,开发者可以利用MapObject的API构建用户界面,实现地图浏览、缩放、...

    A1包三维虚拟化软件.doc

    - 能够读取Oracle spatial、ArcSDE、SQL Server、SQLite、SQL Serverspatial等数据库中的空间数据。 10. **工程输出与共享**: - 能够将三维项目提取,制作成CD、手机端三维项目和用于网络发布的三维项目。 - ...

    2009.6.19—30举办3S研讨会暨Google Earth与Google Map等仿真建模与共享及ARCGIS与遥感高级程序员培训班

    11、ArcGIS高级开发应用上机或ArcGIS与SQL Server、ArcSDE的关联或 ARCCIS多元数据分析及ARCCIS图括元素计算(尽量依学员要求介绍); (空调机房) 主讲人:南京大学规划专业博士、南京路川公司特聘高级讲师 12、...

    天然气管线信息系统的设计与开发* (2009年)

    - **ArcObjects组件库**:该库提供了丰富的API接口,可用于构建GIS应用程序,实现复杂的空间分析和数据处理任务。 #### 四、系统主要功能模块 1. **可视化管理**:通过GIS技术将天然气管线及其周围环境以图形的...

    地理信息系统软件ArcGis9.2下载地址及安装方法

    ArcGIS是由Esri公司开发的一款功能强大的地理信息系统(GIS)软件,广泛应用于地理数据管理、空间分析以及地图制作等领域。ArcGIS 9.2版本在2007年发布时,提供了更为完善的GIS解决方案,支持多种操作系统环境,包括...

Global site tag (gtag.js) - Google Analytics