在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → 出图:地图服务和要素类(ESRI.ArcGIS)

出图:地图服务和要素类(ESRI.ArcGIS)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.52M
  • 下载次数:17
  • 浏览次数:183
  • 发布时间:2020-11-03
  • 实例类别:C#语言基础
  • 发 布 人:w2621622397
  • 文件格式:.zip
  • 所需积分:2

实例介绍

【实例简介】
【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using GisExtent;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.GISClient;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.SystemUI;
using System.Threading;
using System.Text.RegularExpressions;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Framework;
using System.IO;
using System.Drawing.Imaging;
using System.Web;
using ESRI.ArcGIS.Display;

namespace WinformGui
{
    public partial class FOutPic : Form
    {
        FLyrStyleSet _fLyrStyleSet = null;
        ILayer _lyrIn = null;
        ILayer _lyrTo = null;
        IGroupLayer _lyrGroupIn = null;
        double _lyrLineWith = 2;
        int _red = 255;
        int _green = 0;
        int _blue = 0;

        string _unionPicPath { get { return TempPicUrl("tempUnion"); } }
        string TempPicUrl(object idx = null, string dirName = "")
        {
            string baseUrl = AppDomain.CurrentDomain.BaseDirectory;
            idx = idx == null ? "temp" : idx;
            baseUrl = System.IO.Path.Combine(baseUrl, "temp");
            if (!string.IsNullOrEmpty(dirName))
            {
                baseUrl = System.IO.Path.Combine(baseUrl, dirName);
            }
            string picName = string.Format(@"{0}.jpg", idx);
            return System.IO.Path.Combine(baseUrl, picName);
        }
        string TempPartPicUrl(object idx = null)
        {
            return TempPicUrl(idx, "part");
        }
        IColor _colorLine;
        IColor ColorLine
        {
            get
            {
                _colorLine = new RgbColorClass
                {
                    Red = _red,
                    Green = _green,
                    Blue = _blue
                };
                return _colorLine;

            }
        }
        IMarkerSymbol _markerSymbol;
        IMarkerSymbol MarkerSymbol
        {
            get
            {
                _markerSymbol = new SimpleMarkerSymbolClass
                {
                    Color = ColorLine,
                    Size = _lyrLineWith
                };
                return _markerSymbol;
            }
        }

        ILineSymbol _lineSymbol;
        ILineSymbol LineSymbol
        {
            get
            {
                _lineSymbol = new SimpleLineSymbolClass();
                _lineSymbol.Width = _lyrLineWith;
                _lineSymbol.Color = ColorLine;
                return _lineSymbol;
            }
        }

        IFillSymbol _fillSymbol;
        IFillSymbol FillSymbol
        {
            get
            {
                _fillSymbol = new SimpleFillSymbolClass();
                _fillSymbol.Outline = LineSymbol;
                ISimpleFillSymbol simpleFillSymbol = _fillSymbol as ISimpleFillSymbol;
                simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSNull;
                return _fillSymbol;
            }
        }

        string GetGroupLyrName(Control ctrl)
        {
            return StringX.SubStringRight(ctrl.Text, 0, 2); ;
        }
        //右击图层
        ILayer SelectLayer
        {
            get
            {
                esriTOCControlItem esriTOCControlItemP = esriTOCControlItem.esriTOCControlItemNone;
                IBasicMap basicMap = null;
                ILayer selectLayer = null;
                object unk = null;
                object data = null;
                tocCtrl.GetSelectedItem(ref esriTOCControlItemP, ref basicMap, ref selectLayer, ref unk, ref data);
                return selectLayer;
            }
        }
        public FOutPic()
        {
            InitializeComponent();
        }

        Action<string> WriteLog
        {
            get
            {
                return (logStr) =>
                {
                    ThreadStart threadStartLog = () =>
                    {
                        rtbLog.Clear();
                        rtbLog.AppendText(logStr);
                    };
                    Invoke(threadStartLog);
                };
            }
        }

        Action<Exception> ShowPopUpAndLogExcept
        {
            get
            {
                return (ex) =>
                {
                    ThreadStart dealThreadCtrl = () =>
                    {
                        MessageBox.Show(ex.Message);
                    };
                    Invoke(dealThreadCtrl);
                    LogX.ANew.DealLog(ex, WriteLog);
                };
            }
        }

