`
liggway
  • 浏览: 7026 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

arcgis关于sde的操作

    博客分类:
  • sde
XML 
阅读更多
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import com.esri.sde.sdk.client.SDEPoint;
import com.esri.sde.sdk.client.SeColumnDefinition;
import com.esri.sde.sdk.client.SeConnection;
import com.esri.sde.sdk.client.SeCoordinateReference;
import com.esri.sde.sdk.client.SeDelete;
import com.esri.sde.sdk.client.SeException;
import com.esri.sde.sdk.client.SeExtent;
import com.esri.sde.sdk.client.SeInsert;
import com.esri.sde.sdk.client.SeLayer;
import com.esri.sde.sdk.client.SeObjectId;
import com.esri.sde.sdk.client.SeQuery;
import com.esri.sde.sdk.client.SeRow;
import com.esri.sde.sdk.client.SeShape;
import com.esri.sde.sdk.client.SeSqlConstruct;
import com.esri.sde.sdk.client.SeUpdate;
import com.nankang.webgis.vo.WebgisAnnotationVO;
import com.nankang.framework.util.StringUtil;
import com.nankang.framework.util.XmlUtil;


public class CopyOfSDEUtil {

	/**
	 * 构造函数. 
	 */
	private CopyOfSDEUtil() {
		super();
	}
	//连接池配置(未实现同步)
	private static String  server,database,user,password;   
	//标注层,区县层,样本区域层,楼幢层 
	private static int instance,maxCount;       
	private static ArrayList connPool = new ArrayList();
	private static MySdeConnection  tempConn = null;
	//区县坐标系
	private static SeCoordinateReference  regionCoordref = null;
	//区县图形map(根据区县编号获取后)
	private static HashMap regionShapeList = new HashMap();
	static
	{
		try { 
			InputStream is = CopyOfSDEUtil.class.getResourceAsStream("/sdeconfig.xml");	
			InputStreamReader reader = new InputStreamReader(is);
			Document document = XmlUtil.parseXml(reader, "GBK");
			NodeList dataTypeList = document.getElementsByTagName("sde");
			Element node = (Element) dataTypeList.item(0);
			server = StringUtil.format(WebgisUtil.getSubNodeValue(node,"server").trim());
			database = StringUtil.format(WebgisUtil.getSubNodeValue(node,"database").trim());
			user = StringUtil.format(WebgisUtil.getSubNodeValue(node,"user").trim());
			password = StringUtil.format(WebgisUtil.getSubNodeValue(node,"password").trim());
			instance = StringUtil.getIntValue(WebgisUtil.getSubNodeValue(node,"instance").trim());
			maxCount = StringUtil.getIntValue(WebgisUtil.getSubNodeValue(node,"maxcount").trim());
			for(int i=0;i<maxCount;i++)
			{
				tempConn = new MySdeConnection(server, instance, database, user, password); 
				connPool.add(tempConn);
			}
		}catch (SeException e) { 
			System.out.println("无法创建连接,请检查数据库参数配置文件sdeconfig.xml!");
			e.printStackTrace();    
		}
	}
	public static void init(){
		
	}

	public static boolean testConnecttion()
	{
		try{
			MySdeConnection t_conn = (MySdeConnection)getSeConnection();
			if(t_conn!=null)
			{
				t_conn.close();
				return true;
			}else
				return false;
		}catch(Exception e)
		{
			return false;
		}
	}
	
	public static MySdeConnection  getSeConnection()
	{
		for(int i=0;i<maxCount;i++)
		{
			if(!tempConn.isBusy())
			{
				tempConn = (MySdeConnection)connPool.get(i); 
				tempConn.setIsBusy();
				return tempConn;
			}
		}
        System.out.println("无可用的连接,请检查是否正确关闭连接!");
        return null;
	}
    
	/**
	 * 增加图层对象. 
	 * @param numParts  对象个数,通常为1111111111222211111111
	 * @param offsets  每个对象的坐标偏移量,即从offsets[i]开始第i个对象的坐标
	 */
    public static boolean addObject(WebgisAnnotationVO anno,int numParts,int [] offsets,String[] x,String[] y){
    	MySdeConnection conn = getSeConnection();
    	SeInsert insert = null;
    	try {
    		conn.startTransaction();
			SeLayer annotation = new SeLayer(conn,new SeObjectId(anno.getSdeID()));
            //需要修改的列
			String[] columns = anno.getColumns().split(",");
			String[] cols = new String[columns.length+1];
			System.arraycopy(columns,0,cols,0,columns.length);
			cols[columns.length] = annotation.getSpatialColumn();
			//列值
			String[] values = anno.getValues();
			insert = new SeInsert(conn);
			insert.intoTable(annotation.getName(),cols);
			insert.setWriteMode(true);
			SeRow row = insert.getRowToSet();
			SeColumnDefinition[] col = row.getColumns();
			for(int i=0;i<cols.length-1;i++)
                row.setNString(i,StringUtil.format(values[i]));
			//shape处理
            SeShape shape = new SeShape(annotation.getCoordRef());
            SDEPoint [] points = new SDEPoint [x.length];
            for(int i=0;i<points.length;i++)
            	points[i] = new SDEPoint(StringUtil.getDoubleValue(x[i]),StringUtil.getDoubleValue(y[i]));
            if(anno.getAnnotype()==WebgisCommon.GIS_ANNO_POINT)
            {
                shape.generatePoint(1,points);
            }
            if(anno.getAnnotype()==WebgisCommon.GIS_ANNO_POLYGON)
            {
                shape.generatePolygon(points.length,1,offsets,points);
            }
            row.setShape(cols.length-1,shape);
            insert.execute();
            conn.commitTransaction();
		} catch (SeException e) {
			try {
				conn.rollbackTransaction();
			} catch (SeException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
			return false;
		}finally
		{
			try {
				conn.close();
				insert.close();
			} catch (SeException e1) {
				e1.printStackTrace();
			}
		}
        return true;
    }
    
    
    //修改图层对象(numParts)
    public static boolean updateObject(String objectID,WebgisAnnotationVO anno,int numParts,int [] offsets,String[] x,String[] y,boolean withMap){
    	MySdeConnection conn = getSeConnection();
    	SeUpdate update = null;
    	try {
    		conn.startTransaction();
			SeLayer annotation = new SeLayer(conn,new SeObjectId(anno.getSdeID()));
			
			//需要修改的列
			String[] columns = anno.getColumns().split(",");
			int colsLen = withMap?columns.length+1:columns.length;
			String[] cols = new String[colsLen];
			System.arraycopy(columns,0,cols,0,columns.length);
			if(withMap) cols[columns.length] = annotation.getSpatialColumn();
			//列值
			String[] values = anno.getValues();
			update = new SeUpdate(conn);
			update.toTable(annotation.getName(),cols,"OBJECTID="+objectID);
			update.setWriteMode(true);
			SeRow row = update.getRowToSet();
			SeColumnDefinition[] col = row.getColumns();
			for(int i=0;i<columns.length;i++)
                row.setNString(i,StringUtil.format(values[i]));
			//shape处理
			if(withMap){
	            SeShape shape = new SeShape(annotation.getCoordRef());
	            SDEPoint [] points = new SDEPoint [x.length];
	            for(int i=0;i<points.length;i++)
	            	points[i] = new SDEPoint(StringUtil.getDoubleValue(x[i]),StringUtil.getDoubleValue(y[i]));
	            if(anno.getAnnotype()==WebgisCommon.GIS_ANNO_POINT)
	            {
	                shape.generatePoint(1,points);
	            }
	            if(anno.getAnnotype()==WebgisCommon.GIS_ANNO_POLYGON)
	            {
	            	shape.generatePolygon(points.length,1,offsets,points);
	            }
	            row.setShape(col.length-1,shape);
			}
            update.execute();
            conn.commitTransaction();
		} catch (SeException e) {
			try {
				conn.rollbackTransaction();
			} catch (SeException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
			return false;
		}finally
		{
			try {
				conn.close();
				update.close();
			} catch (SeException e1) {
				e1.printStackTrace();
			}
		}
        return true;
    }
    
    //删除
    public static boolean deleteObject(String objectID,WebgisAnnotationVO anno){
    	MySdeConnection conn = getSeConnection();
    	SeDelete delete = null;
    	try {
    		conn.startTransaction();
			SeLayer annotation = new SeLayer(conn,new SeObjectId(anno.getSdeID()));
			delete = new SeDelete(conn);
			delete.byId(annotation.getName(),new SeObjectId(Long.parseLong(objectID)));
                          //delete.execute();  此处为arcgis的bug,9.19.1之后的版本可能会修复	
			conn.commitTransaction();
		} catch (SeException e) {
			try {
				conn.rollbackTransaction();
			} catch (SeException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
			return false;
		}finally
		{
			try {
				conn.close();
				delete.close();
			} catch (SeException e1) {
				e1.printStackTrace();
			}
		}
        return true;
    }
	
   
    public static SeCoordinateReference getRegionSeCoordinateReference(){
        return regionCoordref;
    }
    
    
    //根据坐标获得所在区县编号
    public static String getRegionID(double x,double y){
    	Iterator it = regionShapeList.keySet().iterator();
    	String code;
    	SeShape shape;
    	try {
	        while(it.hasNext())
	        {
	        	code = StringUtil.format(it.next());
	        	shape = (SeShape)regionShapeList.get(code);
	        	SeShape point;
				
					point = new SeShape(shape.getCoordRef());
				
				point.generatePoint(1,new SDEPoint []{new SDEPoint(x,y)});
	        	if(point.isWithin(shape))
	        		return code;
        }
        return "";
    	} catch (SeException e) {
			e.printStackTrace();
			return "";
		}
    }
    
    public static void main(String [] args) throws SeException
    {
    }  
}
class MySdeConnection extends SeConnection
{
	private boolean isBusy = false;
	public MySdeConnection(String server, int instance, String database, String user, String password) throws SeException
	{
		super(server, instance, database, user, password);
	}
	public void close()
	{
		isBusy = false;
	}
	public void setIsBusy()
	{
		isBusy = true;
	}
	public boolean isBusy()
	{
		return isBusy;
	}
}
分享到:
评论

相关推荐

    arcgis_SDE安装步骤

    ArcGIS_SDE 安装步骤详解 ArcGIS_SDE 是一种强大的地理信息系统,它可以与 Oracle 数据库集成,提供了强大的空间数据管理和分析功能。要安装 ArcGIS_SDE,需要先安装 Oracle 数据库,然后安装 ArcSDE。下面将详细...

    ArcGIS Sde 10许可

    最新版本(ArcGIS Sde 10 )破解许可,仅供学习交流使用。

    ArcGis中SDE连接数据库

    4. **打开工作空间**:获取连接后,你可以使用`WorkspaceFactory.OpenFromFile`或`WorkspaceFactory.OpenFromConnectionFile`方法打开一个工作空间,这通常是你的SDE连接文件(.sde)。 5. **操作数据**:现在你...

    Arcgis10.3创建SDE数据库、导入、导出手册

    SDE(Spatial Database Engine,空间数据库引擎)是ArcGIS中的一个核心组件,用于管理、存储和分发地理空间数据。本手册将详述如何在ArcGIS 10.3中创建SDE数据库、导入与导出数据,以及发布地图的步骤。 一、创建...

    ARCGIS SDE 10 破解文件

    ARCGIS SDE 10 破解文件 授权文件,ARCGIS SDE 10 破解文件 授权文件

    arcgis_SDE_for_Java样例.pdf

    arcgis_SDE_for_Java样例

    arcgis SDE

    ### ArcGIS SDE:深入理解与优化策略 #### 引言 随着地理信息系统(GIS)技术的不断发展,ArcGIS SDE作为ESRI公司推出的一种高级数据管理解决方案,为大规模地理空间数据提供了强大的支持。ArcGIS SDE不仅仅是一种...

    ArcGIS连接SDE 在数据库连接处添加数据库连接之前必须安装oracle client客户端库

    ### ArcGIS连接SDE与Oracle客户端的安装及配置 #### 一、背景介绍 在使用ArcGIS进行空间数据管理时,经常会遇到需要连接到Oracle数据库的情况。为了实现ArcGIS与Oracle Spatial and Graph (SDE)数据库的有效连接,...

    arcgis SDE数据源直连

    SDE是ArcGIS的核心组件之一,它允许用户直接操作存储在关系数据库管理系统(RDBMS)中的空间数据。SDE通过ODBC或JDBC接口与数据库交互,提供了一种统一的方式来管理和操作不同数据库平台上的地理数据,如Oracle ...

    ArcGIS 9.2 Desktop + ArcGIS 9.2 server + ArcGIS SDE 安装图解 安装详解

    ArcGIS 9.2 Desktop + ArcGIS 9.2 server + ArcGIS SDE 安装图解 安装详解 傻瓜式教你安装ArcGIS,图片加说明

    arcgis9.1 sde licence.ecp

    arcgis9.1 sde licence.ecp是arcgis9.1 sde的许可文件

    ArcGIS10.2 SDE连接postgresql

    arcgissde 授权码

    arcgissde 授权码 arcgissde 授权码 arcgissde 授权码 arcgissde 授权码 arcgissde 授权码

    arcgissde9.2授权文件

    arcgissde9.2授权文件

    Arcgis SDE10 许可

    ArcGIS SDE(Spatial Database Engine)是Esri公司开发的一款用于管理和操作地理空间数据的数据库系统,它与各种关系型数据库管理系统(RDBMS)如Oracle、SQL Server、IBM DB2等集成,提供了强大的地理空间数据存储...

    Arcgis连接 postgresql sde 时遇到的问题以及解决办法

    首先,PostgreSQL是一个开源的关系型数据库管理系统,而SDE(Spatial Database Engine)是Esri提供的一个组件,用于在GIS(地理信息系统)中管理和操作空间数据。ArcGIS通过SDE接口与PostgreSQL数据库建立连接,以便...

    ARCGISSDE9.2

    《全面解析ARCGISSDE9.2:解锁GIS技术新高度》 ARCGISSDE9.2是GIS(地理信息系统)领域中一个重要的版本,它为用户提供了强大的空间数据管理和分析功能。此版本的出现,进一步提升了地理信息系统的实用性和易用性,...

    arcgis93 sde安装步骤

    对于ArcGIS 9.3,通常需要Windows Server或相应的桌面操作系统,并且需要Oracle 10g RDBMS的相应版本。 1. **启动安装过程**: - 找到安装文件所在的路径,例如`c:\安装软件\ ArcSde9.3Oracle10g`。 - 双击该目录...

    arcgis ims sde 等 9.1 9.2 9.3 授权文件集合

    ArcGIS、IMS和SDE是Esri公司的核心地理信息系统(GIS)产品,广泛应用于地图制作、地理数据分析和空间数据管理。这些产品在不同版本中,如9.1、9.2和9.3,有着各自的功能特点和改进,而授权文件则是确保软件合法使用...

    arcgis sde 10授权文件

    arcgis sde 10授权文件 for oracle11g

Global site tag (gtag.js) - Google Analytics