分享

arcGis 关于SDE的操作

 旭龙 2010-11-18
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;
 }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多