        private void btnAddPolygon_Click(object sender, EventArgs e)
        {
            AddLyr2Lyrs(btnAddPolygon);
        }
        private void btnAddMerge_Click(object sender, EventArgs e)
        {
            AddLyr2Lyrs(btnAddMerge);
        }

        private void AddLyr2Lyrs(Control ctrl)
        {
            //ThreadStart threadStart = () =>
            //{
            try
            {
                IMap map = mapCtrl.Map;
                IGroupLayer groupLayer = FindOrCreateGourpLyr(map, ctrl);
                //匿名委托
                Action<string> addLyr = (url) =>
                {
                    bool isVisible = cbxAddIsvisible.Checked;
                    if (Regex.IsMatch(url, @"^http", RegexOptions.IgnoreCase))
                    {
                        //加地图服务
                        AddMapSvrLyr(url, groupLayer, isVisible);
                    }
                    else
                    {
                        //加本地矢量要素类
                        AddLocalFcLyr(url, groupLayer, isVisible);
                    }
                };

                //
                OpenGisDataDialog aNew = OpenGisDataDialog.ANew;
                aNew.Text = ctrl.Text;
                aNew.SelectPathsDo(addLyr);
                map.DeleteLayer(groupLayer);
                map.AddLayer(groupLayer);
                //图斑图层在最前,方便选图斑
                if (ctrl == btnAddMerge)
                {
                    string groupLyrName = GetGroupLyrName(btnAddPolygon);
                    IGroupLayer groupLayerPolygon = FindGroupLayer(map, groupLyrName);
                    if (groupLayerPolygon != null)
                    {
                        map.MoveLayer(groupLayerPolygon, 0);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("请添加要素类或地图服务。");
                LogX.ANew.DealLog(ex, WriteLog);
                //ShowPopUpAndLogExcept(ex);
            }
            //};
            //Thread thread = new Thread(threadStart);
            //thread.Start();
        }
        /// <summary>
        /// 加本地矢量要素类
        /// </summary>
        /// <param name="url"></param>
        /// <param name="groupLayer"></param>
        private void AddLocalFcLyr(string url, IGroupLayer groupLayer, bool isVisible = true)
        {
            IFeatureClass fc = EsriX.GetFeatureClass(url);
            IFeatureLayer ftLyr = new FeatureLayerClass();
            ftLyr.FeatureClass = fc;
            ftLyr.Name = fc.AliasName;
            ftLyr.Visible = isVisible;
            IGeoFeatureLayer geoFeatureLayer = ftLyr as IGeoFeatureLayer;
            geoFeatureLayer.Renderer = GetRenderer(geoFeatureLayer);
            groupLayer.Add(ftLyr);
        }

        private IFeatureRenderer GetRenderer(IGeoFeatureLayer geoFeatureLayer)
        {
            ISimpleRenderer simpleRenderer = new SimpleRendererClass();
            IFeatureClass fc = geoFeatureLayer.FeatureClass;
            esriGeometryType esriGeometryTypeP = fc.ShapeType;
            switch (esriGeometryTypeP)
            {
                case esriGeometryType.esriGeometryPoint:
                    simpleRenderer.Symbol = MarkerSymbol as ISymbol;
                    break;
                case esriGeometryType.esriGeometryMultipoint:
                    simpleRenderer.Symbol = MarkerSymbol as ISymbol;
                    break;
                case esriGeometryType.esriGeometryPolyline:
                    simpleRenderer.Symbol = LineSymbol as ISymbol;
                    break;
                case esriGeometryType.esriGeometryLine:
                    simpleRenderer.Symbol = LineSymbol as ISymbol;
                    break;
                case esriGeometryType.esriGeometryPolygon:
                    simpleRenderer.Symbol = FillSymbol as ISymbol;
                    break;
            }
            return simpleRenderer as IFeatureRenderer;
        }
        /// <summary>
        /// 加地图服务
        /// </summary>
        /// <param name="urlRoot"></param>
        /// <param name="groupLayer"></param>
        private void AddMapSvrLyr(string url, IGroupLayer groupLayer, bool isVisible = true)
        {
            IAGSServerConnectionFactory aGSServerConnectionFactory = new AGSServerConnectionFactoryClass();
            IPropertySet propertySet = new PropertySet();
            string urlEnum = GetValidMapSvrEnumUrl(url);
            string mapSvrName = GetMapSvrNameDecode(url);
            propertySet.SetProperty("url", urlEnum);
            IAGSServerConnection aGSServerConnection = aGSServerConnectionFactory.Open(propertySet, 0);
            IAGSEnumServerObjectName aGSEnumServerObjectName = aGSServerConnection.ServerObjectNames;
            for (IAGSServerObjectName aGSServerObjectName = aGSEnumServerObjectName.Next(); aGSServerObjectName != null; aGSServerObjectName = aGSEnumServerObjectName.Next())
            {
                try
                {
                    ILayer lyr = null;
                    if (aGSServerObjectName.Type == "MapServer")
                    {
                        IMapServerLayer mapSvrLyr = new MapServerLayerClass();
                        IName name = aGSServerObjectName as IName;
                        object openResult = name.Open();
                        IAGSServerObject aGSEnumServerObject = openResult as IAGSServerObject;
                        IMapServer mapSvr = aGSEnumServerObject as IMapServer;
                        string mapName = mapSvr.DefaultMapName;
                        mapSvrLyr.ServerConnect(aGSServerObjectName, mapName);
                        lyr = mapSvrLyr as ILayer;
                    }
                    if (lyr != null)
                    {
                        bool isAddLyr = true;
                        if (!string.IsNullOrEmpty(mapSvrName))
                        {
                            string lyrName = lyr.Name;
                            isAddLyr = Regex.IsMatch(lyrName, mapSvrName, RegexOptions.IgnoreCase);
                        }
                        if (isAddLyr)
                        {
                            ThreadStart dealThreadCtrl = () =>
                            {
                                try
                                {
                                    lyr.Visible = isVisible;
                                    groupLayer.Add(lyr);
                                }
                                catch (Exception ex)
                                {
                                    ShowPopUpAndLogExcept(ex);
                                }
                            };
                            Invoke(dealThreadCtrl);
                        }
                    }
                }
                catch (Exception ex)
                {
                    LogX.ANew.DealLog(ex, WriteLog);
                }
            }
        }

        private string GetMapSvrName(string url)
        {
            string result = "";
            Match match = Regex.Match(url, @". /services/", RegexOptions.IgnoreCase);
            if (match.Length > 0)
            {
                string urlSvc = match.Value;
                string urlSvcAfter = url.Substring(urlSvc.Length - 1);
                string[] urlSvcAfters = urlSvcAfter.Split(new string[] { @"/", @"\" }, StringSplitOptions.RemoveEmptyEntries);
                result = urlSvcAfters[0];
                for (int i = 1; i < urlSvcAfters.Length; i  )
                {
                    string svcAfter = urlSvcAfters[i];
                    if (!Regex.IsMatch(svcAfter, "MapServer", RegexOptions.IgnoreCase))
                    {
                        result  = "/"   svcAfter;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return result;
        }
        private string GetMapSvrNameDecode(string url)
        {
            string temp = GetMapSvrName(url);
            string result = HttpUtility.UrlDecode(temp);
            return result;
        }

        private IGroupLayer FindOrCreateGourpLyr(IMap map, Control ctrl)
        {
            string groupLyrName = GetGroupLyrName(ctrl);
            IGroupLayer groupLayer = FindGroupLayer(map, groupLyrName);
            if (groupLayer == null)
            {
                groupLayer = new GroupLayerClass
                {
                    Name = groupLyrName,
                    Visible = true
                };
            }
            return groupLayer;
        }

        private static IGroupLayer FindGroupLayer(IMap map, string groupLyrName)
        {
            IEnumLayer enumLayer = map.Layers;
            ILayer lyrParent = EsriX.FindLayerFirst(enumLayer, groupLyrName);
            IGroupLayer groupLayer = lyrParent as IGroupLayer;
            return groupLayer;
        }

        private string GetValidMapSvrEnumUrl(string url)
        {
            string validUrl = url;
            Match match = Regex.Match(url, @"http[s]?://.*/rest", RegexOptions.IgnoreCase);
            if (match.Length > 0)
            {
                validUrl = match.Value;
            }
            return validUrl;
        }

        private void FOutPic_Load(object sender, EventArgs e)
        {
            tocCtrl.SetBuddyControl(mapCtrl);
            setToolbarControl(mapCtrl, toolbarCtrl);
        }

        private void setToolbarControl(object buddyCtrl, AxToolbarControl toolbarCtrl)
        {
            toolbarCtrl.SetBuddyControl(buddyCtrl);
            string proId = "esriControlToolsMapNavigation.ControlsMapPanTool";
            toolbarCtrl.AddItem(proId);
            proId = "esriControlToolsMapNavigation.ControlsMapZoomInTool";
            toolbarCtrl.AddItem(proId, -1, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
            proId = "esriControlToolsMapNavigation.ControlsMapZoomOutTool";
            toolbarCtrl.AddItem(proId, -1, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
            proId = "esriControlToolsMapNavigation.ControlsMapFullExtentCommand";
            toolbarCtrl.AddItem(proId, -1, -1, true, 0, esriCommandStyles.esriCommandStyleIconOnly);
        }

        private void toolbarCtrl_OnMouseDown(object sender, IToolbarControlEvents_OnMouseDownEvent e)
        {

        }

        private void btnGeneratePic_Click(object sender, EventArgs e)
        {
            try
            {
                IMap map = mapCtrl.Map;
                ISelection selection = map.FeatureSelection;
                IEnumFeature enumFeature = selection as IEnumFeature;

                //缩放至所选要素
                IActiveView activeView = mapCtrl.ActiveView;
                IEnvelope rawExtent = activeView.Extent;
                ZoomToSelectFeature(enumFeature);

                //设置图斑下所有可见矢量图层:线和填充为NoColor,点关闭图层,以达到非选中要素不可见
                IEnumLayer enumLayer = map.Layers;
                List<ILayer> needNoseePolygonLyrs = SetPolygonLayersNosee(enumLayer);
                List<ILayer> needNoseeMergeLyrs = SetMergeLayersNosee(enumLayer);
                if (needNoseeMergeLyrs.Count <= 0)
                {
                    string mergeLyrName = GetGroupLyrName(btnAddMerge);
                    MessageBox.Show(string.Format("请添加可见{0}图层", mergeLyrName));
                    return;
                }

                //设置选中样式,以打印范围
                SetRedOutLineNoFill(enumFeature);

                tagRECT tagRECT = activeView.ExportFrame;
                tagRECT.left = 0;
                tagRECT.top = 0;
                //水平像素
                int onePicWidth = GetUiWidthPix();
                tagRECT.right = onePicWidth;
                //垂直像素
                int onePicHigh = GetUiHighPix();
                tagRECT.bottom = onePicHigh;
                IExport export = new ExportJPEGClass();
                //dpi
                int dpi = (int)nudDpi.Value;
                export.Resolution = dpi;
                string baseUrl = AppDomain.CurrentDomain.BaseDirectory;
                string dirPath = System.IO.Path.GetDirectoryName(TempPartPicUrl());
                //清空文件夹
                if (Directory.Exists(dirPath))
                {
                    Directory.Delete(dirPath, true);
                }
                Directory.CreateDirectory(dirPath);

                IEnvelope envelope = new EnvelopeClass();
                envelope.PutCoords(tagRECT.left, tagRECT.top, tagRECT.right, tagRECT.bottom);
                export.PixelBounds = envelope;

                Dictionary<string, string> filePathLyrNames = new Dictionary<string, string>();
                for (int i = 0; i < needNoseeMergeLyrs.Count; i  )
                {
                    ILayer lyrPrintMerge = needNoseeMergeLyrs[i];
                    lyrPrintMerge.Visible = true;
                    Refresh();
                    string lyrName = lyrPrintMerge.Name;
                    string fileName = Regex.Replace(lyrName, @"(\\|/)", "_");
                    string tempPicPath = TempPartPicUrl(fileName);
                    if (filePathLyrNames.ContainsKey(tempPicPath))
                    {
                        string appenName = Guid.NewGuid().ToString();
                        tempPicPath = FileX.GetReNameFileName(tempPicPath, appenName);
                    }
                    export.ExportFileName = tempPicPath;
                    filePathLyrNames.Add(tempPicPath, lyrName);

                    int hdc = export.StartExporting();
                    //没用
                    int dpiNoUse = dpi;
                    activeView.Output(hdc, dpiNoUse, ref tagRECT, null, null);
                    export.FinishExporting();
                    export.Cleanup();
                    lyrPrintMerge.Visible = false;
                }

                //恢复图层之前显示状态
                RestoreState(needNoseePolygonLyrs, needNoseeMergeLyrs, rawExtent);

                //写文字
                string[] fileUrls = Directory.GetFiles(dirPath);
                for (int i = 0; i < fileUrls.Length; i  )
                {
                    string fileUrl = fileUrls[i];
                    using (Bitmap bitmapPart = BitmapX.GetBitmapNoOccupyFile(fileUrl))
                    {
                        using (Graphics graphics = Graphics.FromImage(bitmapPart))
                        {
                            string drawStr = filePathLyrNames[fileUrl];
                            Font font = new Font("微软雅黑", 20);
                            int left = 10;
                            int top = 5;
                            Size size = TextRenderer.MeasureText(drawStr, font);
                            graphics.FillRectangle(Brushes.White, left, top, size.Width, size.Height);
                            graphics.DrawString(drawStr, font, Brushes.Blue, new PointF(left, top));
                            bitmapPart.Save(fileUrl);
                        }
                    }
                }

                //合图
                int resutlPicQty = fileUrls.Length;
                int marginWidth = 8;
                int marginHigh = marginWidth;
                int resutlWidth = (onePicWidth   2 * marginWidth) * resutlPicQty;
                int resutlHigh = onePicHigh   2 * marginHigh;
                using (Bitmap bitmapResult = new Bitmap(resutlWidth, resutlHigh))
                {
                    using (Graphics graphicsResult = Graphics.FromImage(bitmapResult))
                    {
                        for (int i = 0; i < fileUrls.Length; i  )
                        {
                            string fileUrl = fileUrls[i];
                            using (Bitmap bitmapPart = BitmapX.GetBitmapNoOccupyFile(fileUrl))
                            {
                                int multiple = i * 2   1;
                                int leftTopX = marginWidth * multiple   i * onePicWidth;
                                int leftTopY = marginHigh;
                                graphicsResult.DrawImage(bitmapPart, leftTopX, leftTopY);
                            }
                        }
                    }
                    bitmapResult.Save(_unionPicPath);
                }
                //切换选项卡
                if (File.Exists(_unionPicPath))
                {
                    Bitmap bitmap = BitmapX.GetBitmapNoOccupyFile(_unionPicPath);
                    pbxResult.Image = bitmap;
                    tabCt_InTo.SelectedTab = tabPTo;
                }
            }
            catch (Exception ex)
            {
                ShowPopUpAndLogExcept(ex);
            }
        }

        private void RestoreState(List<ILayer> needNoseePolygonLyrs, List<ILayer> needNoseeMergeLyrs, IEnvelope rawExtent)
        {
            IActiveView activeView = mapCtrl.ActiveView;
            activeView.Extent = rawExtent;
            SetLyrSee(needNoseePolygonLyrs);
            SetLyrSee(needNoseeMergeLyrs);

            //清空临时画的图形
            IGraphicsContainer graphicsContainer = mapCtrl.Map as IGraphicsContainer;
            graphicsContainer.DeleteAllElements();
            Refresh();
        }

        new private void Refresh()
        {
            mapCtrl.Update();
            mapCtrl.Refresh();
            mapCtrl.ActiveView.Refresh();

            tocCtrl.Update();
            tocCtrl.Refresh();
            tocCtrl.ActiveView.Refresh();
        }

        private void SetRedOutLineNoFill(IEnumFeature enumFeature)
        {
            enumFeature.Reset();
            for (IFeature ft = enumFeature.Next(); ft != null; ft = enumFeature.Next())
            {
                IGeometry geometry = ft.Shape;
                IElement element = null;
                if (geometry.Dimension == esriGeometryDimension.esriGeometry0Dimension)
                {
                    element = new MarkerElementClass()
                    {
                        Symbol = MarkerSymbol
                    };
                }
                else if (geometry.Dimension == esriGeometryDimension.esriGeometry1Dimension)
                {
                    element = new LineElementClass()
                    {
                        Symbol = LineSymbol
                    };
                }
                else if (geometry.Dimension == esriGeometryDimension.esriGeometry2Dimension)
                {
                    element = new PolygonElementClass()
                    {
                        Symbol = FillSymbol
                    };
                }
                if (element != null)
                {
                    IGraphicsContainer graphicsContainer = mapCtrl.Map as IGraphicsContainer;
                    element.Geometry = geometry;
                    graphicsContainer.AddElement(element, 0);
                    mapCtrl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
                }
            }
        }

        private void SetLyrSee(List<ILayer> needNoseeLyrs)
        {
            foreach (ILayer lyr in needNoseeLyrs)
            {
                lyr.Visible = true;
            }
        }
        /// <summary>
        /// 设置图斑层不可见,仅图层组关闭,子图层不关
        /// </summary>
        /// <param name="enumLayer"></param>
        /// <returns></returns>
        private List<ILayer> SetPolygonLayersNosee(IEnumLayer enumLayer)
        {
            List<ILayer> needNoseeLyrs = new List<ILayer>();
            enumLayer.Reset();
            for (ILayer lyr = enumLayer.Next(); lyr != null; lyr = enumLayer.Next())
            {
                IGroupLayer groupLayer = lyr as IGroupLayer;
                if (groupLayer == null) continue;
                string groupLyrName = GetGroupLyrName(btnAddPolygon);
                if (lyr.Name == groupLyrName && lyr.Visible)
                {
                    SetNoseeAddList(needNoseeLyrs, lyr);
                }
            }
            return needNoseeLyrs;
        }
        /// <summary>
        /// 融合图层组不关,子图层全关
        /// </summary>
        /// <param name="enumLayer"></param>
        /// <returns></returns>
        private List<ILayer> SetMergeLayersNosee(IEnumLayer enumLayer)
        {
            List<ILayer> needNoseeLyrs = new List<ILayer>();
            enumLayer.Reset();
            for (ILayer lyr = enumLayer.Next(); lyr != null; lyr = enumLayer.Next())
            {
                IGroupLayer groupLayer = lyr as IGroupLayer;
                if (groupLayer == null) continue;
                string groupLyrName = GetGroupLyrName(btnAddMerge);
                if (lyr.Name == groupLyrName && lyr.Visible)
                {
                    //图层组内图层
                    SetNoSeeChildLyr(needNoseeLyrs, groupLayer);
                }
            }
            return needNoseeLyrs;
        }

        private static void SetNoSeeChildLyr(List<ILayer> needNoseeLyrs, IGroupLayer groupLayer)
        {
            ICompositeLayer compositeLayer = groupLayer as ICompositeLayer;
            for (int i = 0; i < compositeLayer.Count; i  )
            {
                ILayer lyrChild = compositeLayer.Layer[i];
                SetNoseeAddList(needNoseeLyrs, lyrChild);
            }
        }

        private static void SetNoseeAddList(List<ILayer> needNoseeLyrs, ILayer lyrChild)
        {
            if (lyrChild.Visible)
            {
                lyrChild.Visible = false;
                needNoseeLyrs.Add(lyrChild);
            }
        }

        private bool ZoomToSelectFeature(IEnumFeature enumFeature)
        {
            bool isZoom = !cbxNowRegion.Checked;
            if (isZoom)
            {
                IEnvelope envelope = GetEnvelopeByUnionBuffer(enumFeature);
                //缩放
                if (envelope != null)
                {
                    IActiveView activeView = mapCtrl.ActiveView;
                    activeView.Extent = envelope;
                    activeView.Refresh();
                }
            }
            return isZoom;
        }

        private static IEnvelope GetEnvelopeByFactory(ISelection selection)
        {
            IEnumGeometry enumGeometry = new EnumFeatureGeometry();
            IEnumGeometryBind enumGeometryBind = enumGeometry as IEnumGeometryBind;
            //出错
            enumGeometryBind.BindGeometrySource(null, selection);
            IGeometryFactory geometryFactory = new GeometryEnvironment() as IGeometryFactory;
            IGeometry geoExtent = geometryFactory.CreateGeometryFromEnumerator(enumGeometry);
            return geoExtent.Envelope;
        }

        private IEnvelope GetEnvelopeByUnionBuffer(IEnumFeature enumFeature)
        {
            IEnvelope envelope = null;
            IGeometry geometry = UnionGeometry(enumFeature);
            ITopologicalOperator tp = geometry as ITopologicalOperator;
            if (tp != null)
            {
                double bufferValue = (double)nudBuffer.Value;
                IGeometry geometryBuffer = tp.Buffer(bufferValue);
                envelope = geometryBuffer.Envelope;
            }
            return envelope;
        }

        private static IEnvelope GetEnvelopeByUnion(IEnumFeature enumFeature)
        {
            IEnvelope envelope = null;
            IGeometry geometry = UnionGeometry(enumFeature);
            if (geometry != null)
            {
                envelope = geometry.Envelope;
            }
            return envelope;
        }

        private static IGeometry UnionGeometryExtent(IEnumFeature enumFeature)
        {
            ITopologicalOperator topoOperate = null;
            for (IFeature ft = enumFeature.Next(); ft != null; ft = enumFeature.Next())
            {
                IGeometry geometry = ft.Extent as IGeometry;
                if (topoOperate != null)
                {
                    IGeometry geometryUnion = topoOperate.Union(geometry);
                    topoOperate = geometryUnion as ITopologicalOperator;
                }
                else
                {
                    //首次
                    topoOperate = geometry as ITopologicalOperator;
                }
            }
            return topoOperate as IGeometry;
        }

        private static IGeometry UnionGeometry(IEnumFeature enumFeature)
        {
            ITopologicalOperator topoOperate = null;
            enumFeature.Reset();
            for (IFeature ft = enumFeature.Next(); ft != null; ft = enumFeature.Next())
            {
                IGeometry geometry = ft.Shape;
                if (topoOperate != null)
                {
                    IGeometry geometryUnion = topoOperate.Union(geometry);
                    topoOperate = geometryUnion as ITopologicalOperator;
                }
                else
                {
                    //首次
                    topoOperate = geometry as ITopologicalOperator;
                }
            }
            return topoOperate as IGeometry;
        }

        private int GetUiHighPix()
        {
            return (int)nudHigh.Value; ;
        }

        private int GetUiWidthPix()
        {
            return (int)nudWidth.Value;
        }

        private int Get551010WidthOrHightPix(int defaultValue)
        {
            return defaultValue;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                if (pbxResult.Image == null || !File.Exists(_unionPicPath))
                {
                    btnGeneratePic_Click(null, null);
                    return;
                }
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "jpg files(*.jpg)|*.jpg";
                saveFileDialog.ShowDialog();
                string saveUrl = saveFileDialog.FileName;
                if (!string.IsNullOrEmpty(saveUrl))
                {
                    //pbxResult.Image.Save(saveUrl);
                    File.Copy(_unionPicPath, saveUrl, true);
                    MessageBox.Show("完成。");
                }
            }
            catch (Exception ex)
            {
                ShowPopUpAndLogExcept(ex);
            }
        }

        private ImageCodecInfo GetImageEncoder(string fileExtensionIn)
        {
            ImageCodecInfo result = null;
            ImageCodecInfo[] imageCodecInfos = ImageCodecInfo.GetImageEncoders();
            foreach (ImageCodecInfo imageCodecInfo in imageCodecInfos)
            {
                string filenameExtension = imageCodecInfo.FilenameExtension;
                if (Regex.IsMatch(filenameExtension, fileExtensionIn, RegexOptions.IgnoreCase))
                {
                    result = imageCodecInfo;
                    break;
                }
            }
            return result;
        }

        private void tabPTo_Click(object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 缩放至图层
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiZoon2Lyr_Click(object sender, EventArgs e)
        {
            if (SelectLayer != null)
            {
                IActiveView activeView = mapCtrl.ActiveView;
                activeView.Extent = SelectLayer.AreaOfInterest;
                activeView.Refresh();
            }
        }
        /// <summary>
        /// 移除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiRemoveLyr_Click(object sender, EventArgs e)
        {
            if (SelectLayer != null)
            {
                IMap map = mapCtrl.Map;
                map.DeleteLayer(SelectLayer);
            }
        }

        private void tocCtrl_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e)
        {
            int x = e.x;
            int y = e.y;
            esriTOCControlItem esriTOCControlItemP = esriTOCControlItem.esriTOCControlItemNone;
            IBasicMap basicMap = null;
            object unk = null;
            object data = null;
            ILayer lyrIn = null;
            tocCtrl.HitTest(x, y, ref esriTOCControlItemP, ref basicMap, ref lyrIn, ref unk, ref data);
            if (e.button == 1)
            {
                //鼠标左击:移动图层顺序
                _lyrIn = lyrIn;
                IGroupLayer lyrGroup;
                IMap map = mapCtrl.Map;
                int lyrIdxToInGroupLyr = EsriX.FindLayerFirstInGroupLyr(map.Layers, lyrIn, out lyrGroup);
                if (lyrIdxToInGroupLyr >= 0)
                {
                    _lyrGroupIn = lyrGroup;
                }
            }
        }

        private void tocCtrl_OnMouseUp(object sender, ITOCControlEvents_OnMouseUpEvent e)
        {
            int x = e.x;
            int y = e.y;
            esriTOCControlItem esriTOCControlItemP = esriTOCControlItem.esriTOCControlItemNone;
            IBasicMap basicMap = null;
            object unk = null;
            object data = null;
            tocCtrl.HitTest(x, y, ref esriTOCControlItemP, ref basicMap, ref _lyrTo, ref unk, ref data);

            switch (esriTOCControlItemP)
            {
                case esriTOCControlItem.esriTOCControlItemHeading:
                    break;

                case esriTOCControlItem.esriTOCControlItemLayer:
                    if (e.button == 1)
                    {
                        //鼠标左击:移动图层顺序
                        if (_lyrIn != null && _lyrTo != null)
                        {
                            IMap map = mapCtrl.Map;
                            IGroupLayer lyrGroupToFind;
                            IGroupLayer lyrGroupTo = _lyrTo as IGroupLayer;
                            int lyrIdxToGroupLyr = EsriX.FindLayerFirstInGroupLyr(map.Layers, _lyrTo, out lyrGroupToFind);
                            IMapLayers mapLayers = map as IMapLayers;
                            if (lyrIdxToGroupLyr >= 0)
                            {
                                mapLayers.MoveLayerEx(_lyrGroupIn, lyrGroupToFind, _lyrIn, lyrIdxToGroupLyr);
                            }
                            else if (lyrGroupTo != null && lyrGroupTo != _lyrIn)
                            {
                                //如果目标图层组内没子图层
                                mapLayers.MoveLayerEx(_lyrGroupIn, lyrGroupTo, _lyrIn, 0);
                            }
                        }
                    }
                    else if (e.button == 2)
                    {
                        //鼠标右击:显示右击菜单
                        tsmiRename.Enabled = GetRenameEnabled(_lyrTo);
                        cmsToc.Show(tocCtrl, x, y);
                    }
                    break;

                case esriTOCControlItem.esriTOCControlItemLegendClass:
                    if (_lyrTo != _lyrIn) break;
                    IGeoFeatureLayer geoFeatureLyr = _lyrTo as IGeoFeatureLayer;
                    if (geoFeatureLyr == null) break;
                    if (_fLyrStyleSet == null)
                    {
                        _fLyrStyleSet = new FLyrStyleSet();
                    }
                    _fLyrStyleSet.ShowDialog();
                    DialogResult dialogResult = _fLyrStyleSet.DialogResultX;
                    if (dialogResult == DialogResult.OK || dialogResult == DialogResult.Yes)
                    {
                        _lyrLineWith = (double)_fLyrStyleSet.nudWidth.Value;
                        _red = (int)_fLyrStyleSet.nudColorR.Value;
                        _green = (int)_fLyrStyleSet.nudColorG.Value;
                        _blue = (int)_fLyrStyleSet.nudColorB.Value;
                        geoFeatureLyr.Renderer = GetRenderer(geoFeatureLyr);
                    }
                    break;

                case esriTOCControlItem.esriTOCControlItemMap:
                    break;

                case esriTOCControlItem.esriTOCControlItemNone:
                    break;
            }
            Refresh();
        }

        private bool GetRenameEnabled(ILayer lyrTo)
        {
            bool result = true;
            if (lyrTo is IGroupLayer && (lyrTo.Name == GetGroupLyrName(btnAddPolygon) || lyrTo.Name == GetGroupLyrName(btnAddMerge)))
            {
                result = false;
            }
            return result;
        }

        private int GetParentLocation(Control ctrl, bool isX)
        {
            int value = 0;
            if (isX)
            {
                value  = ctrl.Location.X;
            }
            else
            {
                value  = ctrl.Location.Y;
            }
            Control ctrlParent = ctrl.Parent;
            if (ctrlParent != null)
            {
                value  = GetParentLocation(ctrlParent, isX);
            }
            return value;
        }

        private void pnlResult_Paint(object sender, PaintEventArgs e)
        {

        }

        private void cbxNowRegion_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void pbxResult_Click(object sender, EventArgs e)
        {

        }

        private void tsmiRename_Click(object sender, EventArgs e)
        {
            string lyrNameOld = _lyrTo.Name;
            FRename fRename = new FRename();
            fRename.txtRename.Text = lyrNameOld;
            fRename.ShowDialog();
            DialogResult dialogResult = fRename.DialogResult;
            if (dialogResult == DialogResult.OK || dialogResult == DialogResult.Yes)
            {
                _lyrTo.Name = fRename.txtRename.Text;
                Refresh();
            }
        }
    }
}

实例下载地址

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警