You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							457 lines
						
					
					
						
							23 KiB
						
					
					
				
			
		
		
	
	
							457 lines
						
					
					
						
							23 KiB
						
					
					
				using ESRI.ArcGIS.Carto; | 
						|
using ESRI.ArcGIS.Controls; | 
						|
using ESRI.ArcGIS.esriSystem; | 
						|
using ESRI.ArcGIS.Geodatabase; | 
						|
using ESRI.ArcGIS.ADF; | 
						|
using ESRI.ArcGIS.Geometry; | 
						|
using ESRI.ArcGIS.Display; | 
						|
using KGIS.Framework.AE; | 
						|
using KGIS.Framework.AE.ExtensionMethod; | 
						|
using KGIS.Framework.Maps; | 
						|
using KGIS.Framework.OpenData.Control; | 
						|
using KGIS.Framework.OpenData.Filter; | 
						|
using KGIS.Framework.OpenData.InterFace; | 
						|
using KGIS.Framework.Platform; | 
						|
using KGIS.Framework.Utils; | 
						|
using KGIS.Framework.Utils.Helper; | 
						|
using System; | 
						|
using System.Collections.Generic; | 
						|
using System.Windows.Forms; | 
						|
using System.Drawing; | 
						|
using System.Xml.Linq; | 
						|
using System.Xml; | 
						|
using Kingo.PluginServiceInterface; | 
						|
using UIShell.OSGi; | 
						|
using System.Linq; | 
						|
 | 
						|
