VS2010、ArcGIS Engine10、DevExpress721(第三方控件,比较常用易于下载)
------------------------------------------------------------------
我跟大家分享了存在#百度网盘#上的文件,“DXperienceEval-7.2.1.exe”,点击链接进行查看和下载。 http://t.cn/zWsdZRY (分享自 @百度网盘官方微博)系统的连接参数都写在代码里面了,如果有问题,跟踪一下代码即可解决
相关功能:
1:打开ArcSDE版本数据
2:切换版本
3:创建新版本
4:查看版本信息
5:协调版本
6:冲突解决
7:提交版本
8:历史归档管理
因为这是很早的东西了,是自己兴趣开发的,会有相关bug,如果有一定基础肯定可以顺利的进行参考!希望能给大家带来帮助!
仅供参考!
下图为系统界面
下图为创建子版本
下图为协调版本
下图为冲突对话框
核心代码冲突对话框
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Display;
using LSCommonHelper;
using LSGISHelper;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using DevExpress.XtraGrid.Views.Grid;
namespace LSVersion.Version
{
public partial class ConflictsForm : Form
{
public ConflictsForm()
{
InitializeComponent();
}
private IVersion m_peditVersion=null;
public IVersion EditVersion
{
get { return m_peditVersion; }
set { m_peditVersion = value; }
}
private IVersion m_ptargetVersion = null;
public IVersion TargetVersion
{
get { return m_ptargetVersion; }
set { m_ptargetVersion = value; }
}
private void ConflictsForm_Load(object sender, EventArgs e)
{
Init();
}
private IFeatureWorkspace featureWorkspace = null;
private IFeatureWorkspace commonAncestorFWorkspace = null;
private IFeatureWorkspace preReconcileFWorkspace = null;
private IFeatureWorkspace reconcileFWorkspace = null;
private AxMapControl m_pMapControl = null;
public AxMapControl MapControl
{
get { return m_pMapControl; }
set { m_pMapControl = value; }
}
IFeature featurePreReconcile = null;
IFeature featureReconcile = null;
IFeature featureCommonAncestor = null;
private void ClickID(string sLayerName, int sOID, TreeNode sSelNode)
{
IFeatureClass featureClassPreReconcile =
preReconcileFWorkspace.OpenFeatureClass(sLayerName);
IFeatureClass featureClassReconcile =
reconcileFWorkspace.OpenFeatureClass(sLayerName);
IFeatureClass featureClassCommonAncestor =
commonAncestorFWorkspace.OpenFeatureClass(sLayerName);
this.axMapControl1.ClearLayers();
this.axMapControl2.ClearLayers();
this.axMapControl3.ClearLayers();
this.listView1.Items.Clear();
int flag = -1;
if (sSelNode.Parent.Text == "更新-更新冲突")
{
flag = 0;
}
else if (sSelNode.Parent.Text == "删除-更新冲突")
{
flag = 1;
}
else if (sSelNode.Parent.Text == "更新-删除冲突")
{
flag = 2;
}
IFeatureLayer PreReconcileFL = new FeatureLayerClass();
PreReconcileFL.FeatureClass = featureClassPreReconcile;
IFeatureLayer ReconcileFL = new FeatureLayerClass();
ReconcileFL.FeatureClass = featureClassReconcile;
IFeatureLayer CommonAncestorFL = new FeatureLayerClass();
CommonAncestorFL.FeatureClass = featureClassCommonAncestor;
this.axMapControl1.Map.AddLayer(ReconcileFL as ILayer);
this.axMapControl2.Map.AddLayer(PreReconcileFL as ILayer);
this.axMapControl3.Map.AddLayer(CommonAncestorFL as ILayer);
try
{
featurePreReconcile =
featureClassPreReconcile.GetFeature(sOID);
}
catch { this.axMapControl2.ClearLayers(); }
try
{
featureReconcile = featureClassReconcile.GetFeature(sOID);
}
catch { this.axMapControl1.ClearLayers(); }
try
{
featureCommonAncestor =
featureClassCommonAncestor.GetFeature(sOID);
}
catch { this.axMapControl3.ClearLayers(); }
IField pField = null;
if (flag == 0)
{
for (int i = 0; i < featureReconcile.Fields.FieldCount; i++)
{
pField = featureReconcile.Fields.get_Field(i);
ListViewItem lv = new ListViewItem();
lv.SubItems.Add(pField.AliasName);
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureReconcile, pField.AliasName));
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featurePreReconcile, pField.AliasName));
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureReconcile, pField.AliasName));
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureCommonAncestor, pField.AliasName));
this.listView1.Items.Add(lv);
}
}
else if (flag == 1)
{
for (int i = 0; i < featureReconcile.Fields.FieldCount; i++)
{
pField = featureReconcile.Fields.get_Field(i);
ListViewItem lv = new ListViewItem();
lv.SubItems.Add(pField.AliasName);
if (i == 0)
{
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureReconcile, pField.AliasName));
lv.SubItems.Add("Deleted");
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureReconcile, pField.AliasName));
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureCommonAncestor, pField.AliasName));
}
else
{
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureReconcile, pField.AliasName));
lv.SubItems.Add("");
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureReconcile, pField.AliasName));
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureCommonAncestor, pField.AliasName));
}
this.listView1.Items.Add(lv);
}
}
else if (flag == 2)
{
for (int i = 0; i < featurePreReconcile.Fields.FieldCount; i++)
{
pField = featurePreReconcile.Fields.get_Field(i);
ListViewItem lv = new ListViewItem();
lv.SubItems.Add(pField.AliasName);
if (i == 0)
{
lv.SubItems.Add("Deleted");
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featurePreReconcile, pField.AliasName));
lv.SubItems.Add("Deleted");
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureCommonAncestor, pField.AliasName));
}
else
{
lv.SubItems.Add("");
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featurePreReconcile, pField.AliasName));
lv.SubItems.Add("");
lv.SubItems.Add(LSGISHelper.FeatureHelper.GetFeatureStringValue(featureCommonAncestor, pField.AliasName));
}
this.listView1.Items.Add(lv);
}
}
Flash(this.axMapControl1, featureReconcile);
Flash(this.axMapControl2, featurePreReconcile);
Flash(this.axMapControl3, featureCommonAncestor);
#region//Display
pageCon = this.m_pMapControl.ActiveView.GraphicsContainer;
pageCon.DeleteAllElements();
Display(featureReconcile);
Display(featurePreReconcile);
Display(featureCommonAncestor);
#endregion
}
IGraphicsContainer pageCon = null;
private void Display(IFeature pFea)
{
IFillShapeElement pPEle = new PolygonElementClass();
IFillSymbol pFillSym = new SimpleFillSymbolClass();
RgbColorClass rgbClr = new RgbColorClass();
rgbClr.Transparency = 0;
ILineSymbol pLineSym = new SimpleLineSymbolClass();
pLineSym.Color = LSGISHelper.ColorHelper.CreateRandomColor();
pLineSym.Width = 4;
pFillSym.Color = rgbClr;
pFillSym.Outline = pLineSym;
pPEle.Symbol = pFillSym;
IElement pEle = pPEle as IElement;
pEle.Geometry = pFea.ShapeCopy;
this.m_pMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
pageCon.AddElement(pEle, 0);
}
private void Flash(AxMapControl axMapControl3, IFeature pFea)
{
if (pFea != null)
{
axMapControl3.Extent = pFea.Shape.Envelope;
axMapControl3.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
axMapControl3.FlashShape(pFea.ShapeCopy);
}
}
private void Init()
{
this.myTreeView1.Nodes.Clear();
this.listView1.Items.Clear();
try
{
IWorkspaceEdit workspaceEdit = (IWorkspaceEdit2)m_peditVersion;
IVersionEdit4 versionEdit4 = (IVersionEdit4)workspaceEdit;
featureWorkspace = m_peditVersion as IFeatureWorkspace;
// Get the various versions on which to output information.
commonAncestorFWorkspace = (IFeatureWorkspace)
versionEdit4.CommonAncestorVersion;
preReconcileFWorkspace = (IFeatureWorkspace)
versionEdit4.PreReconcileVersion;
reconcileFWorkspace = (IFeatureWorkspace)
versionEdit4.ReconcileVersion;
IEnumConflictClass enumConflictClass = versionEdit4.ConflictClasses;
TreeNode pRootNode = new TreeNode();
pRootNode.Text = "Conflicts";
this.myTreeView1.Nodes.Add(pRootNode);
IConflictClass conflictClass = null;
while ((conflictClass = enumConflictClass.Next()) != null)
{
IDataset dataset = (IDataset)conflictClass;
// Make sure class is a feature class.
if (dataset.Type == esriDatasetType.esriDTFeatureClass)
{
String datasetName = dataset.Name;
TreeNode pRoot2Node = new TreeNode();
pRoot2Node.Text = datasetName;
this.myTreeView1.Nodes[0].Nodes.Add(pRoot2Node);
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass
(datasetName);
// Console.WriteLine("Conflicts on feature class {0}", datasetName);
// Get conflict feature classes on the three reconcile versions.
// Get all UpdateUpdate conflicts.
ISelectionSet updateUpdates = conflictClass.UpdateUpdates;
if (updateUpdates.Count > 0)
{
TreeNode pUUNode = new TreeNode();
pUUNode.Text = "更新-更新冲突";
pRoot2Node.Nodes.Add(pUUNode);
#region 更新更新
// Iterate through each OID, outputting information.
IEnumIDs enumIDs = updateUpdates.IDs;
int oid = enumIDs.Next();
while (oid != -1)
//loop through all conflicting features
{
// Console.WriteLine("UpdateUpdate conflicts on feature {0}", oid);
// Get conflict feature on the three reconcile versions.
TreeNode pOidNode = new TreeNode();
pOidNode.Text ="OID:"+ oid.ToString();
pUUNode.Nodes.Add(pOidNode);
#region---处理
// Check to make sure each shape is different than the common ancestor (conflict is on shape field).
#endregion
oid = enumIDs.Next();
}
#endregion
}
ISelectionSet deleteUpdates = conflictClass.DeleteUpdates;
if (deleteUpdates.Count > 0)
{
TreeNode pDUNode = new TreeNode();
pDUNode.Text = "删除-更新冲突";
pRoot2Node.Nodes.Add(pDUNode);
#region 删除更新
// Iterate through each OID, outputting information.
IEnumIDs enumIDs = deleteUpdates.IDs;
int oid = enumIDs.Next();
while (oid != -1)
//loop through all conflicting features
{
// Console.WriteLine("UpdateUpdate conflicts on feature {0}", oid);
// Get conflict feature on the three reconcile versions.
TreeNode pOidNode = new TreeNode();
pOidNode.Text = "OID:" + oid.ToString();
pDUNode.Nodes.Add(pOidNode);
oid = enumIDs.Next();
}
#endregion
}
ISelectionSet Updatedeletes = conflictClass.UpdateDeletes;
if (Updatedeletes.Count > 0)
{
TreeNode pUDNode = new TreeNode();
pUDNode.Text = "更新-删除冲突";
pRoot2Node.Nodes.Add(pUDNode);
#region 更新删除
// Iterate through each OID, outputting information.
IEnumIDs enumIDs = Updatedeletes.IDs;
int oid = enumIDs.Next();
while (oid != -1)
//loop through all conflicting features
{
TreeNode pOidNode = new TreeNode();
pOidNode.Text = "OID:" + oid.ToString();
pUDNode.Nodes.Add(pOidNode);
oid = enumIDs.Next();
}
#endregion
}
}
}
this.myTreeView1.ExpandAll();
}
catch (System.Runtime.InteropServices.COMException comExc)
{
Console.WriteLine("Error Message: {0}, Error Code: {1}", comExc.Message,
comExc.ErrorCode);
}
}
// Method to determine if shape field is in conflict.
private bool IsShapeInConflict(IFeature commonAncestorFeature, IFeature
preReconcileFeature, IFeature reconcileFeature)
{
// 1st check: Common Ancestor with PreReconcile.
// 2nd check: Common Ancestor with Reconcile.
// 3rd check: Reconcile with PreReconcile (case of same change on both versions)
if (IsGeometryEqual(commonAncestorFeature.ShapeCopy,
preReconcileFeature.ShapeCopy) || IsGeometryEqual
(commonAncestorFeature.ShapeCopy, reconcileFeature.ShapeCopy) ||
IsGeometryEqual(reconcileFeature.ShapeCopy, preReconcileFeature.ShapeCopy)
)
{
return false;
}
else
{
return true;
}
}
// Method returning if two shapes are equal to one another.
private bool IsGeometryEqual(IGeometry shape1, IGeometry shape2)
{
if (shape1 == null & shape2 == null)
{
return true;
}
else if (shape1 == null ^ shape2 == null)
{
return false;
}
else
{
IClone clone1 = (IClone)shape1;
IClone clone2 = (IClone)shape2;
return clone1.IsEqual(clone2);
}
}
private void myTreeView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (this.myTreeView1.Nodes.Count > 0)
{
TreeNode sSelNode = this.myTreeView1.SelectedNode;
if (sSelNode != null)
{
string sSel = sSelNode.Text;
if (LSCommonHelper.OtherHelper.GetLeftName(sSel, ":") == "OID")
{
string sLayerName = sSelNode.Parent.Parent.Text;
int sOID = LSCommonHelper.ConvertHelper.ObjectToInt(
LSCommonHelper.OtherHelper.GetRightName(sSel, ":"));
ClickID(sLayerName, sOID, sSelNode);
}
}
}
}
private void ConflictsForm_FormClosing(object sender, FormClosingEventArgs e)
{
pageCon.DeleteAllElements();
}
private void replaceObjectWith(IFeature pfea,
TreeNode pNode )
{
pageCon.DeleteAllElements();
TreeNode sSelNode = this.myTreeView1.SelectedNode;
if (sSelNode != null)
{
string sSel = sSelNode.Text;
if (LSCommonHelper.OtherHelper.GetLeftName(sSel, ":") == "OID")
{
string sLayerName = sSelNode.Parent.Parent.Text;
int sOID = LSCommonHelper.ConvertHelper.ObjectToInt(
LSCommonHelper.OtherHelper.GetRightName(sSel, ":"));
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(sLayerName);
IFeature feature = featureClass.GetFeature(sOID);
feature.Shape = pfea.ShapeCopy;
feature.Store();
m_pMapControl.ActiveView.Refresh();
}
}
}
private TreeNode sSelNode = null;
private void myTreeView1_MouseDown(object sender, MouseEventArgs e)
{
sSelNode = this.myTreeView1.GetNodeAt(e.X, e.Y);
if (sSelNode == null) return;
if (e.Button == MouseButtons.Left)
{//左键
}
else
{
System.Drawing.Point aPt = new System.Drawing.Point(e.X, e.Y);
// TreeNode sSelNode = this.myTreeView1.SelectedNode;
if (sSelNode != null)
{
string sSel = sSelNode.Text;
if (LSCommonHelper.OtherHelper.GetLeftName(sSel, ":") == "OID")
{
this.contextMenuStrip1.Show(this.myTreeView1, aPt);
}
}
}
}
private void replaceObjectWithCommonAncestorVersionToolStripMenuItem_Click(object sender, EventArgs e)
{
replaceObjectWith(featureCommonAncestor, sSelNode);
}
private void replaceObjectWithPreReconcileVersionToolStripMenuItem_Click(object sender, EventArgs e)
{
replaceObjectWith(featurePreReconcile, sSelNode);
}
private void replaceObjectWithConflictsVersionToolStripMenuItem_Click(object sender, EventArgs e)
{
replaceObjectWith(featureReconcile, sSelNode);
}
private void mergeGeometryToolStripMenuItem_Click(object sender, EventArgs e)
{
MergeGeometry(featureCommonAncestor, featurePreReconcile, featureReconcile, sSelNode);
}
private void MergeGeometry(IFeature featureCommonAncestor
, IFeature featurePreReconcile, IFeature featureReconcile,TreeNode pNode)
{
pageCon.DeleteAllElements();
TreeNode sSelNode = this.myTreeView1.SelectedNode;
if (sSelNode != null)
{
string sSel = sSelNode.Text;
if (LSCommonHelper.OtherHelper.GetLeftName(sSel, ":") == "OID")
{
string sLayerName = sSelNode.Parent.Parent.Text;
int sOID = LSCommonHelper.ConvertHelper.ObjectToInt(
LSCommonHelper.OtherHelper.GetRightName(sSel, ":"));
IFeatureClass featureClass = featureWorkspace.OpenFeatureClass(sLayerName);
// Check to make sure each shape is different than the common ancestor (conflict is on shape field).
if (IsShapeInConflict(featureCommonAncestor,
featurePreReconcile, featureReconcile))
{
//Console.WriteLine(
// " Shape attribute has changed on both versions...");
// Geometries are in conflict ... merge geometries.
try
{
IConstructMerge constructMerge = new
GeometryEnvironmentClass();
IGeometry newGeometry =
constructMerge.MergeGeometries
(featureCommonAncestor.ShapeCopy,
featureReconcile.ShapeCopy,
featurePreReconcile.ShapeCopy);
// Setting new geometry as a merge between the two versions.
IFeature feature = featureClass.GetFeature(sOID);
feature.Shape = newGeometry;
feature.Store();
//updateUpdates.RemoveList(1, ref oid);
//conflictsRemoved = true;
}
catch (System.Runtime.InteropServices.COMException comExc)
{
// Check if the error is from overlapping edits.
if (comExc.ErrorCode == (int)
fdoError.FDO_E_WORKSPACE_EXTENSION_DATASET_CREATE_FAILED || comExc.ErrorCode == (int)fdoError.FDO_E_WORKSPACE_EXTENSION_DATASET_DELETE_FAILED)
{
// Edited areas overlap.
LSCommonHelper.MessageBoxHelper.ShowMessageBox(
"Error from overlapping edits on feature {0}"+
" Can't merge overlapping edits to same feature.");
}
else
{
// Unexpected COM exception, throw this to the exception handler.
throw comExc;
}
}
}
}
}
}
}
}
相关代码下载地址,下载完毕后,请使用kuaiya解压即可,WINRAR不行
-------------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
------------------------------------------------------------------------------------------------------