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 是一种强大的地理信息系统,它可以与 Oracle 数据库集成,提供了强大的空间数据管理和分析功能。要安装 ArcGIS_SDE,需要先安装 Oracle 数据库,然后安装 ArcSDE。下面将详细...
最新版本(ArcGIS Sde 10 )破解许可,仅供学习交流使用。
4. **打开工作空间**:获取连接后,你可以使用`WorkspaceFactory.OpenFromFile`或`WorkspaceFactory.OpenFromConnectionFile`方法打开一个工作空间,这通常是你的SDE连接文件(.sde)。 5. **操作数据**:现在你...
SDE(Spatial Database Engine,空间数据库引擎)是ArcGIS中的一个核心组件,用于管理、存储和分发地理空间数据。本手册将详述如何在ArcGIS 10.3中创建SDE数据库、导入与导出数据,以及发布地图的步骤。 一、创建...
ARCGIS SDE 10 破解文件 授权文件,ARCGIS SDE 10 破解文件 授权文件
arcgis_SDE_for_Java样例
### ArcGIS SDE:深入理解与优化策略 #### 引言 随着地理信息系统(GIS)技术的不断发展,ArcGIS SDE作为ESRI公司推出的一种高级数据管理解决方案,为大规模地理空间数据提供了强大的支持。ArcGIS SDE不仅仅是一种...
### ArcGIS连接SDE与Oracle客户端的安装及配置 #### 一、背景介绍 在使用ArcGIS进行空间数据管理时,经常会遇到需要连接到Oracle数据库的情况。为了实现ArcGIS与Oracle Spatial and Graph (SDE)数据库的有效连接,...
SDE是ArcGIS的核心组件之一,它允许用户直接操作存储在关系数据库管理系统(RDBMS)中的空间数据。SDE通过ODBC或JDBC接口与数据库交互,提供了一种统一的方式来管理和操作不同数据库平台上的地理数据,如Oracle ...
ArcGIS 9.2 Desktop + ArcGIS 9.2 server + ArcGIS SDE 安装图解 安装详解 傻瓜式教你安装ArcGIS,图片加说明
arcgis9.1 sde licence.ecp是arcgis9.1 sde的许可文件
arcgissde 授权码 arcgissde 授权码 arcgissde 授权码 arcgissde 授权码 arcgissde 授权码
arcgissde9.2授权文件
ArcGIS SDE(Spatial Database Engine)是Esri公司开发的一款用于管理和操作地理空间数据的数据库系统,它与各种关系型数据库管理系统(RDBMS)如Oracle、SQL Server、IBM DB2等集成,提供了强大的地理空间数据存储...
首先,PostgreSQL是一个开源的关系型数据库管理系统,而SDE(Spatial Database Engine)是Esri提供的一个组件,用于在GIS(地理信息系统)中管理和操作空间数据。ArcGIS通过SDE接口与PostgreSQL数据库建立连接,以便...
《全面解析ARCGISSDE9.2:解锁GIS技术新高度》 ARCGISSDE9.2是GIS(地理信息系统)领域中一个重要的版本,它为用户提供了强大的空间数据管理和分析功能。此版本的出现,进一步提升了地理信息系统的实用性和易用性,...
对于ArcGIS 9.3,通常需要Windows Server或相应的桌面操作系统,并且需要Oracle 10g RDBMS的相应版本。 1. **启动安装过程**: - 找到安装文件所在的路径,例如`c:\安装软件\ ArcSde9.3Oracle10g`。 - 双击该目录...
ArcGIS、IMS和SDE是Esri公司的核心地理信息系统(GIS)产品,广泛应用于地图制作、地理数据分析和空间数据管理。这些产品在不同版本中,如9.1、9.2和9.3,有着各自的功能特点和改进,而授权文件则是确保软件合法使用...
arcgis sde 10授权文件 for oracle11g