我做过一点点AE for java的开发,最早也做过Mo for java的开发,
所以想再这儿和大家探讨一下ESRI for java方面的开发
先贴一个AE for java that is Edit 类 回头贴 网络分析的模型(路径分析,服务区分析等)代码
回家休息五一,回来慢慢介绍详细

/*
* EditLayer.java
*
* Created on 2006年11月1日, 上午9:44
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.hltsoft.mfsoft.wzglsoft.dataOption;
/**
* @author new
*/
import java.awt.HeadlessException;
import java.io.IOException;
import java.util.Vector;
import javax.swing.JOptionPane;
import com.esri.arcgis.carto.IActiveView;
import com.esri.arcgis.carto.IActiveViewProxy;
import com.esri.arcgis.carto.IFeatureLayer;
import com.esri.arcgis.carto.IFeatureLayerProxy;
import com.esri.arcgis.carto.IFeatureSelection;
import com.esri.arcgis.carto.IFeatureSelectionProxy;
import com.esri.arcgis.carto.ILayer;
import com.esri.arcgis.carto.IMap;
import com.esri.arcgis.carto.esriViewDrawPhase;
import com.esri.arcgis.display.IDisplayFeedback;
import com.esri.arcgis.display.ILineMovePointFeedback;
import com.esri.arcgis.display.ILineMovePointFeedbackProxy;
import com.esri.arcgis.display.IMovePointFeedback;
import com.esri.arcgis.display.IMovePointFeedbackProxy;
import com.esri.arcgis.display.INewLineFeedback;
import com.esri.arcgis.display.INewLineFeedbackProxy;
import com.esri.arcgis.display.INewMultiPointFeedback;
import com.esri.arcgis.display.INewMultiPointFeedbackProxy;
import com.esri.arcgis.display.INewPolygonFeedback;
import com.esri.arcgis.display.INewPolygonFeedbackProxy;
import com.esri.arcgis.display.IPolygonMovePointFeedback;
import com.esri.arcgis.display.IPolygonMovePointFeedbackProxy;
import com.esri.arcgis.display.LineMovePointFeedback;
import com.esri.arcgis.display.MovePointFeedback;
import com.esri.arcgis.display.NewLineFeedback;
import com.esri.arcgis.display.NewMultiPointFeedback;
import com.esri.arcgis.display.NewPolygonFeedback;
import com.esri.arcgis.display.PolygonMovePointFeedback;
import com.esri.arcgis.geodatabase.ICursor;
import com.esri.arcgis.geodatabase.IDataset;
import com.esri.arcgis.geodatabase.IDatasetProxy;
import com.esri.arcgis.geodatabase.IEnumFeature;
import com.esri.arcgis.geodatabase.IEnumFeatureProxy;
import com.esri.arcgis.geodatabase.IFeature;
import com.esri.arcgis.geodatabase.IFeatureClass;
import com.esri.arcgis.geodatabase.IFeatureCursor;
import com.esri.arcgis.geodatabase.IFeatureCursorProxy;
import com.esri.arcgis.geodatabase.IObjectClass;
import com.esri.arcgis.geodatabase.IQueryFilter;
import com.esri.arcgis.geodatabase.IQueryFilterProxy;
import com.esri.arcgis.geodatabase.ISelectionSet;
import com.esri.arcgis.geodatabase.ISpatialFilter;
import com.esri.arcgis.geodatabase.IWorkspaceEdit;
import com.esri.arcgis.geodatabase.IWorkspaceEditProxy;
import com.esri.arcgis.geodatabase.QueryFilter;
import com.esri.arcgis.geodatabase.SpatialFilter;
import com.esri.arcgis.geodatabase.esriSpatialRelEnum;
import com.esri.arcgis.geometry.IGeometry;
import com.esri.arcgis.geometry.IGeometryCollection;
import com.esri.arcgis.geometry.IGeometryCollectionProxy;
import com.esri.arcgis.geometry.IGeometryProxy;
import com.esri.arcgis.geometry.IHitTest;
import com.esri.arcgis.geometry.IHitTestProxy;
import com.esri.arcgis.geometry.IPath;
import com.esri.arcgis.geometry.IPathProxy;
import com.esri.arcgis.geometry.IPoint;
import com.esri.arcgis.geometry.IPointCollection;
import com.esri.arcgis.geometry.IPointCollectionProxy;
import com.esri.arcgis.geometry.IPointProxy;
import com.esri.arcgis.geometry.IPolygon;
import com.esri.arcgis.geometry.IPolygonProxy;
import com.esri.arcgis.geometry.IPolyline;
import com.esri.arcgis.geometry.IPolylineProxy;
import com.esri.arcgis.geometry.ITopologicalOperator;
import com.esri.arcgis.geometry.ITopologicalOperatorProxy;
import com.esri.arcgis.geometry.Multipoint;
import com.esri.arcgis.geometry.Point;
import com.esri.arcgis.geometry.esriGeometryHitPartType;
import com.esri.arcgis.geometry.esriGeometryType;
import com.esri.arcgis.system.esriDrawPhase;
public class EditLayer
{
private ILayer m_pCurrentLayer;
private IMap m_pMap;
private IFeature m_pEditFeature;
private IPoint m_pPoint;
private boolean vertexHit;
private IDisplayFeedback m_pFeedback;
private boolean m_bInUse=false;
private IPointCollection m_pPointCollection;

private Vector EditFeatures;
/** Creates a new instance of EditLayer */
public EditLayer()
{
  EditFeatures = new Vector();
}
public EditLayer(IMap map,ILayer layer)
{
  m_pMap=map;
  m_pCurrentLayer=layer;
  EditFeatures = new Vector();
}
public void setMap(IMap map)
{
  m_pMap=map;
}
public void setLayer(ILayer layer)
{
  m_pCurrentLayer=layer;
}
public IMap getMap()
{
  return m_pMap;
}
public ILayer getLayer()
{
  return m_pCurrentLayer;
}

public Vector getFeatures(){
  return EditFeatures;
}
public void StartEditing()
{
  IWorkspaceEdit pWorkspaceEdit;
  IFeatureLayer pFeatureLayer;
  IDataset pDataset;
  try
  {
   if(m_pCurrentLayer==null)
   {
    JOptionPane.showMessageDialog(null,"没有选择要编辑的层!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   if(pFeatureLayer==null)
   {
    JOptionPane.showMessageDialog(null,"该层不可编辑!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pDataset=new IDatasetProxy(pFeatureLayer.getFeatureClass());
   if(pDataset==null)
   {
    JOptionPane.showMessageDialog(null,"该层没有合适的地理集!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pWorkspaceEdit=new IWorkspaceEditProxy(pDataset.getWorkspace());
   if(!pWorkspaceEdit.isBeingEdited())
   {   
    pWorkspaceEdit.startEditing(true);
    pWorkspaceEdit.enableUndoRedo();
    System.out.println("Start Editing...");
    return;
   }
   else
   {
    JOptionPane.showMessageDialog(null,"该地理空间不允许编辑!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public void StopEditing()
{
  IWorkspaceEdit pWorkspaceEdit;
  IFeatureLayer pFeatureLayer;
  IDataset pDataset;
  IActiveView pActiveView;
  boolean bHasEdits[]={false};
  boolean bSave=true;
  try
  {
   if(m_pCurrentLayer==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   if(pFeatureLayer==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pDataset=new IDatasetProxy(pFeatureLayer.getFeatureClass());
   if(pDataset==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pWorkspaceEdit=new IWorkspaceEditProxy(pDataset.getWorkspace());
   if(pWorkspaceEdit.isBeingEdited())
   {
    pWorkspaceEdit.hasEdits(bHasEdits);
    if(bHasEdits[0]==true)
    {
    }
    if(bSave)
    {
//     int i=JOptionPane.showConfirmDialog(new JFrame(),"确认保存吗?","询问",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
//     if(i==JOptionPane.YES_OPTION)
//     {
      pWorkspaceEdit.stopEditing(true);
      m_pMap.clearSelection();
      pActiveView=new IActiveViewProxy(m_pMap);
      pActiveView.refresh();
      return;
     //}
    }
    else
    {
     JOptionPane.showMessageDialog(null,"取消了保存!","提示",JOptionPane.ERROR_MESSAGE);
     return;
    }
   }
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public boolean isEditstate()
{
  IWorkspaceEdit pWorkspaceEdit;
  IFeatureLayer pFeatureLayer;
  IDataset pDataset;
  try
  {
   if(m_pCurrentLayer==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return false;
   }
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   if(pFeatureLayer==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return false;
   }
   pDataset=new IDatasetProxy(pFeatureLayer.getFeatureClass().getFeatureDataset());
   if(pDataset==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return false;
   }
   pWorkspaceEdit=new IWorkspaceEditProxy(pDataset.getWorkspace());
   if(pWorkspaceEdit.isBeingEdited())
   {
    return true;
   }
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
  return false;
}

 

 

 

public void SketchMouseDown(int x,int y)
{
  IPoint pPoint;
  IActiveView pActiveView;
  INewPolygonFeedback pPolyFeed;
  INewLineFeedback pLineFeed;
  IFeatureLayer pFeatureLayer;
  try
  {
   if(m_pCurrentLayer==null)
   {
    JOptionPane.showMessageDialog(null,"没有选择要编辑的层!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   if(pFeatureLayer==null)
   {
    JOptionPane.showMessageDialog(null,"该层不可编辑!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   if(pFeatureLayer.getFeatureClass()==null)
   {
    JOptionPane.showMessageDialog(null,"该层的地理集不合适编辑!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pActiveView=new IActiveViewProxy(m_pMap);
   pPoint=pActiveView.getScreenDisplay().getDisplayTransformation().toMapPoint(x,y);
   if(!m_bInUse)
   {
    if(pFeatureLayer.getFeatureClass().getShapeType()==esriGeometryType.esriGeometryPoint)
    {
     CreateFeature(pPoint);
    }
    else if(pFeatureLayer.getFeatureClass().getShapeType()==esriGeometryType.esriGeometryMultipoint)
    {
     m_bInUse=true;
     m_pFeedback=new NewMultiPointFeedback();
     INewMultiPointFeedback pMPFeed=new INewMultiPointFeedbackProxy(m_pFeedback);
     m_pPointCollection=new Multipoint();
     pMPFeed.start(m_pPointCollection,pPoint);
    }
    else if(pFeatureLayer.getFeatureClass().getShapeType()==esriGeometryType.esriGeometryPolyline)
    {
     m_bInUse=true;
     m_pFeedback=new NewLineFeedback();
     pLineFeed=new INewLineFeedbackProxy(m_pFeedback);
     pLineFeed.start(pPoint);
    }
    else if(pFeatureLayer.getFeatureClass().getShapeType()==esriGeometryType.esriGeometryPolygon)
    {
     m_bInUse=true;
     m_pFeedback=new NewPolygonFeedback();
     pPolyFeed=new INewPolygonFeedbackProxy(m_pFeedback);
     pPolyFeed.start(pPoint);
    }
    /*
     * switch(pFeatureLayer.getFeatureClass().getShapeType()){ case
     * esriGeometryType.esriGeometryPoint: return; case
     * esriGeometryType.esriGeometryMultipoint: return; case
     * esriGeometryType.esriGeometryPolyline: return; case
     * esriGeometryType.esriGeometryPolygon: return; default : }
     */
    if(m_pFeedback!=null)
    {
     m_pFeedback.setDisplayByRef(pActiveView.getScreenDisplay());
    }
   }
   else
   {
    if(m_pFeedback instanceof NewMultiPointFeedback)
    {
     m_pPointCollection.addPoint(pPoint,null,null);
    }
    else if(m_pFeedback instanceof NewLineFeedback)
    {
     pLineFeed=new INewLineFeedbackProxy(m_pFeedback);
     pLineFeed.addPoint(pPoint);
    }
    else if(m_pFeedback instanceof NewPolygonFeedback)
    {
     pPolyFeed=new INewPolygonFeedbackProxy(m_pFeedback);
     pPolyFeed.addPoint(pPoint);
    }
   }
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}

 

 

 

 

public void SketchMouseMove(int x,int y)
{
  if((!m_bInUse)||m_pFeedback==null)
  {
   return;
  }
  IActiveView pActiveView;
  try
  {
   pActiveView=new IActiveViewProxy(m_pMap);
   m_pFeedback.moveTo(pActiveView.getScreenDisplay().getDisplayTransformation().toMapPoint(x,y));
   m_pPoint=pActiveView.getScreenDisplay().getDisplayTransformation().toMapPoint(x,y);
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public void EndSketch()
{
  IGeometry pGeom;
  IPointCollection pPointCollection;
  try
  {
   if(m_pFeedback instanceof NewMultiPointFeedback)
   {
    INewMultiPointFeedback pMPFeed=new INewMultiPointFeedbackProxy(m_pFeedback);
    pMPFeed.stop();
    pGeom=new IGeometryProxy(m_pPointCollection);
   }
   else if(m_pFeedback instanceof NewLineFeedback)
   {
    INewLineFeedback pLineFeed;
    pLineFeed=new INewLineFeedbackProxy(m_pFeedback);
    IPolyline pPolyLine;
    pLineFeed.addPoint(m_pPoint);
    pPolyLine=pLineFeed.stop();
    pPointCollection=new IPointCollectionProxy(pPolyLine);
    if(pPointCollection.getPointCount()<2)
    {
     JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
     return;
    }
    else
    {
     pGeom=new IGeometryProxy(pPointCollection);
    }
   }
   else if(m_pFeedback instanceof NewPolygonFeedback)
   {
    INewPolygonFeedback pPolygonFeed;
    pPolygonFeed=new INewPolygonFeedbackProxy(m_pFeedback);
    IPolygon pPolygon;
    pPolygonFeed.addPoint(m_pPoint);
    pPolygon=new IPolygonProxy(pPolygonFeed.stop());
    pPointCollection=new IPointCollectionProxy(pPolygon);
    if(pPointCollection.getPointCount()<3)
    {
     JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
     return;
    }
    else
    {
     pGeom=new IGeometryProxy(pPointCollection);
    }
   }
   else
   {
    pGeom=new IGeometryProxy();
    pGeom=null;
   }
   if(pGeom!=null)
   {
    CreateFeature(pGeom);
   }
   m_pFeedback=null;
   m_bInUse=false;
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public void SelectMouseDown(IGeometry selectGeo)
{
  IFeatureLayer pFeatureLayer;
  IFeatureClass pFeatureClass;
  ISpatialFilter pSpatialFilter;
  IQueryFilter pQueryFilter;
  IActiveView pActiveView;  
  try
  {
   if(m_pCurrentLayer==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return;
   }
   /*
    * if(!(m_pCurrentLayer instanceof IGeoFeatureLayer) ){
    * JOptionPane.showMessageDialog(null,"该图层不是地理图,不能选择!","错误提示",JOptionPane.ERROR_MESSAGE);
    * return ; }
    */
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   pFeatureClass=pFeatureLayer.getFeatureClass();
   // pFeatureClass = new
   // IFeatureClassProxy(pFeatureLayer.getFeatureClass());
   if(pFeatureClass==null)
   {
    JOptionPane.showMessageDialog(null,"没有发现地理类!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pActiveView=new IActiveViewProxy(m_pMap);
//   pPoint=pActiveView.getScreenDisplay().getDisplayTransformation().toMapPoint(x,y);
//   pGeometry=new IGeometryProxy(pPoint);
   double dic_length;
   dic_length=ConvertPixelsToMapUnits(new IActiveViewProxy(m_pMap),4);
   if(selectGeo.getEnvelope().getWidth()<dic_length){
    ITopologicalOperator pTopo;
    pTopo=new ITopologicalOperatorProxy(selectGeo);
    IGeometry pBuffer=pTopo.buffer(dic_length);
    selectGeo=pBuffer.getEnvelope();
   }
   pSpatialFilter=new SpatialFilter();
   pSpatialFilter.setGeometryByRef(selectGeo);
   if(pFeatureClass.getShapeType()==esriGeometryType.esriGeometryPoint)
   {
    pSpatialFilter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelContains);
   }
   else if(pFeatureClass.getShapeType()==esriGeometryType.esriGeometryPolyline)
   {
    pSpatialFilter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelCrosses);
   }
   else if(pFeatureClass.getShapeType()==esriGeometryType.esriGeometryPolygon)
   {
    pSpatialFilter.setSpatialRel(esriSpatialRelEnum.esriSpatialRelIntersects);
   }
   pSpatialFilter.setGeometryField(pFeatureClass.getShapeFieldName());
   pQueryFilter=new IQueryFilterProxy(pSpatialFilter);
   IFeatureCursor pCursor;
   pCursor=pFeatureLayer.search(pQueryFilter,false);
   IFeature pFeature;
   pFeature=pCursor.nextFeature();
   while(pFeature!=null)
   {
    m_pMap.selectFeature(m_pCurrentLayer,pFeature);
    pFeature=pCursor.nextFeature();
   }
   pActiveView.partialRefresh(esriViewDrawPhase.esriViewGraphicSelection,null,null);
   pActiveView.refresh();
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public boolean EditFeature(int x,int y)
{
  IMovePointFeedback pPointMove;
  ILineMovePointFeedback pLineMove;
  IPolygonMovePointFeedback pPolyMove;
  IGeometryCollection pGeomColn;
  IPointCollection pPointColn;
  IObjectClass pObjectClass;
  IActiveView pActiveView;
  IFeature pFeature;
  IGeometry pGeom;
  IPath pPath;
  IPoint pHitPoint=null;
  IPoint pPoint;
  double hitDist[]={0.0};
  double tol=0;
  int vertexIndex[]={0};
  int vertexOffset=0;
  int numVertices;
  int partIndex[]={0};
  boolean isvertex=false;
  vertexHit=false;
  try
  {
   pActiveView=new IActiveViewProxy(m_pMap);
   pPoint=pActiveView.getScreenDisplay().getDisplayTransformation().toMapPoint(x,y);
   pGeom=new IGeometryProxy(pPoint);
   if(pGeom.getGeometryType()==esriGeometryType.esriGeometryPoint){
    double dic_length;
    dic_length=ConvertPixelsToMapUnits(new IActiveViewProxy(m_pMap),4);
    ITopologicalOperator pTopo;
    pTopo=new ITopologicalOperatorProxy(pGeom);
    IGeometry pBuffer=pTopo.buffer(dic_length);
    pGeom=pBuffer.getEnvelope();
   }
   m_pMap.clearSelection();
   SelectMouseDown(pGeom);
   IEnumFeature pSelected;
   pSelected=new IEnumFeatureProxy(m_pMap.getFeatureSelection());
   pFeature=pSelected.next();
   if(pFeature==null)
   {
    // JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    System.out.println("errer");
    return false;
   }
   tol=ConvertPixelsToMapUnits(new IActiveViewProxy(m_pMap),4);
   pGeom=pFeature.getShape();
   
   pObjectClass=pFeature.esri_getClass();// new
             // IObjectClassProxy(pFeature.esri_getClass());
   m_pEditFeature=pFeature;
   if(pGeom.getGeometryType()==esriGeometryType.esriGeometryPoint)
   {
    m_pFeedback=new MovePointFeedback();
    m_pFeedback.setDisplayByRef(pActiveView.getScreenDisplay());
    pPointMove=new IMovePointFeedbackProxy(m_pFeedback);
    pPointMove.start(new IPointProxy(pGeom),pPoint);
   }
   else if(pGeom.getGeometryType()==esriGeometryType.esriGeometryPolyline)
   {
    if(TestGeometryHit(tol,pPoint,pFeature,pHitPoint,hitDist,partIndex,vertexOffset,vertexIndex,isvertex))
    {
     if(!vertexHit)
     {
      pGeomColn=new IGeometryCollectionProxy(pGeom);
      pPath=new IPathProxy(pGeomColn.getGeometry(partIndex[0]));
      pPointColn=new IPointCollectionProxy(pPath);
      numVertices=pPointColn.getPointCount();
      Integer pid=new Integer(1);
      if(vertexIndex[0]==0)
      {
       pPointColn.addPoint(pPoint,pid,null);// addPoints(1,pPoint);
      }
      else
      {
       pid=new Integer(vertexIndex[0]);
       pPointColn.addPoint(pPoint,null,pid);
      }
      TestGeometryHit(tol,pPoint,pFeature,pHitPoint,hitDist,partIndex,vertexOffset,vertexIndex,isvertex);
     }
     m_pFeedback=new LineMovePointFeedback();
     m_pFeedback.setDisplayByRef(pActiveView.getScreenDisplay());
     pLineMove=new ILineMovePointFeedbackProxy(m_pFeedback);
     pLineMove.start(new IPolylineProxy(pGeom),vertexIndex[0],pPoint);
    }
    else
    {
     return false;
    }
   }
   else if(pGeom.getGeometryType()==esriGeometryType.esriGeometryPolygon)
   {
    if(TestGeometryHit(tol,pPoint,pFeature,pHitPoint,hitDist,partIndex,vertexOffset,vertexIndex,isvertex))
    {
     if(!vertexHit)
     {
      pGeomColn=new IGeometryCollectionProxy(pGeom);
      pPath=new IPathProxy(pGeomColn.getGeometry(partIndex[0]));
      pPointColn=new IPointCollectionProxy(pPath);
      numVertices=pPointColn.getPointCount();
      Integer pid=new Integer(1);
      if(vertexIndex[0]==0)
      {
       pPointColn.addPoint(pPoint,pid,null);// addPoints(1,pPoint);
      }
      else
      {
       pid=new Integer(vertexIndex[0]);
       pPointColn.addPoint(pPoint,null,pid);
      }
      TestGeometryHit(tol,pPoint,pFeature,pHitPoint,hitDist,partIndex,vertexOffset,vertexIndex,isvertex);
     }
     m_pFeedback=new PolygonMovePointFeedback();
     m_pFeedback.setDisplayByRef(pActiveView.getScreenDisplay());
     pPolyMove=new IPolygonMovePointFeedbackProxy(m_pFeedback);
     pPolyMove.start(new IPolygonProxy(pGeom),vertexIndex[0]+vertexOffset,pPoint);
    }
    else
    {
     return false;
    }
   }
   
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
  return true;
}
public void FtrEditMouseMove(int x,int y)
{
  IActiveView pActiveView;
  IPoint pPoint;
  if(m_pFeedback==null)
  {
   // JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
   return;
  }
  try
  {
   pActiveView=new IActiveViewProxy(m_pMap);
   pPoint=pActiveView.getScreenDisplay().getDisplayTransformation().toMapPoint(x,y);
   m_pFeedback.moveTo(pPoint);
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}

 

 

 

public void EndFtrEdit(int x,int y)
{
  IMovePointFeedback pPointMove;
  ILineMovePointFeedback pLineMove;
  IPolygonMovePointFeedback pPolyMove;
  IActiveView pActiveView;
  IGeometry pGeometry;
  IPoint pPoint;
  if(m_pFeedback==null)
  {
   // JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
   return;
  }
  try
  {
   pActiveView=new IActiveViewProxy(m_pMap);
   pPoint=pActiveView.getScreenDisplay().getDisplayTransformation().toMapPoint(x,y);
   if(m_pFeedback instanceof MovePointFeedback)
   {
    pPointMove=new IMovePointFeedbackProxy(m_pFeedback);
    pGeometry=new IGeometryProxy(pPointMove.stop());
    UpdateFeature(m_pEditFeature,pGeometry);
   }
   else if(m_pFeedback instanceof LineMovePointFeedback)
   {
    pLineMove=new ILineMovePointFeedbackProxy(m_pFeedback);
    pGeometry=new IGeometryProxy(pLineMove.stop());
    UpdateFeature(m_pEditFeature,pGeometry);
   }
   else if(m_pFeedback instanceof PolygonMovePointFeedback)
   {
    pPolyMove=new IPolygonMovePointFeedbackProxy(m_pFeedback);
    pGeometry=new IGeometryProxy(pPolyMove.stop());
    UpdateFeature(m_pEditFeature,pGeometry);
   }
   m_pFeedback=null;
   pActiveView.refresh();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public void DeleteSelectedFeatures()
{
  IFeatureCursor pFeatureCursor;
  IWorkspaceEdit pWorkspaceEdit;
  IFeature pFeature;
  IActiveView pActiveView;
  if(m_pCurrentLayer==null)
  {
   JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
   return;
  }
  pFeatureCursor=GetSelectedFeatures();
  if(pFeatureCursor==null)
  {
   JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
   return;
  }
  try
  {
   m_pMap.clearSelection();
   pWorkspaceEdit=GetWorkspaceEdit();
   pWorkspaceEdit.startEditOperation();
   pFeature=pFeatureCursor.nextFeature();
   while(pFeature!=null)
   {
    pFeature.delete();
    pFeature=pFeatureCursor.nextFeature();
   }
   pWorkspaceEdit.stopEditOperation();
   pActiveView=new IActiveViewProxy(m_pMap);
   pActiveView.refresh();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public void UndoEdit()
{
  IFeatureLayer pFeatureLayer;
  IWorkspaceEdit pWorkspaceEdit;
  IDataset pDataset;
  IActiveView pActiveView;
  boolean bHasUndos[]={false};
  if(m_pCurrentLayer==null)
  {
   JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
   return;
  }
  try
  {
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   pDataset=new IDatasetProxy(pFeatureLayer.getFeatureClass());
   if(pDataset==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pWorkspaceEdit=new IWorkspaceEditProxy(pDataset.getWorkspace());
   pWorkspaceEdit.hasUndos(bHasUndos);
   if(bHasUndos[0])
   {
    pWorkspaceEdit.undoEditOperation();
   }
   pActiveView=new IActiveViewProxy(m_pMap);
   pActiveView.refresh();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public void RedoEdit()
{
  IFeatureLayer pFeatureLayer;
  IWorkspaceEdit pWorkspaceEdit;
  IDataset pDataset;
  IActiveView pActiveView;
  boolean bHasRedos[]={false};
  if(m_pCurrentLayer==null)
  {
   JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
   return;
  }
  try
  {
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   pDataset=new IDatasetProxy(pFeatureLayer.getFeatureClass());
   if(pDataset==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pWorkspaceEdit=new IWorkspaceEditProxy(pDataset.getWorkspace());
   pWorkspaceEdit.hasRedos(bHasRedos);
   if(bHasRedos[0])
   {
    pWorkspaceEdit.redoEditOperation();
   }
   pActiveView=new IActiveViewProxy(m_pMap);
   pActiveView.refresh();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
private void CreateFeature(IGeometry pGeom)
{
  IFeatureLayer pFeatureLayer;
  IWorkspaceEdit pWorkspaceEdit;
  IFeatureClass pFeatureClass;
  IActiveView pActiveView;
  IFeature pFeature;
  try
  {
   if(pGeom==null)
   {
    JOptionPane.showMessageDialog(null,"错误的地理元素,不能建立!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pWorkspaceEdit=GetWorkspaceEdit();
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   
   pFeatureClass=pFeatureLayer.getFeatureClass();
   if(pWorkspaceEdit==null)
   {
    JOptionPane.showMessageDialog(null,"编辑工作空间不存在!","错误提示",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pWorkspaceEdit.startEditOperation();
   pFeature=pFeatureClass.createFeature();
   pFeature.setShapeByRef(pGeom);
   pFeature.store();
   pWorkspaceEdit.stopEditOperation();
   pActiveView=new IActiveViewProxy(m_pMap);
   if(pGeom.getGeometryType()==esriGeometryType.esriGeometryPoint)
   {
    double dlength;
    dlength=ConvertPixelsToMapUnits(pActiveView,30);
    ITopologicalOperator pTopo;
    pTopo=new ITopologicalOperatorProxy(pGeom);
    IGeometry pBuffer;
    pBuffer=pTopo.buffer(dlength);
   
    pActiveView.partialRefresh(esriDrawPhase.esriDPGeography,m_pCurrentLayer,pBuffer.getEnvelope());
   }
   else
   {
    pActiveView.partialRefresh(esriDrawPhase.esriDPGeography,m_pCurrentLayer,pGeom.getEnvelope());
   }
   
   
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
public double ConvertPixelsToMapUnits(IActiveView pActiveView,double pixelUnits)
{
  double realWorldDisplayExtent;
  int pixelExtent;
  double sizeOfOnePixel;
  try
  {
   pixelExtent=pActiveView.getScreenDisplay().getDisplayTransformation().getDeviceFrame().right
     -pActiveView.getScreenDisplay().getDisplayTransformation().getDeviceFrame().left;
   realWorldDisplayExtent=pActiveView.getScreenDisplay().getDisplayTransformation().getVisibleBounds().getWidth();
   sizeOfOnePixel=realWorldDisplayExtent/pixelExtent;
   return pixelUnits*sizeOfOnePixel;
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
  return 0;
}
private boolean TestGeometryHit(double tolerance,IPoint pPoint,IFeature pFeature,IPoint pHitPoint,double[] hitDist,int[] partIndex,int vertexOffset,int[] vertexIndex,
   boolean vertexHit1)
{
  IGeometry pGeom;
  IHitTest pHitTest;
  try
  {
   pGeom=pFeature.getShape();
   pHitTest=new IHitTestProxy(pGeom);
   pHitPoint=new Point();
   boolean istrue[]={true};
   if(pHitTest.hitTest(pPoint,tolerance,esriGeometryHitPartType.esriGeometryPartVertex,pHitPoint,hitDist,partIndex,vertexIndex,istrue))
   {
    vertexHit=true;
    return true;
   }
   else
   {
    if(pHitTest.hitTest(pPoint,tolerance,esriGeometryHitPartType.esriGeometryPartBoundary,pHitPoint,hitDist,partIndex,vertexIndex,istrue))
    {
     vertexHit=false;
     return true;
    }
   }
   if(partIndex[0]>0)
   {
    IGeometryCollection pGeomColn;
    pGeomColn=new IGeometryCollectionProxy(pGeom);
    vertexOffset=0;
    for(int i=0;i<partIndex[0];i++)
    {
     IPointCollection pPointColn;
     pPointColn=new IPointCollectionProxy(pGeomColn.getGeometry(i));
     vertexOffset=vertexOffset+pPointColn.getPointCount();
    }
   }
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
  return false;
}
private void UpdateFeature(IFeature pFeature,IGeometry pGeometry)
{
  IWorkspaceEdit pWorkspaceEdit;
  IDataset pDataset;
  try
  {
   pDataset=new IDatasetProxy(pFeature.esri_getClass());
   pWorkspaceEdit=new IWorkspaceEditProxy(pDataset.getWorkspace());
   if(!pWorkspaceEdit.isBeingEdited())
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return;
   }
   pWorkspaceEdit.startEditOperation();
   pFeature.setShapeByRef(pGeometry);
   pFeature.store();
   pWorkspaceEdit.stopEditOperation();
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
}
private IFeatureCursor GetSelectedFeatures()
{
  IFeatureSelection pFeatSel;
  ISelectionSet pSelectionSet;
  ICursor pCursor[]={null};
  if(m_pCurrentLayer==null)
  {
   JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
   return null;
  }
  try
  {
   pFeatSel=new IFeatureSelectionProxy(m_pCurrentLayer);
   pSelectionSet=pFeatSel.getSelectionSet();
   if(pSelectionSet.getCount()==0)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return null;
   }
   IQueryFilter pQueryFilter=new QueryFilter();
   pQueryFilter.setWhereClause("");
   pSelectionSet.search(null,false,pCursor);
   return new IFeatureCursorProxy(pCursor[0]);
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
  return null;
}
private IWorkspaceEdit GetWorkspaceEdit()
{
  IFeatureLayer pFeatureLayer;
  IFeatureClass pFeatureClass;
  IDataset pDataset;
  if(m_pCurrentLayer==null)
  {
   JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
   return null;
  }
  try
  {
   pFeatureLayer=new IFeatureLayerProxy(m_pCurrentLayer);
   pFeatureClass=pFeatureLayer.getFeatureClass();
   pDataset=new IDatasetProxy(pFeatureClass);
   if(pDataset==null)
   {
    JOptionPane.showMessageDialog(null,"","",JOptionPane.ERROR_MESSAGE);
    return null;
   }
   return new IWorkspaceEditProxy(pDataset.getWorkspace());
  }
  catch(HeadlessException ex)
  {
   ex.printStackTrace();
  }
  catch(IOException ex)
  {
   ex.printStackTrace();
  }
  return null;
}

}

 

posted on 2009-04-24 16:52  翌晨  阅读(1117)  评论(1编辑  收藏  举报