namespace Kingo.Plugin.MapView.Commands | 
						|
{ | 
						|
    //[PathAttribute("Kingo.Plugin.MapView.Commands.CmdAddLayer")] | 
						|
    public class CmdAddLayer : BaseMapMenuCommand | 
						|
    { | 
						|
        private ILayerFactoryHelper m_LayerFactoryHelper; | 
						|
        private List<ILayer> m_Layers; | 
						|
        public override void OnClick() | 
						|
        { | 
						|
            if (m_hookHelper == null) | 
						|
                return; | 
						|
            IDataCatalogService _DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService<IDataCatalogService>(); | 
						|
            if (_DataCatalog == null) return; | 
						|
            try | 
						|
            { | 
						|
                object layer = m_hookHelper.GetCustomProperty(); | 
						|
                if ((!(layer is IGroupLayer) && !(layer is IMap)) || layer == null) | 
						|
                { | 
						|
                    layer = m_hookHelper.FocusMap; | 
						|
                } | 
						|
                OpenDataDialog pDialog = new OpenDataDialog(); | 
						|
                ISpatialDataObjectFilter pOFilter; | 
						|
                pOFilter = new FilterDatasetsAndLayers(); | 
						|
                pDialog.AddFilter(pOFilter, true); | 
						|
                pDialog.Title = "选择添加的数据"; | 
						|
                pDialog.AllowMultiSelect = true; | 
						|
                pDialog.RestoreLocation = true; | 
						|
                pDialog.StartLocation = pDialog.FinalLocation; | 
						|
                DialogResult dialogResult = pDialog.ShowDialog(); | 
						|
                if (dialogResult == DialogResult.OK && pDialog.Selection.Count != 0) | 
						|
                { | 
						|
                    if (m_Layers == null) | 
						|
                    { | 
						|
                        m_Layers = new List<ILayer>(); | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        m_Layers.Clear(); | 
						|
                    } | 
						|
                    ILayer layerQS = MapsManager.Instance.MapService.GetGroupLayer((layer as ILayerGeneralProperties).LayerDescription);//获取参考数据图层组 | 
						|
                    LayerCfg GroupLayerInfo = null; | 
						|
                    if (_DataCatalog != null) | 
						|
                    { | 
						|
                        _DataCatalog.GetNodeByLayer(layerQS); | 
						|
                        LayerCfg rootLayer = _DataCatalog.CurrentLayers as LayerCfg; | 
						|
                        List<LayerCfg> AllLayers = rootLayer.GetAllItem(); | 
						|
                        if (layerQS != null) | 
						|
                        { | 
						|
                            GroupLayerInfo = AllLayers.FirstOrDefault(f => f.LayerName == layerQS.Name); | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            GroupLayerInfo = AllLayers.FirstOrDefault(f => f.LayerName == (layer as GroupLayerClass).Name); | 
						|
                        } | 
						|
                    } | 
						|
                    List<ILayer> ListLayers = new List<ILayer>(); | 
						|
                    foreach (ISpatialDataObject distObj in pDialog.Selection) | 
						|
                    { | 
						|
                        if (!string.IsNullOrWhiteSpace(distObj.Name) && distObj.Name.ToLower().EndsWith(".kotiles")) | 
						|
                        { | 
						|
                            KOTilesLayer ko = KOTilesLayer.CreateInstance(distObj.FullName); | 
						|
                            ko.Name = distObj.Name.ToLower().Replace(".kotiles", ""); | 
						|
                            if (layer is IGroupLayer) | 
						|
                            { | 
						|
                                //(layer as IGroupLayer).Add(ko); | 
						|
                                _DataCatalog.AddLayer(ko, GroupLayerInfo); | 
						|
                            } | 
						|
                            else if (layer is IMap) | 
						|
                            { | 
						|
                                _DataCatalog.AddLayer(ko, null); | 
						|
                                //(layer as IMap).AddLayer(ko); | 
						|
                            } | 
						|
                            ListLayers.Add(ko); | 
						|
                        } | 
						|
                        else if (distObj.DatasetType == esriDatasetType.esriDTTable) | 
						|
                        { | 
						|
 | 
						|
                        } | 
						|
                        else if (distObj.DatasetName == null && distObj.FullName.ToLower().EndsWith(".lyr")) | 
						|
                        { | 
						|
                            IMapControl2 myAddLayerMap = new MapControlClass(); | 
						|
                            myAddLayerMap.AddLayerFromFile(distObj.FullName, 0); | 
						|
                            ILayer pLayer = myAddLayerMap.get_Layer(0); | 
						|
                            if (layer is IGroupLayer) | 
						|
                            { | 
						|
                                (layer as IGroupLayer).Add(pLayer); | 
						|
                            } | 
						|
                            else if (layer is IMap) | 
						|
                            { | 
						|
                                (layer as IMap).AddLayer(pLayer); | 
						|
                            } | 
						|
                            SaveLayerStyleToConfig(pLayer); | 
						|
                            ListLayers.Add(pLayer); | 
						|
                        } | 
						|
                        else | 
						|
                        { | 
						|
                            if (m_LayerFactoryHelper == null) | 
						|
                                m_LayerFactoryHelper = new LayerFactoryHelperClass(); | 
						|
                            //层厂帮手创建从名字对象层的正确类型返回枚举的层 | 
						|
                            IEnumLayer pEnumLayer = m_LayerFactoryHelper.CreateLayersFromName((distObj.DatasetName as IName)); | 
						|
                            ILayer pLayer; | 
						|
                            pEnumLayer.Reset(); | 
						|
                            //通过循环的枚举和添加的每个层 | 
						|
                            while ((pLayer = pEnumLayer.Next()) != null) | 
						|
                            { | 
						|
                                //判断坐标参考是否与当前工程坐标参考一致 | 
						|
                                try | 
						|
                                { | 
						|
                                    IGeoDataset geoDataset = null; | 
						|
                                    if ((pLayer as IFeatureLayer) != null && (pLayer as IFeatureLayer).FeatureClass != null) | 
						|
                                    { | 
						|
                                        geoDataset = (pLayer as IFeatureLayer).FeatureClass as IGeoDataset; | 
						|
                                    } | 
						|
                                    else if ((pLayer as IRasterLayer) != null && (pLayer as IRasterLayer).Raster != null) | 
						|
                                    { | 
						|
                                        geoDataset = (pLayer as IRasterLayer).Raster as IGeoDataset; | 
						|
                                    } | 
						|
                                    if (geoDataset != null && geoDataset.SpatialReference != null && m_hookHelper.FocusMap.SpatialReference != null) | 
						|
                                    { | 
						|
                                        if (string.IsNullOrEmpty(m_hookHelper.FocusMap.SpatialReference.Name) || m_hookHelper.FocusMap.SpatialReference.Name.ToUpper().Equals("UNKNOWN") || m_hookHelper.FocusMap.SpatialReference.FactoryCode == 0) | 
						|
                                        { | 
						|
                                            m_hookHelper.FocusMap.SpatialReference = geoDataset.SpatialReference; | 
						|
                                        } | 
						|
                                        if (geoDataset != null && !GeoDBAPI.SpatialReferenceCompare(geoDataset.SpatialReference, m_hookHelper.FocusMap.SpatialReference)) | 
						|
                                        { | 
						|
                                            m_Layers.Add(pLayer); | 
						|
                                            ListLayers.Add(pLayer); | 
						|
                                            continue; | 
						|
                                        } | 
						|
                                    } | 
						|
                                } | 
						|
                                catch (Exception ex1) | 
						|
                                { | 
						|
                                    LogAPI.Debug("在添加图层期间 通过循环的枚举和添加的每个层 时发生异常,异常信息如下:"); | 
						|
                                    LogAPI.Debug(ex1); | 
						|
                                    LogAPI.Debug("异常信息结束。"); | 
						|
                                } | 
						|
                                if (layer is IGroupLayer) | 
						|
                                { | 
						|
                                    //IGroupLayer groupLayer = (layer as IGroupLayer); | 
						|
                                    LayerCfg layerInfo3 = new LayerCfg(); | 
						|
                                    if (GroupLayerInfo != null) | 
						|
                                    { | 
						|
                                        if (distObj.FullName.ToLower().EndsWith(".img") && pLayer is IRasterLayer) | 
						|
                                        { | 
						|
                                            IRasterLayer rasterlayer = pLayer as IRasterLayer; | 
						|
                                            IRasterStretch rst = rasterlayer.Renderer as IRasterStretch; | 
						|
                                            if (rst != null) | 
						|
                                            { | 
						|
                                                RgbColorClass rgb = new RgbColorClass(); | 
						|
                                                rgb.NullColor = true; | 
						|
                                                rst.Background = true; | 
						|
                                                rst.BackgroundColor = rgb; | 
						|
                                                rst.StretchType = esriRasterStretchTypesEnum.esriRasterStretch_NONE; | 
						|
                                            } | 
						|
                                            //(layer as IGroupLayer).Add(rasterlayer); | 
						|
                                            _DataCatalog.AddLayer(rasterlayer, GroupLayerInfo); | 
						|
                                            layerInfo3 = GroupLayerInfo.Layers.FirstOrDefault(x => x.FcName == rasterlayer.Name); | 
						|
                                            ListLayers.Add(rasterlayer); | 
						|
                                        } | 
						|
                                        else | 
						|
                                        { | 
						|
                                            _DataCatalog.AddLayer(pLayer, GroupLayerInfo); | 
						|
                                            layerInfo3 = GroupLayerInfo.Layers.FirstOrDefault(x => x.FcName == pLayer.Name); | 
						|
                                            ListLayers.Add(pLayer); | 
						|
                                        } | 
						|
                                    } | 
						|
                                    if (layerInfo3 != null) | 
						|
                                    { | 
						|
                                        layerInfo3.AbsolutePathType = "AddLayerWay";//标记为外部路径数据 | 
						|
                                        layerInfo3.AbsolutePath = layerInfo3.FcPath; | 
						|
                                    } | 
						|
                                } | 
						|
                                else if (layer is IMap) | 
						|
                                { | 
						|
                                    //(layer as IMap).AddLayer(pLayer); | 
						|
                                    _DataCatalog.AddLayer(pLayer, null); | 
						|
                                    ListLayers.Add(pLayer); | 
						|
                                } | 
						|
                            } | 
						|
                            if (m_Layers != null && m_Layers.Count > 0) | 
						|
                            { | 
						|
                                DialogResult dialogResult2 = MessageHelper.ShowYesNoAndTips("图层坐标系与工程坐标系不一致,是否继续添加?"); | 
						|
                                if (dialogResult2 == DialogResult.Yes) | 
						|
                                { | 
						|
                                    foreach (ILayer item in m_Layers) | 
						|
                                    { | 
						|
                                        if (layer is IGroupLayer) | 
						|
                                        { | 
						|
                                            if (distObj.FullName.ToLower().EndsWith(".img") && pLayer is IRasterLayer) | 
						|
                                            { | 
						|
                                                IRasterLayer rasterlayer = pLayer as IRasterLayer; | 
						|
                                                IRasterStretch rst = rasterlayer.Renderer as IRasterStretch; | 
						|
                                                if (rst != null) | 
						|
                                                { | 
						|
                                                    RgbColorClass rgb = new RgbColorClass(); | 
						|
                                                    rgb.NullColor = true; | 
						|
                                                    rst.Background = true; | 
						|
                                                    rst.BackgroundColor = rgb; | 
						|
                                                    rst.StretchType = esriRasterStretchTypesEnum.esriRasterStretch_NONE; | 
						|
                                                } | 
						|
                                                (layer as IGroupLayer).Add(rasterlayer); | 
						|
 | 
						|
                                                ListLayers.Add(rasterlayer); | 
						|
                                            } | 
						|
                                            else | 
						|
                                            { | 
						|
                                                //(layer as IGroupLayer).Add(item); | 
						|
                                                _DataCatalog.AddLayer(item, GroupLayerInfo); | 
						|
                                                ListLayers.Add(item); | 
						|
                                            } | 
						|
                                        } | 
						|
                                        else if (layer is IMap) | 
						|
                                        { | 
						|
                                            //(layer as IMap).AddLayer(item); | 
						|
                                            _DataCatalog.AddLayer(item, null); | 
						|
                                            ListLayers.Add(item); | 
						|
                                        } | 
						|
                                    } | 
						|
                                } | 
						|
                            } | 
						|
                        } | 
						|
                    } | 
						|
                    if (_DataCatalog != null) | 
						|
                    { | 
						|
                        if (GroupLayerInfo != null && GroupLayerInfo.Layers.Count > 0) | 
						|
                            GroupLayerInfo.Expanded = true; | 
						|
                        _DataCatalog.UpdateTree(); | 
						|
                    } | 
						|
                    //Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "RefreshLayer" }); | 
						|
                    Platform.Instance.SendMsg(new KGIS.Framework.Utils.Interface.NotifyMsgPackage() { MsgType = "SaveProjectForNoEditor" }); | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                MessageHelper.ShowError(string.Format("添加图层失败!{0}", ex.Message)); | 
						|
                LogAPI.Debug("添加图层时发生异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("异常信息结束。"); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
        /// <summary> | 
						|
        /// 保存图层样式至配置文件 | 
						|
        /// </summary> | 
						|
        /// <param name="pLayer"></param> | 
						|
        private void SaveLayerStyleToConfig(ILayer pLayer) | 
						|
        { | 
						|
 | 
						|
            try | 
						|
            { | 
						|
                IStyleGalleryClass symbologyStyleClass = null; | 
						|
                ISymbol symbol = null; | 
						|
                IFillSymbol fillSymbol = null; | 
						|
                IFeatureLayer2 featureLayer = pLayer as IFeatureLayer2; | 
						|
                if (featureLayer != null) | 
						|
                { | 
						|
                    esriGeometryType geometryType = featureLayer.ShapeType; | 
						|
 | 
						|
                    switch (geometryType) | 
						|
                    { | 
						|
                        case esriGeometryType.esriGeometryPoint: | 
						|
                            symbologyStyleClass = new MarkerSymbolStyleGalleryClassClass(); | 
						|
                            break; | 
						|
                        case esriGeometryType.esriGeometryPolyline: | 
						|
                            symbologyStyleClass = new LineSymbolStyleGalleryClassClass(); | 
						|
                            break; | 
						|
                        case esriGeometryType.esriGeometryPolygon: | 
						|
                            symbologyStyleClass = new FillSymbolStyleGalleryClassClass(); | 
						|
                            break; | 
						|
                    } | 
						|
                    ISimpleRenderer simpleRenderer = (featureLayer as IGeoFeatureLayer).Renderer as ISimpleRenderer; | 
						|
                    if (simpleRenderer != null) | 
						|
                    { | 
						|
                        symbol = simpleRenderer.Symbol; | 
						|
                    } | 
						|
                    else | 
						|
                    { | 
						|
                        symbol = GetDefaultSymbol(geometryType); | 
						|
                    } | 
						|
                    fillSymbol = (symbol as IFillSymbol); | 
						|
 | 
						|
                } | 
						|
 | 
						|
                string appLayerConfigspath = System.IO.Path.Combine((MapsManager.Instance.CurrProjectInfo as ProjectInfo).ProjDir, "AppLayerConfigs.xml"); | 
						|
 | 
						|
                if (!System.IO.File.Exists(appLayerConfigspath)) | 
						|
                { | 
						|
                    XmlDataDocument xml = new XmlDataDocument(); | 
						|
                    XmlElement layersElement = xml.CreateElement("Layers"); | 
						|
                    xml.AppendChild(layersElement); | 
						|
                    xml.Save(appLayerConfigspath); | 
						|
                } | 
						|
                XDocument xDoc = XDocument.Load(appLayerConfigspath); | 
						|
                XElement element = xDoc.Element("Layers"); | 
						|
                bool isHave = false; | 
						|
 | 
						|
                IFeatureLayer feature = pLayer as IFeatureLayer; | 
						|
                string layerNameStr = (feature as IDataset).BrowseName; | 
						|
                string layerCaptionStr = feature.Name; | 
						|
                System.Drawing.Color fillColor = Converter.FromRGBColor(fillSymbol.Color as IRgbColor); | 
						|
                System.Drawing.Color borderColor = Converter.FromRGBColor(fillSymbol.Outline.Color as IRgbColor); | 
						|
                System.Drawing.Color lableColor = ColorTranslator.FromHtml("#FF000000"); | 
						|
                if (element != null) | 
						|
                { | 
						|
                    foreach (var item in element.Elements("Layer")) | 
						|
                    { | 
						|
                        if (item.Attribute("LayerName").Value == layerNameStr) | 
						|
                        { | 
						|
                            isHave = true; | 
						|
                            item.SetAttributeValue("LayerName", layerNameStr); | 
						|
                            item.SetAttributeValue("LayerCaption", layerCaptionStr); | 
						|
                            item.SetAttributeValue("LayerBorderStyle", "0"); | 
						|
                            item.SetAttributeValue("LayerBorderWidth", "1"); | 
						|
                            item.SetAttributeValue("LayerFillColor", System.Windows.Media.Color.FromArgb(fillColor.A, fillColor.R, fillColor.G, fillColor.B)); | 
						|
                            item.SetAttributeValue("LayerBorderColor", System.Windows.Media.Color.FromArgb(borderColor.A, borderColor.R, borderColor.G, borderColor.B)); | 
						|
                            item.SetAttributeValue("LayerLableColor", System.Windows.Media.Color.FromArgb(lableColor.A, lableColor.R, lableColor.G, lableColor.B)); | 
						|
                            item.SetAttributeValue("LayerLableName", ""); | 
						|
                            item.SetAttributeValue("LayyerGroup", ""); | 
						|
 | 
						|
                            break; | 
						|
                        } | 
						|
                    } | 
						|
                } | 
						|
                if (isHave == false) | 
						|
                { | 
						|
                    XElement xLayer = new XElement("Layer"); | 
						|
 | 
						|
                    //图层名 | 
						|
                    XAttribute layerName = new XAttribute("LayerName", layerNameStr); | 
						|
                    //图层别名 | 
						|
                    XAttribute layerCaption = new XAttribute("LayerCaption", layerCaptionStr); | 
						|
                    //边框样式 | 
						|
                    XAttribute layerBorderStyle = new XAttribute("LayerBorderStyle", "0"); | 
						|
                    //边框宽度 | 
						|
                    XAttribute layerBorderWidth = new XAttribute("LayerBorderWidth", "1"); | 
						|
 | 
						|
                    //填充颜色 | 
						|
                    XAttribute layerFillColor = new XAttribute("LayerFillColor", System.Windows.Media.Color.FromArgb(fillColor.A, fillColor.R, fillColor.G, fillColor.B)); | 
						|
                    //边框颜色 | 
						|
                    XAttribute layerBorderColor = new XAttribute("LayerBorderColor", System.Windows.Media.Color.FromArgb(borderColor.A, borderColor.R, borderColor.G, borderColor.B)); | 
						|
                    //标签颜色 | 
						|
                    XAttribute layerLableColor = new XAttribute("LayerLableColor", System.Windows.Media.Color.FromArgb(lableColor.A, lableColor.R, lableColor.G, lableColor.B)); | 
						|
 | 
						|
                    XAttribute layerLableName = new XAttribute("LayerLableName", ""); | 
						|
                    xLayer.Add(layerName, layerCaption, layerBorderStyle, layerBorderWidth, layerFillColor, layerBorderColor, layerLableColor, layerLableName); | 
						|
 | 
						|
                    element.Add(xLayer); | 
						|
                } | 
						|
                xDoc.Save(appLayerConfigspath); | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("保存图层样式配置失败:" + ex); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
 | 
						|
        private ISymbol GetDefaultSymbol(esriGeometryType geometryType) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
                ISymbol result = null; | 
						|
                IRgbColor rgbColor = new RgbColorClass(); | 
						|
                rgbColor.Red = 184; | 
						|
                rgbColor.Green = 242; | 
						|
                rgbColor.Blue = 200; | 
						|
                switch (geometryType) | 
						|
                { | 
						|
                    case esriGeometryType.esriGeometryPoint: | 
						|
                        result = (new SimpleMarkerSymbolClass | 
						|
                        { | 
						|
                            Color = rgbColor, | 
						|
                            Style = esriSimpleMarkerStyle.esriSMSCircle | 
						|
                        } as ISymbol); | 
						|
                        goto IL_B3; | 
						|
                    case esriGeometryType.esriGeometryMultipoint: | 
						|
                        goto IL_B3; | 
						|
                    case esriGeometryType.esriGeometryPolyline: | 
						|
                        break; | 
						|
                    case esriGeometryType.esriGeometryPolygon: | 
						|
                        result = (new SimpleFillSymbolClass | 
						|
                        { | 
						|
                            Color = rgbColor, | 
						|
                            Style = esriSimpleFillStyle.esriSFSSolid | 
						|
                        } as ISymbol); | 
						|
                        goto IL_B3; | 
						|
                    default: | 
						|
                        if (geometryType != esriGeometryType.esriGeometryLine) | 
						|
                        { | 
						|
                            goto IL_B3; | 
						|
                        } | 
						|
                        break; | 
						|
                } | 
						|
                result = (new SimpleLineSymbolClass | 
						|
                { | 
						|
                    Color = rgbColor, | 
						|
                    Width = 1.0, | 
						|
                    Style = esriSimpleLineStyle.esriSLSSolid | 
						|
                } as ISymbol); | 
						|
            IL_B3: | 
						|
                return result; | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug(ex.Message); | 
						|
            } | 
						|
            return null; | 
						|
        } | 
						|
 | 
						|
        public override void OnCreate(object Hook) | 
						|
        { | 
						|
            try | 
						|
            { | 
						|
 | 
						|
                if (m_hookHelper == null) | 
						|
                { | 
						|
                    m_hookHelper = new HookHelper(); | 
						|
                    m_hookHelper.Hook = Hook; | 
						|
                } | 
						|
            } | 
						|
            catch (Exception ex) | 
						|
            { | 
						|
                LogAPI.Debug("加载 添加图层 命令时发生异常,异常信息如下:"); | 
						|
                LogAPI.Debug(ex); | 
						|
                LogAPI.Debug("异常信息结束"); | 
						|
            } | 
						|
        } | 
						|
 | 
						|
    } | 
						|
}
 | 
						|
 |