今天要介绍的内容比较高级,就是通过可视化的操作进行空间数据的编辑操作。不过这里面涉及到很多难度比较大的高级功能,例如怎样选中一个图元、怎样移动图元、怎样确认图元的位置以及实现编辑的撤销操作等等。下面按照自己实现的步骤详细介绍如下。
1.定义空间数据编辑类的成员变量,具体代码如下:
[csharp]
private IFeatureWorkspace pFW;
private IMapControl3 m_MapControl; //地图控件
private IMap m_pMap; //地图控件中的地图
private ILayer m_pCurrentLayer; //地图中的当前操作图层
private IFeature m_pEditFeature; //当前编辑的要素
private IPoint m_pPoint; //当前鼠标点击位置
private IDisplayFeedback m_pFeedback; //用于地图显示
private IPointCollection m_pPointCollection; //当前要素的点集
private bool m_bInUse; //是否处于同一个编辑状态
private bool m_bEditingFtr; //是否为编辑要素状态
private bool m_bSketching; //是否为新建要素状态
private bool m_bSelecting; //是否为选择要素状态
private bool m_bMove; //是否为移动要素状态
2.初始相关成员变量和数据
[csharp]
private void FrmSpatialDataEdit_Load(object sender, EventArgs e)
{
// Setup the application
m_MapControl = (IMapControl3)axMapControl1.GetOcx(); //获取地图控件
m_pMap = m_MapControl.Map;
cboTasks.SelectedIndex = 0;
LoadLayers(); //载入图层
SetControlStates(); //设置四个命令按钮状态
}
上面代码首先由地图控件来获取它的一个实例对象,然后得到地图控件中的地图对象,接着就调用函数载入图层并设置相应操作按钮的初始化状态。载入图层的代码实现 如下:
[csharp]
/// <summary>
/// 载入图层,并在地图空间中加入第一个图层
/// </summary>
private void LoadLayers()
{
//1.遍历SDE的每一个独立要素集中的要素类
IWorkspace pW = MapOperation.GetFeatrueWorkspace() as IWorkspace;
IEnumDataset pED = pW.get_Datasets(esriDatasetType.esriDTFeatureDataset);
IFeatureDataset pFD = pED.Next() as IFeatureDataset;
while (pFD != null)
{
IFeatureClass pFC;
IFeatureClassContainer pFCC = pFD as IFeatureClassContainer;
for (int i = 0; i < pFCC.ClassCount; i++)
{
pFC = pFCC.get_Class(i);
cboLayers.Items.Add(pFC.AliasName);
}
pFD = pED.Next() as IFeatureDataset;
}
//2.遍历SDE的每一个独立要素类
pED = pW.get_Datasets(esriDatasetType.esriDTFeatureClass);
IDataset pD = pED.Next();
while (pD != null)
{
IFeatureClass pFC = pD as IFeatureClass;
cboLayers.Items.Add(pFC.AliasName);
pD = pED.Next();
}
cboLayers.SelectedIndex = 0;
AddLayerToMapCtl(cboLayers.SelectedItem.ToString(), true);
}
设置操作按钮的代码如下:
[csharp]
/// <summary>
/// 设置四个命令按键的功能
/// </summary>
private void SetControlStates()
{
bool bEnabled = InEdit();
btnStartEditing.Enabled = !bEnabled;
btnDelete.Enabled = bEnabled;
btnUndo.Enabled = bEnabled;
btnStopEditing.Enabled = bEnabled;
cboTasks.Enabled = bEnabled;
if (bEnabled)
{
lblTask.ForeColor = Color.Black;
}
else
{
lblTask.ForeColor = Color.Gray;
}
}
也有禁止相应按钮功能的函数代码如下:
[csharp]
private void DisableControls()
{
// Disables all but the layer selection combo
btnStartEditing.Enabled = false;
btnDelete.Enabled = false;
btnUndo.Enabled = false;
btnStopEditing.Enabled = false;
lblTask.ForeColor = Color.Gray;
}
3.实现加载图层到图层控件中去,这样就可以在图形控件中进行编辑操作了,具体加载代码如下:
[csharp]
/// <summary>
/// 加入图层到地图空间中
/// </summary>
/// <param name="layerName">图层名称</param>
/// <param name="isVisible">是否显示</param>
private void AddLayerToMapCtl(string layerName, bool isVisible)
{
if (pFW == null)
{
pFW = MapOperation.GetFeatrueWorkspace();
}
IFeatureClass pFC;
try
{
pFC = pFW.OpenFeatureClass(layerName);
}
catch (Exception)
{
return;
}
IFeatureLayer pFL = new FeatureLayerClass();
pFL.FeatureClass = pFC;
pFL.Name = layerName;
pFL.Visible = isVisible;
axMapControl1.Map.AddLayer(pFL);
axMapControl1.ActiveView.Refresh();
}
4.检查工作空间中是否有数据处于编辑状态,是就返回true。
[csharp]
/// <summary>
/// 检查工作空间中是否有数据处于编辑状态
/// </summary>
/// <returns>是否正在编辑</returns>
private bool InEdit()
{
// Check edit condi
补充: 软件开发 , C# ,
查看更多关于基于ArcGIS10.0和Oracle10g的空间数据管理平台十六(C#开发)-空间数据编辑(上)的详细内容...