本人也是一名二次开发的菜鸟级孩子,经过一个月的挑灯夜战终于搞定了一个小系统,过程中遇到很多小问题,特此将详细代码发帖,希望对后面的小菜鸟们有帮助,系统视频演示地址:http://v.youku.com/v_show/id_XNjE4NzM4MzI0.html
首先是新建工程,然后新建第一个Windows窗体Form1.下面是Form1.cs的源代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.GeoDatabaseExtensions;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.ADF;
using ESRI.ArcGIS.Analyst3D;
using ESRI.ArcGIS.DataSourcesGDB;
using MapAndPageLayoutSynchApp;
namespace GoodMap
{
public partial class Form1 : Form
{
#region class private members
private bool flag;
private string strTitle;
private Font strFont;
private Color strColor;
private MapSurround m_MapSurround;
private MapLoad m_MapLoad;
private ESRI.ArcGIS.Controls.IMapControl3 m_mapControl = null;
private ESRI.ArcGIS.Controls.IPageLayoutControl2 m_pageLayoutControl = null;
private ControlsSynchronizer m_controlsSynchronizer = null;
#endregion
public ILayer pMoveLayer;//需要被调整的图层;
public int toIndex;//将要调整到的目标图层的索引;
public ILayer pselectLayer;
//当前点移动反馈对象
IMovePointFeedback m_MovePointFeedback = new MovePointFeedbackClass();
//当前线移动反馈对象
IMoveLineFeedback m_MoveLineFeedback = new MoveLineFeedbackClass();
//当前面移动反馈对象
IMovePolygonFeedback m_MovePolygonFeedback = new MovePolygonFeedbackClass();
private esriTOCControlItem toccItem = esriTOCControlItem.esriTOCControlItemNone;
private IBasicMap pBasicMap = null;
public ILayer p_Layer=null;
System.Object unk = null;
System.Object data = null;
public bool frmAttriQueryisOpen = false; //用于按属性查询
public bool frmLocationisOpen = false; //用于按位置查询
public bool frmQuickFindisOpen = false; //用于快速查找
#region class constructor
public Form1()
{
InitializeComponent();
m_MapSurround=new MapSurround();
m_MapLoad = new MapLoad();
m_mapControl = (IMapControl3)this.axMapControl1.Object;
m_pageLayoutControl = (IPageLayoutControl2)this.axPageLayoutControl1.Object;
//初始化controls synchronization calss
m_controlsSynchronizer = new ControlsSynchronizer(m_mapControl, m_pageLayoutControl);
//把MapControl和PageLayoutControl绑定起来(两个都指向同一个Map),然后设置MapControl为活动的Control
m_controlsSynchronizer.BindControls(true);
//为了在切换MapControl和PageLayoutControl视图同步,要添加Framework Control
// m_controlsSynchronizer.AddFrameworkControl(axToolbarControl1.Object);
m_controlsSynchronizer.AddFrameworkControl(this.axTOCControl1.Object);
}
#endregion
public string StrTitle
{
get
{ return strTitle; }
set
{ strTitle = value; }
}
public Font StrFont
{
get
{ return strFont;}
set
{ strFont = value; }
}
public Color StrColor
{
get
{ return strColor; }
set
{strColor = value; }
}
private void Form1_Load(object sender, EventArgs e)
{
axTOCControl2.SetBuddyControl(axMapControl1);
flag = false;
}
#region 基础操作
//新建地图文档
private void OpenDoc_Click(object sender, EventArgs e)
{
try
{
m_MapLoad.OperateMapDoc(axMapControl1, axMapControl2, "NewDoc");
axPageLayoutControl1.Refresh();
}
catch(Exception)
{
MessageBox.Show("新建地图无效!");
}
}
//打开地图文档
private void opensxdmap_Click(object sender, EventArgs e)
{
try
{
m_MapLoad.OperateMapDoc(axMapControl1, axMapControl2, "OpenDoc");
//loadMapDocument();
// MessageBox.Show("保存地图成功!");
}
catch(Exception)
{
MessageBox.Show("打开地图失败!");
}
}
//保存地图文档
private void SaveSXDDoc_Click(object sender, EventArgs e)
{
try
{
m_MapLoad.OperateMapDoc(axMapControl1, axMapControl2, "SaveDoc");
// MessageBox.Show("保存地图成功!");
}
catch (Exception)
{
MessageBox.Show("保存地图失败!");
}
}
//另存地图文档
private void SaveAs_Click(object sender, EventArgs e)
{
try
{
m_MapLoad.OperateMapDoc(axMapControl1, axMapControl2, "SaveDocAs");
}
catch (Exception)
{
MessageBox.Show("另存地图失败!");
}
}
//添加XYZ数据
private void AddXYZ_Click(object sender, EventArgs e)
{
try
{
添加XYZ数据 add = new 添加XYZ数据();
add.Show();
}
catch(Exception)
{
MessageBox.Show("添加XY数据失败!");
}
}
//添加影像数据
private void inportImage_Click(object sender, EventArgs e)
{
try
{
m_MapLoad.LoadGeoData(axMapControl1, axMapControl2);
}
catch (Exception)
{
MessageBox.Show("添加影像数据失败!");
}
}
//添加数据
private void AddData_Click_1(object sender, EventArgs e)
{
try
{
添加XYZ数据 t = new 添加XYZ数据();
t.ShowDialog();
// t.AddData(this.axMapControl1, m_controlsSynchronizer);
}
catch (Exception)
{
MessageBox.Show("添加数据失败!");
}
}
#endregion
#region 数据编辑
private void 地图编辑_Click(object sender, EventArgs e)
{
}
private void 栅格图层渲染_Click_1(object sender, EventArgs e)
{
try
{
栅格图层渲染 Raster = new 栅格图层渲染(axMapControl1, axTOCControl2);
Raster.ShowDialog();
}
catch (Exception)
{
MessageBox.Show("图层渲染失败!!");
}
}
#endregion
#region 信息查询
//按位置查询
private void buttonItem27_Click_1(object sender, EventArgs e)
{
try
{
frmLocationQuery LocationQuery = new frmLocationQuery(axMapControl1);
LocationQuery.ShowDialog();
frmLocationisOpen = true;
}
catch (Exception)
{
MessageBox.Show("查询失败!");
}
}
//按属性查询
private void buttonItem34_Click_1(object sender, EventArgs e)
{
try
{
frmAttriQuery AttriQuery = new frmAttriQuery(axMapControl1);
AttriQuery.ShowDialog();
frmAttriQueryisOpen = true;
}
catch (Exception)
{
MessageBox.Show("查询失败!");
}
}
#endregion
#region 建筑管理
private void buttonItem14_Click_1(object sender, EventArgs e)
{
try
{
建筑信息管理 buildingManger = new 建筑信息管理();
buildingManger.ShowDialog();
}
catch(Exception)
{
MessageBox.Show("操作失败");
}
}
private void buttonItem16_Click_1(object sender, EventArgs e)
{
try
{
学生信息窗体 student = new 学生信息窗体();
student.ShowDialog();
}
catch (Exception)
{
MessageBox.Show("操作失败");
}
}
private void buttonItem23_Click_1(object sender, EventArgs e)
{
try
{
房产信息 RealEast = new 房产信息();
RealEast.ShowDialog();
}
catch (Exception)
{
MessageBox.Show("操作失败");
}
}
#endregion
#region 地图制图
private void 添加文字按钮_Click_1(object sender, EventArgs e)
{
try
{
//通过构造函数传递窗体对象
Title titleForm = new Title(this);
titleForm.Show();
}
catch (Exception)
{
MessageBox.Show("操作失败");
}
}
private void 添加图例按钮_Click_1(object sender, EventArgs e)
{
try
{
m_MapSurround.AddLegend(axPageLayoutControl1);
}
catch (Exception)
{
MessageBox.Show("操作失败");
}
}
private void 添加比例尺_Click_1(object sender, EventArgs e)
{
try
{
m_MapSurround.AddScaleBar(axPageLayoutControl1);
}
catch (Exception)
{
MessageBox.Show("操作失败");
}
}
private void 添加指北针_Click_1(object sender, EventArgs e)
{
try
{
m_MapSurround.AddNorthArrow(axPageLayoutControl1);
}
catch (Exception)
{
MessageBox.Show("操作失败");
}
}
private void 输出JPG_Click_1(object sender, EventArgs e)
{
try
{
m_MapSurround.Map_Export(axPageLayoutControl1, 1);
}
catch (Exception)
{
MessageBox.Show("操作失败");
}
}
private void 输出PNG_Click_1(object sender, EventArgs e)
{
m_MapSurround.Map_Export(axPageLayoutControl1, 2);
}
private void 输出BMP_Click_1(object sender, EventArgs e)
{
m_MapSurround.Map_Export(axPageLayoutControl1, 3);
}
private void 输出PDF_Click_1(object sender, EventArgs e)
{
m_MapSurround.Map_Export(axPageLayoutControl1, 4);
}
#endregion
#region 统计分析
private void buttonItem20_Click_1(object sender, EventArgs e)
{
占地面积统计 BuildingArea = new 占地面积统计();
BuildingArea.ShowDialog();
}
private void 容纳人数统计_Click_1(object sender, EventArgs e)
{
}
private void buttonItem22_Click_1(object sender, EventArgs e)
{
建筑使用情况统计 BuildingUsing = new 建筑使用情况统计();
BuildingUsing.ShowDialog();
}
#endregion
#region 专题地图
#endregion
#region 地图相关操作
//当主视图中的地图发生变化时,鹰眼视图中的地图也要发生变化
private void axMapControl1_OnMapReplaced(object sender, IMapControlEvents2_OnMapReplacedEvent e)
{
IMap pMap;
pMap = axMapControl1.Map;
for (int i = 0; i < pMap.LayerCount; i++)
{
axMapControl2.AddLayer(pMap.get_Layer(i));
}
//使鹰眼视图中显示加载地图的全图
axMapControl2.Extent = axMapControl2.FullExtent;
}
//在鹰眼视图中移动红色矩形框时,主视图中的地图范围、位置要发生相应变化
private void axMapControl2_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
// 利用鼠标左键移动鹰眼视图中的红色矩形框,主视图中显示的范围要进行局部刷新
//利用鼠标右键在鹰眼视图中改变红色矩形框的大小,主视图中显示的地图数据也要进行刷新
if (e.button == 1) //探测鼠标左键
{
IPoint pPt = new PointClass();
pPt.X = e.mapX;
pPt.Y = e.mapY;
IEnvelope pEnvelop = axMapControl1.Extent as IEnvelope;
pEnvelop.CenterAt(pPt);
axMapControl1.Extent = pEnvelop;
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
else if (e.button == 2) //鼠标右键按下
{
IEnvelope pEnvelop = axMapControl2.TrackRectangle();
axMapControl1.Extent = pEnvelop;
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
}
//当主视图中的显示范围发生变化时,触发控件的OnExtentUpdated事件
private void axMapControl2_OnMouseMove(object sender, IMapControlEvents2_OnMouseMoveEvent e)
{
if (e.button != 1)
return;
IPoint pPt = new PointClass();
pPt.X = e.mapX;
pPt.Y = e.mapY;
axMapControl1.CenterAt(pPt);
axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
private void axMapControl1_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
{
//绘制鹰眼图中红色矩形框
IGraphicsContainer pGraphicsContainer = axMapControl2.Map as IGraphicsContainer;
IActiveView PAv = pGraphicsContainer as IActiveView;
//绘制前清除axMapControl2中的任何图形元素
pGraphicsContainer.DeleteAllElements();
IRectangleElement pRecElement = new RectangleElementClass();
IElement pEle = pRecElement as IElement;
IEnvelope pEnv;
pEnv = e.newEnvelope as IEnvelope;
pEle.Geometry = pEnv;
//设置颜色
IRgbColor pColor = new RgbColorClass();
pColor.Red = 200;
pColor.Green = 0;
pColor.Blue = 0;
//产生一个线符号对象
ILineSymbol pLineSymbol = new SimpleLineSymbolClass();
pLineSymbol.Width = 2;
pLineSymbol.Color = pColor;
//设置填充符号的属性
IFillSymbol pFillSymbol = new SimpleFillSymbolClass();
//设置透明颜色
pColor.Transparency = 0;
pFillSymbol.Color = pColor;
pFillSymbol.Outline = pLineSymbol;
IFillShapeElement pFillShapeElement = pRecElement as IFillShapeElement;
pFillShapeElement.Symbol = pFillSymbol;
pGraphicsContainer.AddElement(pEle, 0);
axMapControl2.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
}
#endregion
//地图上单击--漫游
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 1)
{
// contextMenuStrip2.Show(axMapControl1, e.x, e.y);
IFeatureLayer pFL;
IFeatureSelection pFeatureSelection;
IEnvelope pEnv;
IGeometry pGeometry;
ISpatialFilter pSpatialFilter;
ISelectionSet pSelectionSet;
IEnumIDs pEnumIDs;
IFeature pFeature;
string picpath;
//用于查询的矩形(相当于点的缓冲区,这样比生成缓冲区节省资源),
//envelope的大小根据实际情况设定,以方便使用为准
pEnv = new EnvelopeClass();
pEnv.PutCoords(e.mapX - 200, e.mapY - 200, e.mapX + 200, e.mapY + 200);
pGeometry = pEnv as IGeometry;
pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.Geometry = pGeometry;
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
//运用singleton模式设计窗体,只允许存在一个ShowAttributeTable实例
//ShowAttributeTable frmShowAttribute = ShowAttributeTable.CreateForm();
风景 frmShowAttribute = 风景.CreatForm();
frmShowAttribute.Show();
frmShowAttribute.AttributeTreeView.Nodes.Clear();//首先清除上次结果
frmShowAttribute.AttributeTreeView.ShowLines = true;
frmShowAttribute.AttributeTreeView.ShowPlusMinus = true;
TreeNode rootNode = new TreeNode();
rootNode.Text = "属性信息 ";
// rootNode.ImageIndex
Font font = new Font("黑体", 10);
rootNode.NodeFont = font;
//添加根节点“属性信息”
frmShowAttribute.AttributeTreeView.Nodes.Add(rootNode);
//没有必要将地图上的高亮选择清除,因为下面对每个图层的选择都用esriSelectionResultNew,会自动清除上次的高亮显示,
//而不同图层之间的高亮选择不会有任何影响,因为IFeatureSelection接口的一切属性和方法都是针对一个图层
// this.axMapControl1.Map.ClearSelection();
for (int i = 0; i < this.axMapControl1.LayerCount; i++)
{
pFL = this.axMapControl1.get_Layer(i) as IFeatureLayer;
if (pFL.Visible && pFL.Selectable)
{
pFeatureSelection = pFL as IFeatureSelection;
//选择之前先清除,这是个好习惯(除非是用Add方式)
pFeatureSelection.Clear();
pFeatureSelection.SelectFeatures(pSpatialFilter, esriSelectionResultEnum.esriSelectionResultNew, true);
pSelectionSet = pFeatureSelection.SelectionSet;
//如果选择集内有Feature
if (pSelectionSet.Count > 0)
{
//构建图层节点并添加到根节点
TreeNode layerNameNode = new TreeNode();
layerNameNode.ForeColor = Color.Green;
layerNameNode.Text = "图层名:" + pFL.Name;
rootNode.Nodes.Add(layerNameNode);
//通过pEnumIDs获得该SelectionSet中的Feature的id值,再用FeatureClass.GetFeature()方法获得该Feature对象
//这里为了学习新接口而使用了IEnumIDs,为了获得SelectionSet中的Feature,可以使用其Search()方法
//获得ICursor,再使用循环获得Feature,如下注释选定行
// pSelectionSet.Search(null,false,out pCursor);
// pRow = pCursor.NextRow();
// if(pRow!=null)
// {
// }
pEnumIDs = pSelectionSet.IDs;
long id = pEnumIDs.Next();
while (id != -1)
{
pFeature = pFL.FeatureClass.GetFeature((int)id);
for (int j = 0; j < pFeature.Fields.FieldCount; j++)
{
if (j != 1)
{
//构建字段值节点并添加到图层节点下
TreeNode fieldInfoNode = new TreeNode();
fieldInfoNode.Text = pFeature.Fields.get_Field(j).Name + ": " + pFeature.get_Value(j).ToString();
layerNameNode.Nodes.Add(fieldInfoNode);
if (pFeature.Fields.get_Field(j).Name == "picture")
{
picpath = pFeature.get_Value(j).ToString();
frmShowAttribute.picture(picpath);
}
}
//如果是shape字段就显示GeometryType
else
{
TreeNode fieldInfoNode = new TreeNode();
fieldInfoNode.Text = pFeature.Fields.get_Field(j).Name + ": " + pFeature.Shape.GeometryType.ToString();
layerNameNode.Nodes.Add(fieldInfoNode);
}
frmShowAttribute.AttributeTreeView.ExpandAll();
}
id = pEnumIDs.Next();
}
}
}
}
}
}
//复制到输出页面设置
private void copyToPageLayout()
{
IObjectCopy objectCopy = new ObjectCopyClass();
object copyFromMap = axMapControl1.Map;
object copyMap = objectCopy.Copy(copyFromMap);
object copyToMap = axPageLayoutControl1.ActiveView.FocusMap;
objectCopy.Overwrite(copyMap, ref copyToMap);
}
//MapControl和PageLayoutControl同步显示
private void axMapControl1_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
{
IActiveView activeView = (IActiveView)axPageLayoutControl1.ActiveView.FocusMap;
IDisplayTransformation displayTransformation = activeView.ScreenDisplay.DisplayTransformation;
displayTransformation.VisibleBounds = axMapControl1.Extent;
axPageLayoutControl1.ActiveView.Refresh();
copyToPageLayout();
}
private void axPageLayoutControl1_OnMouseDown(object sender, IPageLayoutControlEvents_OnMouseDownEvent e)
{
m_MapSurround.AddTitle(axPageLayoutControl1, e, strTitle, strColor, strFont);
}
//TOCControl控件的OnMouseDown事件,获得需要被调整的图层
/// 下面函数有问题
private void axTOCControl2_OnMouseDown_1(object sender, ITOCControlEvents_OnMouseDownEvent e)
{
if (e.button == 2)
{
axTOCControl2.HitTest(e.x, e.y, ref toccItem, ref pBasicMap, ref p_Layer, ref unk, ref data);
contextMenuStrip1.Show(axTOCControl2, e.x, e.y);
}
}
//TOCControl控件的OnMouseUp事件,获得目标图层及索引,控制图层的可见性
//并实现axMapControl中视图显示的索引的变化,并更新TOCControl控件中的显示顺序
private void axTOCControl2_OnMouseUp_1(object sender, ITOCControlEvents_OnMouseUpEvent e)
{
if (e.button == 1)
{
esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
IBasicMap map = null;
ILayer layer = null;
object other = null;
object index = null;
axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index);
IMap pMap = this.axMapControl1.ActiveView.FocusMap;
if (item == esriTOCControlItem.esriTOCControlItemLayer || layer != null)
{
if (pMoveLayer != null)
{
ILayer pTempLayer;
for (int i = 0; i < pMap.LayerCount; i++)
{
pTempLayer = pMap.get_Layer(i);
if (pTempLayer == layer)
{
toIndex = i;
}
}
pMap.MoveLayer(pMoveLayer, toIndex);
axMapControl1.ActiveView.Refresh();
axTOCControl2.Update();
}
}
}
}
private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e)
{
AttributeTableFrm frm = new AttributeTableFrm(p_Layer);
frm.CreateAttributeTable(p_Layer);
frm.frm1 = this;
frm.ShowDialog();
}
#region 专题图制作
private void 简单专题图_Click(object sender, EventArgs e)
{
try
{
专题图 ztt = new 专题图();
ztt.专题图1(axMapControl1);
}
catch (Exception)
{
MessageBox.Show("简单专题图制作失败!");
}
}
private void 柱状图_Click(object sender, EventArgs e)
{
try
{
专题图 ztt = new 专题图();
ztt.柱状专题图(axMapControl1);
}
catch (Exception)
{
MessageBox.Show("柱状专题图制作失败!");
}
}
private void 点状图_Click(object sender, EventArgs e)
{
try
{
专题图 ztt = new 专题图();
ztt.点状专题图(axMapControl1);
}
catch (Exception)
{
MessageBox.Show("点状专题图制作失败!");
}
}
#endregion
private void 开始编辑ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
edit1 pEdit = new edit1();
IFeatureLayer m_curFeatureLayer = p_Layer as IFeatureLayer;
pEdit.Getfeature(m_curFeatureLayer);
pEdit.ShowDialog();
this.axMapControl1.ActiveView.Refresh();
}
catch (Exception)
{
MessageBox.Show("地图编辑失败!");
}
}
private void axPageLayoutControl1_TabIndexChanged(object sender, EventArgs e)
{
if (this.tabControl1.SelectedTabIndex == 0)
{
//激活MapControl
m_controlsSynchronizer.ActivateMap();
}
else
{
//激活PageLayoutControl
m_controlsSynchronizer.ActivatePageLayout();
}
}
private void tabItem3_Click(object sender, EventArgs e)
{
axToolbarControl2.SetBuddyControl(axPageLayoutControl1);
}
private void tabItem1_Click(object sender, EventArgs e)
{
axToolbarControl2.SetBuddyControl(axMapControl1);
}
private void 查看属性_Click(object sender, EventArgs e)
{
}
}
public partial class Title : Form
{
public Form1 f1;
public Title(Form1 f)
{
InitializeComponent();
f1 = f;
}
private void button1_Click(object sender, EventArgs e)
{
FontDialog fontDialog = new FontDialog();
fontDialog.ShowColor = true;
fontDialog.AllowScriptChange = false;
if (fontDialog.ShowDialog() == DialogResult.OK)
{
richTextBox1.ForeColor = fontDialog.Color;
richTextBox1.SelectionFont = fontDialog.Font;
}
}
private void button2_Click(object sender, EventArgs e)
{
f1.StrTitle = richTextBox1.Text;
f1.StrFont = richTextBox1.SelectionFont;
f1.StrColor = richTextBox1.ForeColor;
this.Close();
f1.Refresh();
}
}
}