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.
378 lines
16 KiB
378 lines
16 KiB
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; } |
|
} |
|
}
|
|
|