年度变更建库软件5.0版本
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.

379 lines
16 KiB

4 months ago
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.AE;
using KGIS.Framework.Maps;
using KGIS.Framework.Utils;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using UIShell.OSGi;
namespace Kingo.PluginServiceInterface
{
public class ShowMaskHelper
{
public AxMapControl axMapControl;
private OutLine outLine;
public static IGeometry outLineGeomery;
public void ShowAllMask(AxMapControl mulitAxMapControl, IGeometry currentGeo)
{
ShowMask(currentGeo);
axMapControl = mulitAxMapControl;
//IUcMulitMapControlHelper ucMulitMapControlHelper = BundleRuntime.Instance.GetFirstOrDefaultService<IUcMulitMapControlHelper>();
//axMapControl = ucMulitMapControlHelper.GetUcMapControl();
ShowMask(currentGeo);
}
public void ShowBorderMask()
{
IFeatureCursor pFeatureCursor = null;
IFeature f = null;
IEnvelope currentFeatureEnvelope = null;
IWorkspaceAPI s_WsAPI = null;
IFeatureClassAPI featureClassAPI = null;
try
{
axMapControl.ActiveView.GraphicsContainer.DeleteAllElements();
outLine = new OutLine();
InitOutLine();
outLineGeomery = GetGeometry(outLine);
DrawBaseGraph(true, outLineGeomery, 150, 150, 150);
axMapControl.ActiveView.Extent = outLineGeomery.Envelope;
axMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, outLineGeomery.Envelope);
}
catch (Exception ex)
{
LogAPI.Debug("添加遮罩失败!" + ex);
return;
}
finally
{
if (f != null)
Marshal.ReleaseComObject(f);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (currentFeatureEnvelope != null)
Marshal.ReleaseComObject(currentFeatureEnvelope);
if (s_WsAPI != null)
s_WsAPI.CloseWorkspace();
if (featureClassAPI != null)
{
featureClassAPI.CloseFeatureClass();
featureClassAPI = null;
}
GC.Collect();
}
}
public void ShowMask(IGeometry currentGeo, bool isUpdateView = true)
{
if (axMapControl == null) return;
IFeatureCursor pFeatureCursor = null;
IFeature f = null;
IEnvelope currentFeatureEnvelope = null;
IWorkspaceAPI s_WsAPI = null;
IFeatureClassAPI featureClassAPI = null;
try
{
outLine = new OutLine();
InitOutLine();
outLineGeomery = GetGeometry(outLine);
if (outLineGeomery == null) return;
axMapControl.ActiveView.GraphicsContainer.DeleteAllElements();
currentFeatureEnvelope = currentGeo.Envelope;
double xmin = currentFeatureEnvelope.XMin;
double xmax = currentFeatureEnvelope.XMax;
double ymin = currentFeatureEnvelope.YMin;
double ymax = currentFeatureEnvelope.YMax;
currentFeatureEnvelope.XMin = xmin - (xmax - xmin) / 2.0;
currentFeatureEnvelope.XMax = xmax + (xmax - xmin) / 2.0;
currentFeatureEnvelope.YMin = ymin - (ymax - ymin) / 2.0;
currentFeatureEnvelope.YMax = ymax + (ymax - ymin) / 2.0;
IPointCollection poly = new PolygonClass();
poly.AddPoint(new PointClass() { X = currentFeatureEnvelope.XMin, Y = currentFeatureEnvelope.YMax });
poly.AddPoint(new PointClass() { X = currentFeatureEnvelope.XMax, Y = currentFeatureEnvelope.YMax });
poly.AddPoint(new PointClass() { X = currentFeatureEnvelope.XMax, Y = currentFeatureEnvelope.YMin });
poly.AddPoint(new PointClass() { X = currentFeatureEnvelope.XMin, Y = currentFeatureEnvelope.YMin });
poly.AddPoint(new PointClass() { X = currentFeatureEnvelope.XMin, Y = currentFeatureEnvelope.YMax });
IPolygon pPolygon = (IPolygon)poly;
IGeometry resultGeometry = FeatureAPI.Difference(outLineGeomery, pPolygon);
DrawBaseGraph(isUpdateView, resultGeometry, 150, 150, 150);
if(isUpdateView)
{
axMapControl.ActiveView.Extent = currentFeatureEnvelope;
axMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, currentFeatureEnvelope);
}
}
catch (Exception ex)
{
LogAPI.Debug("添加遮罩失败!" + ex);
return;
}
finally
{
if (f != null)
Marshal.ReleaseComObject(f);
if (pFeatureCursor != null)
Marshal.ReleaseComObject(pFeatureCursor);
if (currentFeatureEnvelope != null)
Marshal.ReleaseComObject(currentFeatureEnvelope);
if (s_WsAPI != null)
s_WsAPI.CloseWorkspace();
if (featureClassAPI != null)
{
featureClassAPI.CloseFeatureClass();
featureClassAPI = null;
}
GC.Collect();
}
}
private IElement DrawBaseGraph(bool isUpdateView, IGeometry geoDraw, int R = 255, int G = 0, int B = 0)
{
if (geoDraw == null) return null;
try
{
IElement result = null;
IGraphicsContainer iGraphicsContainer = null;
IElement CameraPointElm = null; // axMapControl.ActiveView.GraphicsContainer.Next();
if (isUpdateView)
{
while ((CameraPointElm = axMapControl.ActiveView.GraphicsContainer.Next()) != null)
{
if ((CameraPointElm as IElementProperties).Name == "BaseElement")
break;
}
}
if (CameraPointElm == null)
{
CameraPointElm = new GroupElementClass();
(CameraPointElm as IElementProperties).Name = "BaseElement";
axMapControl.ActiveView.GraphicsContainer.AddElement(CameraPointElm, 2);
}
(CameraPointElm as IGroupElement).ClearElements();
//替换Env改动---无用
//IMapControl2 axMapDraw = Env.Instance.KMap.HookHelper.Hook as IMapControl2;
// 获取IRGBColor接口
IRgbColor color = new RgbColor();
// 设置颜色属性
color.Red = R;
color.Green = G;
color.Blue = B;
switch (geoDraw.GeometryType)
{
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint:
result = new MarkerElementClass();
IMarkerSymbol symbol = new SimpleMarkerSymbolClass();
symbol.Color = color;
symbol.Size = 10;
(result as IMarkerElement).Symbol = symbol;
result.Geometry = geoDraw;
break;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon:
result = new KGIS.Framework.Maps.PolygonElement() { Opacity = 100 };
// 获取ILine符号接口
ILineSymbol lineSymbol = new SimpleLineSymbol();
// 设置线符号属
lineSymbol.Width = 2;
ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
simpleFillSymbol.Color = color;
IRgbColor colorLine = new RgbColor();
colorLine.Red = 0;
colorLine.Green = 0;
colorLine.Blue = 0;
lineSymbol.Color = colorLine;
// 设置填充符号属性
simpleFillSymbol.Outline = lineSymbol;
simpleFillSymbol.Style = ESRI.ArcGIS.Display.esriSimpleFillStyle.esriSFSSolid;//esriSimpleFillStyle.esriSFSSolid;
(result as IFillShapeElement).Symbol = simpleFillSymbol;
result.Geometry = geoDraw;
break;
case ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline:
result = new LineElementClass();
// 获取ILine符号接口
ILineSymbol outline = new SimpleLineSymbol();
// 设置线符号属
outline.Width = 3;
outline.Color = color;
(outline as SimpleLineSymbol).Style = ESRI.ArcGIS.Display.esriSimpleLineStyle.esriSLSSolid;
(result as ILineElement).Symbol = outline;
result.Geometry = geoDraw;
break;
default:
break;
}
(CameraPointElm as IGroupElement).AddElement(result);
if (iGraphicsContainer != null)
{
iGraphicsContainer.AddElement(result, 0);
}
axMapControl.ActiveView.Refresh();
return result;
}
catch (Exception ex)
{
LogAPI.Debug("执行绘制遮罩方法时异常:" + ex);
return null;
}
}
private IGeometry GetGeometry(OutLine reg)
{
if (reg == null) return null;
ArrayList result = new ArrayList();
try
{
result.Add((byte)1);//顺序
result.AddRange(BitConverter.GetBytes(3));//类型 面
result.AddRange(BitConverter.GetBytes(1));//环数
ArrayList jmdArray = new ArrayList();
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY));
//上边
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxY));
//右边
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxY));
//下边
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MaxX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY));
//首尾相连
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinX));
jmdArray.AddRange(BitConverter.GetBytes((double)reg.MinY));
result.AddRange(BitConverter.GetBytes(jmdArray.Count / 16));
result.AddRange(jmdArray);
byte[] wkb = (byte[])result.ToArray(typeof(byte));
IGeometryFactory3 factory = new GeometryEnvironment() as IGeometryFactory3;
IGeometry geom;
int countin = wkb.GetLength(0);
factory.CreateGeometryFromWkbVariant(wkb, out geom, out countin);
if ((geom as IArea).Area < 0)
{
IPolygon pPolygon = geom as IPolygon;
pPolygon.ReverseOrientation();
}
if (geom == null) return null;
return geom;
}
catch (Exception ex)
{
LogAPI.Debug("获取分幅后的图斑形状异常:" + ex);
return null;
}
}
private void InitOutLine()
{
IEnvelope CurrentEnvelope = null;
List<ILayer> MapLayerList = MapsManager.Instance.MapService.GetAllLayerInMap<ILayer>();
List<ILayer> SelectLayerList = new List<ILayer>();
List<IGeometry> geometries = new List<IGeometry>();
try
{
foreach (ILayer item in MapLayerList)
{
if ((item as RasterLayer) != null)
{
SelectLayerList.Add(item);
//确保最大范围
if (CurrentEnvelope == null)
CurrentEnvelope = item.AreaOfInterest;
else
CurrentEnvelope.Union(item.AreaOfInterest);
}
else if ((item as KOTilesLayer) != null)
{
SelectLayerList.Add(item);
//确保最大范围
if (CurrentEnvelope == null)
CurrentEnvelope = item.AreaOfInterest;
else
CurrentEnvelope.Union(item.AreaOfInterest);
}
}
if (SelectLayerList.Count == 0)
{
foreach (ILayer item in MapLayerList)
{
if ((item as IFeatureLayer) != null)
{
SelectLayerList.Add(item);
//确保最大范围
if (CurrentEnvelope == null)
CurrentEnvelope = item.AreaOfInterest;
else
{
IEnvelope env = item.AreaOfInterest;
//if (env != null)
// CurrentEnvelope.Union(env);
if (env.XMin < 0 || env.YMin < 0) continue;
if (env.XMax > CurrentEnvelope.XMax)
{
CurrentEnvelope.XMax = env.XMax;
}
if (env.YMax > CurrentEnvelope.YMax)
{
CurrentEnvelope.YMax = env.YMax;
}
if (env.XMin < CurrentEnvelope.XMin)
{
CurrentEnvelope.XMin = env.XMin;
}
if (env.YMin < CurrentEnvelope.YMin)
{
CurrentEnvelope.YMin = env.YMin;
}
}
}
}
}
IEnvelope envelope = CurrentEnvelope;
if (envelope == null) return;
outLine.MinX = envelope.XMin < 0 ? 0 : envelope.XMin;
outLine.MaxX = envelope.XMax;
outLine.MinY = envelope.YMin < 0 ? 0 : envelope.YMin;
outLine.MaxY = envelope.YMax;
}
catch (Exception ex)
{
LogAPI.Debug("初始化作业区生成页面值失败:" + ex);
return;
}
}
}
public class OutLine
{
public double MaxX { get; set; }
public double MaxY { get; set; }
public double MinX { get; set; }
public double MinY { get; set; }
}
}