arcgis关于sde的操作

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;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值