您的位置:首页 > 编程语言 > C#

C#:MapControl基本操作代码整理

2014-09-23 14:20 375 查看

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Windows.Forms;

using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.esriSystem;

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Geometry;

using ESRI.ArcGIS.Display;

using ESRI.ArcGIS.Geodatabase;

namespace MapCtrol    //直接引用时需替换成自己当前的命名空间

{

public class MapBaseOperate

{

/// <summary>

/// 添加SHP文当

/// </summary>

/// <param name="mapControl"></param>

public static void AddShapeFile(IMapControlDefault mapControl)

{

OpenFileDialog openfileDlg = new OpenFileDialog();

openfileDlg.Title = "添加shp图层文件";

openfileDlg.Filter = "map document (*.shp)|*.shp";

openfileDlg.ShowDialog();

string filepath = openfileDlg.FileName;

bool exist = File.Exists(filepath);

if (!exist)

{

MessageBox.Show("路径不存在!");

return;

}

string path;

string filename;

//int istart = filepath.LastIndexOf("\\");

//int iend = filepath.LastIndexOf(".");

//path = filepath.Substring(0, istart);

//filename = filepath.Substring(istart + 1, iend - istart - 1);

FileInfo fileinfo = new FileInfo(filepath);

path = filepath.Substring(0, filepath.Length - fileinfo.Name.Length);

filename = fileinfo.Name;

try

{

//加载图层文件

mapControl.AddShapeFile(path, filename);

//设置MapControl的显示范围到数据的全局范围

mapControl.Extent = mapControl.FullExtent;

}

catch (System.Exception ex)

{

MessageBox.Show("添加图层文件失败!" + ex.Message);

}

}

/// <summary>

/// 添加LYR文当

/// </summary>

/// <param name="mapControl"></param>

public static void AddLayerFile(IMapControlDefault mapControl)

{

OpenFileDialog openfileDlg = new OpenFileDialog();

openfileDlg.Title = "添加lyr图层文件";

openfileDlg.Filter = "map documents (*.lyr)|*.lyr";

openfileDlg.ShowDialog();

string filepath = openfileDlg.FileName;

bool exist = File.Exists(filepath);

if (!exist)

{

MessageBox.Show("路径不存在!");

return;

}

try

{

mapControl.AddLayerFromFile(filepath);

//设置MapControl的显示范围到数据的全局范围

mapControl.Extent = mapControl.FullExtent;

}

catch (System.Exception ex)

{

MessageBox.Show("添加图层文件失败!" + ex.Message);

}

}

/// <summary>

/// 删除地图所有图层

/// </summary>

public static void DeleteAllLayers(IMapControlDefault mapControl)

{

try

{

for (int i = mapControl.LayerCount - 1; i >= 0; i-- )

{

mapControl.DeleteLayer(i);

}

}

catch (System.Exception ex)

{

MessageBox.Show("删除图层失败!" + ex.Message);

}

}

/// <summary>

/// 将最底图层,移动到最上层

/// </summary>

public static void MoveLayerToTop(IMapControlDefault mapControl)

{

try

{

if (mapControl.LayerCount > 0)

{

mapControl.MoveLayerTo(mapControl.LayerCount - 1, 0);

}

}

catch (System.Exception ex)

{

MessageBox.Show("移动图层失败!" + ex.Message);

}

}

/// <summary>

/// 加载地图文当

/// </summary>

/// <param name="mapControl"></param>

public static void LoadMapDocument(IMapControlDefault mapControl)

{

OpenFileDialog openfileDlg = new OpenFileDialog();

openfileDlg.Title = "加载地图文当";

openfileDlg.Filter = "map document (*.mxd)|*.mxd";

openfileDlg.ShowDialog();

string filepath = openfileDlg.FileName;

if (mapControl.CheckMxFile(filepath))

{

mapControl.MousePointer = esriControlsMousePointer.esriPointerHourglass;

mapControl.LoadMxFile(filepath, 0, Type.Missing);

mapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;

}

else

{

MessageBox.Show(filepath + "不是有效的地图文当!");

}

}

/// <summary>

/// 加载特定地图文当

/// </summary>

/// <param name="mapControl"></param>

public static void LoadSpecificMapDocument(IMapControlDefault mapControl, string specificMapName)

{

OpenFileDialog openfileDlg = new OpenFileDialog();

openfileDlg.Title = "加载特定地图文当";

openfileDlg.Filter = "map document (*.mxd)|*.mxd";

openfileDlg.ShowDialog();

string filepath = openfileDlg.FileName;

if (mapControl.CheckMxFile(filepath))

{

if (string.IsNullOrWhiteSpace(specificMapName))

{

int istart = filepath.LastIndexOf("\\");

int iend = filepath.LastIndexOf(".");

specificMapName = filepath.Substring(istart + 1, iend - istart - 1);

}

IArray arrayMap = mapControl.ReadMxMaps(filepath, Type.Missing);

for (int i = 0; i < arrayMap.Count; i++)

{

IMap map = arrayMap.get_Element(i) as IMap;

if (specificMapName == map.Name)

{

mapControl.MousePointer = esriControlsMousePointer.esriPointerHourglass;

mapControl.LoadMxFile(filepath, 0, Type.Missing);

mapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;

break;

}

}

}

else

{

MessageBox.Show(filepath + "不是有效的地图文当!");

}

}

/// <summary>

/// By MapDocument

/// </summary>

public static IMapDocument LoadMapDoc(IMapControlDefault mapControl)

{

MapDocument mapdoc = new MapDocument();

try

{

OpenFileDialog openfileDlg = new OpenFileDialog();

openfileDlg.Title = "加载地图文当";

openfileDlg.Filter = "map document (*.mxd)|*.mxd";

openfileDlg.ShowDialog();

string filepath = openfileDlg.FileName;

mapdoc.Open(filepath, "");

for (int i = 0; i < mapdoc.MapCount; i++ )

{

mapControl.Map = mapdoc.get_Map(i);

}

mapControl.Refresh();

}

catch (System.Exception ex)

{

MessageBox.Show("加载地图文当失败" + ex.Message);

mapdoc = null;

}

return mapdoc;

}

/// <summary>

/// By MapDocument

/// </summary>

/// <param name="mapDoc"></param>

public static void SaveMapDoc(IMapDocument mapDoc)

{

if (null == mapDoc)

{

MessageBox.Show("保存地图文档失败!");

return;

}

if (mapDoc.get_IsReadOnly(mapDoc.DocumentFilename) == true)

{

MessageBox.Show("文档只读无法保存!");

}

try

{

mapDoc.Save(mapDoc.UsesRelativePaths,true);

MessageBox.Show("保存地图文档成功!");

}

catch (System.Exception ex)

{

MessageBox.Show("保存地图文档失败!" + ex.Message);

}

}

/// <summary>

/// By MapDocument

/// </summary>

/// <param name="mapDoc"></param>

public static void SaveAsMapDoc(IMapDocument mapDoc)

{

if (null == mapDoc)

{

MessageBox.Show("保存地图文档失败!");

return;

}

if (mapDoc.get_IsReadOnly(mapDoc.DocumentFilename) == true)

{

MessageBox.Show("文档只读无法保存!");

}

SaveFileDialog savefiledlg = new SaveFileDialog();

savefiledlg.Title = "保存地图文当";

savefiledlg.Filter = "map document (*.mxd)|*.mxd";

savefiledlg.ShowDialog();

string filepath = savefiledlg.FileName;

try

{

mapDoc.SaveAs(filepath,mapDoc.UsesRelativePaths,true);

MessageBox.Show("保存地图文档成功!");

}

catch (System.Exception ex)

{

MessageBox.Show("保存地图文档失败!" + ex.Message);

}

}

/// <summary>

/// 缩小

/// </summary>

/// <param name="mapControl"></param>

public static void ZoomOut(IMapControlDefault mapControl)

{

try

{

mapControl.MousePointer = esriControlsMousePointer.esriPointerPageZoomOut;

  //IEnvelope ipEnv = mapControl.TrackRectangle();

  IEnvelope ipEnv = mapControl.Extent;

  ipEnv.Expand(2, 2, true);

  mapControl.Extent = ipEnv;

}

catch (System.Exception ex)

{

MessageBox.Show("缩小失败!" + ex.Message);

}

}

/// <summary>

/// 放大

/// </summary>

/// <param name="mapControl"></param>

public static void ZoomIn(IMapControlDefault mapControl)

{

try

{

mapControl.MousePointer = esriControlsMousePointer.esriPointerPageZoomIn;

  IEnvelope ipEnv = mapControl.TrackRectangle();

  if (ipEnv.IsEmpty)

  {

  ipEnv = mapControl.Extent;

  ipEnv.Expand(0.5, 0.5, true);

  }

  mapControl.Extent = ipEnv;                  

}

catch (System.Exception ex)

{

MessageBox.Show("放大失败!" + ex.Message);

}

}

/// <summary>

/// 漫游

/// </summary>

/// <param name="mapControl"></param>

public static void Pan(IMapControlDefault mapControl)

{

try

{

mapControl.MousePointer = esriControlsMousePointer.esriPointerPagePan;

//IEnvelope ipEnv = mapControl.Extent;

mapControl.Pan();

}

catch (System.Exception ex)

{

MessageBox.Show("漫游失败!" + ex.Message);

}

}

/// <summary>

/// 全图

/// </summary>

/// <param name="mapControl"></param>

public static void FullExtent(IMapControlDefault mapControl)

{

try

{

mapControl.Extent = mapControl.FullExtent;

}

catch (System.Exception ex)

{

MessageBox.Show("全图失败!" + ex.Message);

}

}

/// <summary>

/// 写文字(待优化)

/// </summary>

/// <param name="mapControl"></param>

/// <param name="pGeom"></param>

/// <param name="pColor"></param>

/// <param name="text"></param>

public static void DrawMapText(IMapControlDefault mapControl, IGeometry pGeom, IRgbColor pColor, string text)

{

try

{

if (null == pColor)

{

pColor = new RgbColorClass();

pColor.Red = 255;

pColor.Green = 0;

pColor.Blue = 0;

}

ITextSymbol textsymbol = new TextSymbolClass();

textsymbol.Color = pColor;

if (null == text)

{

text = "Draw Text";

}

textsymbol.Text = "Text";

object symbol = textsymbol;

mapControl.DrawText(pGeom, text, ref symbol);

}

catch (System.Exception ex)

{

MessageBox.Show("写文字失败!" + ex);

}

}

/// <summary>

/// 画图

/// </summary>

/// <param name="mapControl"></param>

/// <param name="pGeom"></param>

/// <param name="pColor"></param>

/// <param name="width"></param>

public static void DrawMapShape(IMapControlDefault mapControl, IGeometry pGeom, IRgbColor pColor, int width)

{

try

{

if (null == pColor)

{

pColor = new RgbColorClass();

pColor.Red = 255;

pColor.Green = 255;

pColor.Blue = 0;

}

if (width < 1 || width > 20)

{

width = 5;

}

object symbol = null;

if (pGeom.GeometryType == esriGeometryType.esriGeometryPolyline)

{

ISimpleLineSymbol simpleLine = new SimpleLineSymbolClass();

simpleLine.Color = pColor;

simpleLine.Width = width;

symbol = simpleLine;

}

else

{

ISimpleFillSymbol simpleFill = new SimpleFillSymbolClass();

simpleFill.Color = pColor;

symbol = simpleFill;

}

mapControl.DrawShape(pGeom, ref symbol);

}

catch (System.Exception ex)

{

MessageBox.Show("画图失败!" + ex);

}

}

/// <summary>

/// 颜色

/// </summary>

/// <param name="r"></param>

/// <param name="g"></param>

/// <param name="b"></param>

/// <param name="t"></param>

/// <returns></returns>

public static IRgbColor GetColor(int r, int g, int b, int t)

{

IRgbColor rgbcolor = new RgbColorClass();

rgbcolor.Red = r;

rgbcolor.Green = g;

rgbcolor.Blue = b;

rgbcolor.Transparency = (byte)t;

return rgbcolor;

}

/// <summary>

/// 框选指定区域(鹰眼功能)

/// </summary>

/// <param name="envelope">e.NewEnvelope</param>

/// <param name="mapControl"></param>

public static void ShowRectangleByEnvelope(IEnvelope envelope, IMapControlDefault mapControl)

{

try

{

IGraphicsContainer graphicsContainer = mapControl.Map as IGraphicsContainer;

IActiveView activeView = graphicsContainer as IActiveView;

//在绘制前,清除axMapControl2中的任何图像元素

graphicsContainer.DeleteAllElements();

IElement element = new RectangleElementClass();

element.Geometry = envelope;

//设置鹰眼中的红线

//产生一个符号对象

ILineSymbol outLineSymbol = new SimpleLineSymbolClass();

outLineSymbol.Width = 2;

outLineSymbol.Color = GetColor(255, 0, 0, 255);

//设置颜色属性

//设置填充符号属性

IFillSymbol fillsymbol = new SimpleFillSymbolClass();

fillsymbol.Color = GetColor(9, 0, 0, 0);

fillsymbol.Outline = outLineSymbol;

IFillShapeElement fillShapeElement = element as IFillShapeElement;

fillShapeElement.Symbol = fillsymbol;

graphicsContainer.AddElement((IElement)fillShapeElement, 0);

activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);

}

catch (System.Exception ex)

{

MessageBox.Show("框选指定区域失败!" + ex);

}

}

/// <summary>

/// 清除选择

/// </summary>

/// <param name="mapControl"></param>

public static void ClearSelection(IMapControlDefault mapControl)

{

try

{

IActiveView activeView = (IActiveView)mapControl.Map;

//清除数据集前必须先刷新

activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, mapControl.get_Layer(0), null);

mapControl.Map.ClearSelection();

activeView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, mapControl.get_Layer(0), null);

}

catch (System.Exception ex)

{

MessageBox.Show("清除选择失败!" + ex);

}

}

/// <summary>

/// 名称查询

/// </summary>

/// <param name="mapControl"></param>

/// <param name="value"></param>

public static void SelectByName(IMapControlDefault mapControl, string field, string value)

{

try

{

string selectName = value.Trim();

ILayer layer = mapControl.Map.get_Layer(0);

IFeatureLayer featureLayer = layer as IFeatureLayer;

IFeatureClass featureClass = featureLayer.FeatureClass;

IQueryFilter queryFilter = new QueryFilterClass();

IFeatureCursor featureCursor;

IFeature feature = null; ;

queryFilter.WhereClause = field + " = " + value;

featureCursor = featureClass.Search(queryFilter, true);

feature = featureCursor.NextFeature();

if (null != feature)

{

mapControl.Map.SelectFeature(layer, feature);

mapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

}

}

catch (System.Exception ex)

{

MessageBox.Show("依据名称查询选中要素失败!" + ex);

}

}

/// <summary>

/// 依据指定的Geometry(Shape)选中要素

/// </summary>

/// <param name="mapControl"></param>

/// <param name="geometry"></param>

public static void SelectByShape(IMapControlDefault mapControl, IGeometry geometry)

{

try

{

mapControl.Map.SelectByShape(geometry, null, false);

mapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);

}

