📄 form_main.cs
字号:
}
//************************************ 地图编辑相关方法与函数 ***********************************************
private bool InEdit()
{
// 检查当前地图是否具备编辑条件
if (m_CurrentLayer == null) return false;
IFeatureLayer pFeatureLayer = (IFeatureLayer)m_CurrentLayer;
if (pFeatureLayer.FeatureClass == null) return false;
IDataset pDataset = (IDataset)pFeatureLayer.FeatureClass;
if (pDataset == null) return false;
IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;
if (pWorkspaceEdit.IsBeingEdited()) return true;
return false;
}
private void StartEditing() //开始编辑
{
if (m_CurrentLayer == null) return; //检查选择的当前图层
if ( (IGeoFeatureLayer)m_CurrentLayer == null) return;
IFeatureLayer m_FeatureLayer = (IFeatureLayer)m_CurrentLayer;
IDataset m_Dataset = (IDataset)m_FeatureLayer.FeatureClass;
if (m_Dataset== null) return;
switch(comboBox_EditTask.SelectedIndex)
{
case 0:
m_bSketch=true;
break;
case 1:
m_bModify=true;
break;
}
IWorkspaceEdit m_WorkspaceEdit = (IWorkspaceEdit)m_Dataset.Workspace; //声明编辑工作空间对象
if (!m_WorkspaceEdit.IsBeingEdited())
{
m_WorkspaceEdit.StartEditing(true); //启动编辑
m_WorkspaceEdit.EnableUndoRedo(); //设置撤消与重做可用
}
}
private int SaveEditing() //保存编辑
{
//先停止编辑保存
if (m_CurrentLayer == null) return 0;
IFeatureLayer m_FeatureLayer = (IFeatureLayer)m_CurrentLayer;
if (m_FeatureLayer.FeatureClass == null) return 0;
IDataset m_Dataset = (IDataset)m_FeatureLayer.FeatureClass;
if ( m_Dataset == null) return 0;
IWorkspaceEdit m_WorkspaceEdit = (IWorkspaceEdit)m_Dataset.Workspace;
if (m_WorkspaceEdit.IsBeingEdited())
{
bool bHasEdits = false;
m_WorkspaceEdit.HasEdits(ref bHasEdits);
bool bSave = false;
if (bHasEdits)
{
DialogResult result;
result = MessageBox.Show(this, "需要保存当前的编辑吗?", "保存",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (DialogResult.Yes == result)
bSave = true;
else if (DialogResult.Cancel == result)
return 0;
}
m_WorkspaceEdit.StopEditing(bSave);
}
//再启动编辑
if (!m_WorkspaceEdit.IsBeingEdited())
{
m_WorkspaceEdit.StartEditing(true); //启动编辑
m_WorkspaceEdit.EnableUndoRedo(); //设置撤消与重做可用
}
return 1;
}
private int StopEditing() //停止编辑操作
{
//
if (m_CurrentLayer == null) return 0;
IFeatureLayer m_FeatureLayer = (IFeatureLayer)m_CurrentLayer;
if (m_FeatureLayer.FeatureClass == null) return 0;
IDataset m_Dataset = (IDataset)m_FeatureLayer.FeatureClass;
if ( m_Dataset == null) return 0;
//
IWorkspaceEdit m_WorkspaceEdit = (IWorkspaceEdit)m_Dataset.Workspace;
if (m_WorkspaceEdit.IsBeingEdited())
{
bool bHasEdits = false;
m_WorkspaceEdit.HasEdits(ref bHasEdits);
bool bSave = false;
if (bHasEdits)
{
DialogResult result;
result = MessageBox.Show(this, "需要保存编辑吗?", "停止编辑", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (DialogResult.Yes == result)
bSave = true;
else if (DialogResult.Cancel == result)
return 0;
}
m_WorkspaceEdit.StopEditing(bSave);
}
m_bSketch=false;
m_bModify=false;
IActiveView m_ActiveView = (IActiveView)m_Map;
m_ActiveView.Refresh();
return 1;
}
private void CopySelectedFeatures() //复制要素
{
if (m_CurrentLayer == null) return;
//检查当前是否在编辑状态
if(m_bModify == true)
{
// 检查是否有要素被选中,没有则MessageBox提醒
IFeatureSelection pFeatSel = (IFeatureSelection)m_CurrentLayer;
ISelectionSet pSelectionSet = pFeatSel.SelectionSet;
if (pSelectionSet.Count == 0)
{
MessageBox.Show("在 '" + m_CurrentLayer.Name + "' 图层没有要素被选中!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
IEnumFeature pSelected = (IEnumFeature)m_Map.FeatureSelection; //获取选中要素
IFeature pFeature = pSelected.Next();
m_GeoCollecton= new GeometryBagClass();
IGeometry pGeom;
while (pFeature != null)
{
pGeom = pFeature.Shape;
object Missing = Type.Missing;
m_GeoCollecton.AddGeometry(pGeom,ref Missing,ref Missing); //GeoCollecton.AddGeometry方法
pFeature = pSelected.Next();
}
m_bCopy=true;
}
else
{
MessageBox.Show("当前不在修改状态!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
}
private void PasteSelectedFeatures() //粘贴要素
{
if (m_CurrentLayer == null) return;
IFeatureLayer m_FeatureLayer = (IFeatureLayer)m_CurrentLayer;
//检查当前是否在编辑状态
if(m_bModify == true)
{
if (m_bCopy == false)// 检查是否有要素被复制了
{
MessageBox.Show("在 '" + m_CurrentLayer.Name + "' 图层没有要素被复制!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
for(int i = 0;i<=m_GeoCollecton.GeometryCount - 1;i++)
{
if(m_GeoCollecton.get_Geometry(i).GeometryType == m_FeatureLayer.FeatureClass.ShapeType)
{
CreateFeature(m_GeoCollecton.get_Geometry(i)); //CreateFeature方法调用
}
}
}
else
{
MessageBox.Show("当前不在修改状态!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
}
private void CreateFeature(IGeometry m_Geometry) //粘贴要素<---创建要素方法
{
if (m_Geometry == null) return;
if (m_CurrentLayer == null) return;
IWorkspaceEdit m_WorkspaceEdit = GetWorkspaceEdit(); //获取编辑空间
IFeatureLayer m_FeatureLayer = (IFeatureLayer)m_CurrentLayer;
IFeatureClass m_FeatureClass = m_FeatureLayer.FeatureClass;
m_WorkspaceEdit.StartEditOperation(); //使用WorkspaceEdit接口新建要素
IFeature m_Feature = m_FeatureClass.CreateFeature();
m_Feature.Shape = m_Geometry;
m_Feature.Store();
m_WorkspaceEdit.StopEditOperation();
// 以一定缓冲范围刷新视图
IActiveView m_ActiveView = (IActiveView)m_Map;
if (m_Geometry.GeometryType == esriGeometryType.esriGeometryPoint)
{
double Length;
Length = ConvertPixelsToMapUnits(m_ActiveView, 30); //屏幕像素转换成地图单位
ITopologicalOperator m_Topo = (ITopologicalOperator)m_Geometry;
IGeometry m_Buffer = m_Topo.Buffer(Length);
m_ActiveView.PartialRefresh((esriViewDrawPhase)(esriDrawPhase.esriDPGeography |
esriDrawPhase.esriDPSelection), m_CurrentLayer, m_Buffer.Envelope);
}
else
m_ActiveView.PartialRefresh((esriViewDrawPhase)(esriDrawPhase.esriDPGeography |
esriDrawPhase.esriDPSelection), m_CurrentLayer, m_Geometry.Envelope);
}
private IWorkspaceEdit GetWorkspaceEdit() //获取当前编辑空间
{
if (m_CurrentLayer == null) return null;
IFeatureLayer m_FeatureLayer = (IFeatureLayer)m_CurrentLayer;
IFeatureClass m_FeatureClass = m_FeatureLayer.FeatureClass;
IDataset m_Dataset = (IDataset)m_FeatureClass;
if ( m_Dataset == null) return null;
return (IWorkspaceEdit)m_Dataset.Workspace;
}
private void DeleteSelectedFeatures() //删除要素
{
if (m_CurrentLayer == null) return;
// 先检查当前是否有要素被选中
IFeatureCursor pFeatureCursor = GetSelectedFeatures(); //获取被选中要素
if (pFeatureCursor == null) return;
m_Map.ClearSelection();
// 要素删除方法
IWorkspaceEdit pWorkspaceEdit = GetWorkspaceEdit();
pWorkspaceEdit.StartEditOperation();
IFeature pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
pFeature.Delete();
pFeature = pFeatureCursor.NextFeature();
}
pWorkspaceEdit.StopEditOperation();
IActiveView pActiveView = (IActiveView)m_Map;
pActiveView.Refresh();
}
private IFeatureCursor GetSelectedFeatures() //删除要素<------获取被选中的要素
{
if (m_CurrentLayer == null) return null;
// 检查是否有要素被选中,没有则MessageBox提醒
IFeatureSelection pFeatSel = (IFeatureSelection)m_CurrentLayer;
ISelectionSet pSelectionSet = pFeatSel.SelectionSet;
if (pSelectionSet.Count == 0)
{
MessageBox.Show("在 '" + m_CurrentLayer.Name + "' 图层没有要素被选中!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return null;
}
// 有则返回要素游标
ICursor pCursor;
pSelectionSet.Search(null, false, out pCursor);
return (IFeatureCursor)pCursor;
}
private double ConvertPixelsToMapUnits(IActiveView pActiveView , double pixelUnits)
{
// 依据当前视图,将屏幕像素转换成地图单位
IPoint Point1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;
IPoint Point2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;
int x1, x2, y1, y2;
pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(Point1, out x1, out y1);
pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(Point2, out x2, out y2);
double pixelExtent = x2 - x1;
double realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;
double sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;
return pixelUnits * sizeOfOnePixel;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -