zoukankan      html  css  js  c++  java
  • ARCGIS部分功能

    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);
    }
    
    }
    }
    }
    

      

  • 相关阅读:
    基于docker的MongoDB复制(副本集)
    (已解决)ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib
    【洛谷3530】[POI2012] FES-Festival(差分约束+Tarjan)
    【洛谷4765】[CERC2014] The Imp(贪心+DP)
    【洛谷7093】[CERC2014] Can't stop playing(搜索)
    【CF755G】PolandBall and Many Other Balls(倍增FFT)
    【洛谷3896】[湖南集训] Clever Rabbit(搜索)
    【洛谷7215】[JOISC2020] 首都(点分治+BFS)
    【BZOJ4173】数学(欧拉函数)
    【洛谷5748】集合划分计数(多项式exp)
  • 原文地址:https://www.cnblogs.com/janeaiai/p/4845665.html
Copyright © 2011-2022 走看看