catch (System.Exception ex)

{

MessageBox.Show("依据指定的Geometry(Shape)选中要素失败!" + ex);

}

}

/// <summary>

/// 同步到MapControl控件

/// </summary>

public static void CopyToMapControl(IMapControlDefault mapControl, IMapControlDefault toMapControl)

{

try

{

IObjectCopy objCopy = new ObjectCopyClass();

object copyFromMap = mapControl.Map;

object copyMap = objCopy.Copy(copyFromMap);

object copyToMap = toMapControl.ActiveView.FocusMap;

objCopy.Overwrite(copyMap, ref copyToMap);

toMapControl.Extent = mapControl.FullExtent;

}

catch (System.Exception ex)

{

MessageBox.Show("Map间数据同步失败!" + ex);

}

}

/// <summary>

/// 同步到PageLayout控件

/// </summary>

public static void CopyToPageLayout(IMapControlDefault mapControl, IPageLayoutControlDefault pageLayoutControl)

{

try

{

IObjectCopy objCopy = new ObjectCopyClass();

object copyFromMap = mapControl.Map;

object copyMap = objCopy.Copy(copyFromMap);

object copyToMap = pageLayoutControl.ActiveView.FocusMap;

objCopy.Overwrite(copyMap, ref copyToMap);

}

catch (System.Exception ex)

{

MessageBox.Show("Map与PageLayout数据同步失败!" + ex);

}

}

/// <summary>

/// 屏幕变化后刷新屏幕

/// </summary>

/// <param name="mapControl"></param>

public static void AfterScreenDraw(IMapControlDefault mapControl)

{

try

{

IActiveView activeView = (IActiveView)mapControl.ActiveView.FocusMap;

IDisplayTransformation displayTransformation = activeView.ScreenDisplay.DisplayTransformation;

displayTransformation.VisibleBounds = mapControl.Extent;

mapControl.ActiveView.Refresh();

}

catch (System.Exception ex)

{

MessageBox.Show("刷新屏幕失败!" + ex);

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: