日期:2014-05-16  浏览次数:20506 次

java操作oracle(SDE)空间信息介绍

sde是Spatial Database Engine简写,中文全称:空间数据库引擎。

SDE是一种客户/服务器软件,可使空间数据在工业标准的数据库管理系统中存储、管理和快速查询检索。把GIS数据放在RDBMS中,但是一般的RDBMS都没有提供GIS的数据类型(如点、线、多边形、以及这些feature之间的拓扑关系和投影坐标等相关信息),RDBMS只提供了少量的数据类型支持:int,float,double,Blob,Long ,char等,一般都是数字,字符串和二进制数据几种。并且RDBMS不仅没有提取对GIS数据类型的存储,也没有提供对这些基础类型的操作(如:判断包含关系,相邻、相交、求差、距离、最短路径等)
JAVA对sde操作,首先需要下载sde支持的jar包。jpe_sdk.jar和jsde_sdk.jar两个包,这两个包可以从安装的目录下找到。c:/arcgis/server10.0/java/lib/sde/
下面是java获的sde的链接代码:

?

/**
	 * 连接sde服务
	 * @return
	 */
	public  SeConnection getConnection () {
        SeConnection conn = null ;
        try {
            conn = new SeConnection(SDE_SERVER_IP, SDE_PROT, SDE_DATEBASE_SID, SDE_USERNAME, SDE_PASSWORD); 
        } catch (SeException e) {
            return null;
        }
        return conn;
	}

?对sde数据进行添加,点线面的新增

?

?

/**
	 * 添加资源信息点到sde中
	 * @param pointBean 坐标点 POJO
	 * @param tbName    图层名称
	 * @param String typeName 所画的类型 1 点 2 线 3 面
	 * @return   Long   sde的id
	 * @throws Exception
	 */
	public Long addPointObject(PointBean pointBean, List columnList, String tableName, String typeName) throws Exception {
		SeLayer insertLayer = null;
		SeConnection conn = null;
		Long intsertRowID = null;
		SeInsert insert = null;
		try {
			conn = this.getConnection();
			insertLayer = new SeLayer( conn,  tableName, "SHAPE");
			if (insertLayer == null) {
				throw new Exception("找不到空间表:" + tableName);
			}
			conn.startTransaction();
			int arrayLength = columnList.size() + 1 ;
			String[] cols = new String[arrayLength];
			cols[0] = "SHAPE";
			for (int i = 0 ;i<columnList.size() ; i++) {
				ColumnBean columnBean = (ColumnBean)columnList.get(i);
				cols[i+1] = columnBean.getName();
			}
			insert = new SeInsert(conn);
			insert.intoTable(insertLayer.getName(), cols);
			insert.setWriteMode(true);
			SeCoordinateReference coordref = (SeCoordinateReference) insertLayer.getCoordRef();
			SeShape shape = new SeShape(coordref);
			
			if ("1".equals(typeName)) {
				this.addPoint(pointBean, shape);
			} else if ("2".equals(typeName)) {
				this.addLine(pointBean, shape);
			} else if ("3".equals(typeName)) {
				this.addPolygon(pointBean, shape);
			}
			SeRow row = insert.getRowToSet();
			row.setShape(0, shape);
			for (int i = 0 ;i<columnList.size() ; i++) {
				ColumnBean columnBean = (ColumnBean)columnList.get(i);
				if (columnBean.getTypeObject() == 1) {
					row.setNString(i+1, String.valueOf(columnBean.getValObject()));
				} else if (columnBean.getTypeObject() == 2) {
					row.setInteger(i+1, Integer.parseInt(columnBean.getValObject().toString()));
				}else if (columnBean.getTypeObject() == 3) {
					row.setDouble(i+1, Double.parseDouble(columnBean.getValObject().toString()));
				} 
			}
			insert.execute();
			intsertRowID = new Long(insert.lastInsertedRowId().longValue());
			conn.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			conn.rollbackTransaction();
		} finally {
			if (insert != null) {
				insert.close();
			}
			if (conn != null) {
				conn.close();
			}
		}
		return intsertRowID;
	}

?sde查询接口实现

?

?

/**
	 * 查询sde
	 * @param productId 产品id
	 * @throws SeException
	 */
	public SeQuery searchSde (Long productId, String tableName) throws SeException {
		SeConnection conn = getConnection();
		SeLayer layer = new SeLayer( conn,  tableName, "SHAPE");
        SeSqlConstruct sqlConstruct = new SeSqlConstruct(layer.getName());
        if (productId != null) {