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 m_Layers; public override void OnClick() { if (m_hookHelper == null) return; IDataCatalogService _DataCatalog = BundleRuntime.Instance.GetFirstOrDefaultService(); 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(); } 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 AllLayers = rootLayer.GetAllItem(); if (layerQS != null) GroupLayerInfo = AllLayers.FirstOrDefault(f => f.LayerName == layerQS.Name); } List ListLayers = new List(); 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("异常信息结束。"); } } /// /// 保存图层样式至配置文件 /// /// 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("异常信息结束"); } } } }