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.
1193 lines
64 KiB
1193 lines
64 KiB
using ESRI.ArcGIS.Geometry; |
|
using KGIS.Framework.AE; |
|
using KGIS.Framework.AE.GPHelper; |
|
using KGIS.Framework.Utils; |
|
using KGIS.Framework.Utils.ExtensionMethod; |
|
using Kingo.Plugin.EngineEditor.Model; |
|
using Kingo.PluginServiceInterface; |
|
using Kingo.PluginServiceInterface.Helper; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Reflection; |
|
|
|
namespace Kingo.Plugin.EngineEditor.helper |
|
{ |
|
public static class BoundaryRepairHelper |
|
{ |
|
public static IProjectedCoordinateSystem _SpatialReference { get; set; } |
|
|
|
public static void Execute(List<RepairEntity> repairs, List<int> UnionList) |
|
{ |
|
List<ReferenceEntity> ListDLTB = new List<ReferenceEntity>();//年末数据库 |
|
List<RepairEntity> RepairLayerZDK = new List<RepairEntity>();//边界修复多部件图斑新增的子地块 |
|
try |
|
{ |
|
#region 生成年末库 |
|
for (int i = repairs.Count - 1; i >= 0; i--) |
|
{ |
|
if (repairs[i].Geometry == null) repairs[i].Geometry = ConvertWKTAndSetSpatialRef(repairs[i].WKT, _SpatialReference); |
|
foreach (var item in repairs[i].ListReference) |
|
{ |
|
ReferenceEntity dLTB_NMK = ListDLTB.FirstOrDefault(x => x.BSM == item.BSM); |
|
if (dLTB_NMK == null) |
|
{ |
|
ReferenceEntity dLTB = DeepCopyByReflect(item); |
|
dLTB.RefGeometry = ConvertWKTAndSetSpatialRef(dLTB.RefWKT ?? GeometryConvertHelper.ConvertIGeoemtryToWKT(item.RefGeometry), _SpatialReference); |
|
ListDLTB.Add(dLTB); |
|
} |
|
} |
|
} |
|
#endregion |
|
|
|
#region 面积小于30平的,直接和相邻共边最长的图形合并,合并一整个子地块,再进行边界修复 |
|
for (int i = repairs.Count - 1; i >= 0; i--) |
|
{ |
|
string dlbm = repairs[i].DLBM; |
|
if (repairs[i].Geometry == null) repairs[i].Geometry = ConvertWKTAndSetSpatialRef(repairs[i].WKT, _SpatialReference); |
|
if (repairs[i].Geometry == null || repairs[i].Geometry.IsEmpty) continue; |
|
if ((repairs[i].Geometry as IArea).Area < 30) |
|
{ |
|
RepairEntity UnionZDK = null; |
|
double Unionlength = 0.00; |
|
foreach (RepairEntity currentZDK in repairs) |
|
{ |
|
if (currentZDK.JCBH == repairs[i].JCBH) continue; |
|
if (currentZDK.Geometry == null) currentZDK.Geometry = ConvertWKTAndSetSpatialRef(currentZDK.WKT, _SpatialReference); |
|
if (currentZDK.Geometry == null || currentZDK.Geometry.IsEmpty) continue; |
|
|
|
ITopologicalOperator topologicalOperator1 = currentZDK.Geometry as ITopologicalOperator; |
|
if (topologicalOperator1 == null) continue; |
|
IGeometry geometryIntersect = topologicalOperator1.Intersect(repairs[i].Geometry, esriGeometryDimension.esriGeometry1Dimension); |
|
if (geometryIntersect == null || geometryIntersect.IsEmpty) continue; |
|
IPolyline polyline = geometryIntersect as IPolyline; |
|
if (polyline == null || polyline.IsEmpty) continue; |
|
double length = FeatureAPI.LengthOfSide(currentZDK.Geometry, repairs[i].Geometry); |
|
if (length < 0.01) continue; |
|
if (length > Unionlength) |
|
{ |
|
Unionlength = length; |
|
UnionZDK = currentZDK; |
|
} |
|
} |
|
if (UnionZDK != null) |
|
{ |
|
UnionZDK.Geometry = FeatureAPI.Union(UnionZDK.Geometry, repairs[i].Geometry); |
|
UnionZDK.WKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(UnionZDK.Geometry); |
|
UnionList.Add(repairs[i].OID); |
|
repairs.RemoveAt(i); |
|
} |
|
} |
|
} |
|
#endregion |
|
|
|
foreach (RepairEntity repair in repairs) |
|
{ |
|
// 预存DLTB的Envelope(仅SHAPE非空的图斑) |
|
var dltbEnvelopes = ListDLTB.Where(jc => !string.IsNullOrEmpty(jc.RefWKT)) |
|
.Select(jc => new |
|
{ |
|
DLTB = jc, |
|
Envelope = (jc.RefGeometry?.Envelope ?? ConvertWKTAndSetSpatialRef(jc.RefWKT, _SpatialReference).Envelope) |
|
}).ToList(); |
|
var candidateDLTBs = dltbEnvelopes.Where(item => AreEnvelopesIntersecting(repair.Geometry.Envelope, item.Envelope)).Select(item => item.DLTB).ToList(); |
|
|
|
foreach (ReferenceEntity jcfeature in candidateDLTBs) |
|
{ |
|
if (string.IsNullOrEmpty(jcfeature.RefWKT)) continue;//图形为空的不参与后续图形的修复 |
|
IGeometry jcgeometry = jcfeature.RefGeometry == null ? ConvertWKTAndSetSpatialRef(jcfeature.RefWKT, _SpatialReference) : jcfeature.RefGeometry; |
|
if (FeatureAPI.IsInterSect(jcgeometry, repair.Geometry)) |
|
repair.ListReference.Add(new ReferenceEntity() |
|
{ |
|
BSM = jcfeature.BSM, |
|
DLBM = jcfeature.DLBM, |
|
CZCSXM = jcfeature.CZCSXM, |
|
RefWKT = jcfeature.RefWKT, |
|
RefGeometry = jcgeometry |
|
}); |
|
} |
|
|
|
List<ReferenceEntity> entities = ExecuteRepair(repair); |
|
if (entities == null || entities.Count <= 0) |
|
{ |
|
continue; |
|
} |
|
|
|
AddResultToAnalysisLayer(entities, ListDLTB, repairs, repair, RepairLayerZDK); |
|
} |
|
|
|
if (RepairLayerZDK != null && RepairLayerZDK.Count > 0) |
|
{ |
|
foreach (RepairEntity item in RepairLayerZDK) |
|
{ |
|
repairs.Add(item); |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
throw; |
|
} |
|
} |
|
public static List<ReferenceEntity> ExecuteRepair(RepairEntity repair) |
|
{ |
|
List<ReferenceEntity> needAddReference = new List<ReferenceEntity>(); |
|
List<ReferenceEntity> jrjReference = new List<ReferenceEntity>(); |
|
try |
|
{ |
|
if (repair == null) return null; |
|
|
|
#region 删除图形中的重复点(首位点除外) |
|
IGeometryCollection geomColl = repair.Geometry as IGeometryCollection; |
|
// 遍历所有子环(外环和内环) |
|
for (int i = 0; i < geomColl.GeometryCount; i++) |
|
{ |
|
IGeometry subGeom = geomColl.get_Geometry(i); |
|
IRing ring = subGeom as IRing; // 环是闭合的线(IRing 继承自 IPolyline) |
|
if (ring == null) continue; |
|
// 处理当前环的重复点 |
|
RemoveDuplicatePointsInRing(ring); |
|
} |
|
#endregion |
|
|
|
#region 节点套合 |
|
|
|
#region 获取待修复图形的外接矩形并向外缓冲 |
|
IEnvelope geometryEnvelope = repair.Geometry.Envelope; |
|
double xMin = geometryEnvelope.XMin; |
|
double yMin = geometryEnvelope.YMin; |
|
double xMax = geometryEnvelope.XMax; |
|
double yMax = geometryEnvelope.YMax; |
|
IPoint lowerLeft = new PointClass(); |
|
lowerLeft.PutCoords(xMin, yMin); |
|
IPoint lowerRight = new PointClass(); |
|
lowerRight.PutCoords(xMax, yMin); |
|
IPoint upperRight = new PointClass(); |
|
upperRight.PutCoords(xMin, yMax); |
|
IPoint upperLeft = new PointClass(); |
|
upperLeft.PutCoords(xMax, yMax); |
|
IPolygon triangle = new PolygonClass(); |
|
IPointCollection trianglePoints = triangle as IPointCollection; |
|
trianglePoints.AddPoint(lowerLeft); |
|
trianglePoints.AddPoint(lowerRight); |
|
trianglePoints.AddPoint(upperLeft); |
|
trianglePoints.AddPoint(upperRight); |
|
ITopologicalOperator topo = triangle as ITopologicalOperator; |
|
topo.Simplify(); |
|
IGeometry geometry = topo.Buffer(2); |
|
#endregion |
|
List<IGeometry> geometries = new List<IGeometry>(); |
|
foreach (var item in repair.ListReference) |
|
{ |
|
#region 获取变更图斑的外接矩形,向外缓冲 然后与基础库相交 |
|
IGeometry geo = FeatureAPI.InterSect(geometry, item.RefGeometry); |
|
if (geo != null && !geo.IsEmpty) |
|
{ |
|
double area = (geo as IArea).Area; |
|
if (area > 0.1) |
|
{ |
|
geometries.Add(geo); |
|
} |
|
} |
|
#endregion |
|
|
|
} |
|
repair.Geometry = PolygonBoundaryAligner.AlignPolygonBoundary(repair.Geometry, geometries, 0.1); |
|
#endregion |
|
|
|
#region 尖锐角检查与修复 |
|
List<IPoint> yspointList = null; |
|
double ysangle = 0; |
|
IGeometry restSharpGeo = null; |
|
if (!repair.Geometry.IsEmpty && SharpAngle.JudgmentSharpAngle(repair.Geometry, ref yspointList, ref ysangle)) |
|
{ |
|
IGeometry repairGeo = SharpAngle.ProcessSharpAngles(repair.Geometry, 5); |
|
repairGeo.SpatialReference = _SpatialReference; |
|
restSharpGeo = FeatureAPI.Difference(repair.Geometry, repairGeo); |
|
repair.Geometry = repairGeo; |
|
if (restSharpGeo != null && !restSharpGeo.IsEmpty) |
|
{ |
|
var area = (restSharpGeo as IArea); |
|
if (area != null && area.Area > 1) |
|
{ |
|
List<IGeometry> geometryList = FeatureAPI.DissolveGeometryByRing(restSharpGeo);//拆分多部件 |
|
foreach (IGeometry SharpGeo in geometryList) |
|
{ |
|
if (SharpGeo == null || SharpGeo.IsEmpty) continue; |
|
ReferenceEntity referenceEntity = new ReferenceEntity(); |
|
referenceEntity.BSM = $"NMK_{repair.JCBH}_{Guid.NewGuid().ToTrim().Replace("-", "")}_SharpAngle"; |
|
referenceEntity.CZCSXM = repair.CZCSXM; |
|
referenceEntity.DLBM = repair.DLBM; |
|
referenceEntity.RefWKT = PluginServiceInterface.GeometryConvertHelper.ConvertIGeoemtryToWKT(SharpGeo); |
|
referenceEntity.RefGeometry = SharpGeo; |
|
referenceEntity.Modify = true; |
|
jrjReference.Add(referenceEntity); |
|
} |
|
} |
|
} |
|
} |
|
#endregion |
|
|
|
#region 狭长/局部狭长检查与修复 |
|
if (!repair.Geometry.IsEmpty) |
|
{ |
|
var NarrowAreas = PolygonNarrowAreaChecker.CheckLocalNarrowAreas(repair.Geometry as IPolygon); |
|
if (NarrowAreas != null && NarrowAreas.Count > 0) |
|
{ |
|
foreach (var item in NarrowAreas) |
|
{ |
|
if (!FeatureAPI.IsInterSect(item, repair.Geometry)) |
|
{ |
|
repair.Geometry = FeatureAPI.Union(repair.Geometry, item); |
|
} |
|
else |
|
{ |
|
repair.Geometry = FeatureAPI.Difference(repair.Geometry, item); |
|
} |
|
} |
|
} |
|
} |
|
#endregion |
|
|
|
//尖锐角/狭长图形修复完以后,图形为空直接返回,删除当前子地块 |
|
if (repair.Geometry.IsEmpty) return repair.ListReference; |
|
|
|
#region 压盖带一个参考图形 |
|
if (repair.ListReference != null && repair.ListReference.Count == 1) |
|
{ |
|
ReferenceEntity jcdltb = repair.ListReference[0]; |
|
#region 面积相差小于1的 直接使用基础库图形 |
|
var refmj = (jcdltb.RefGeometry as IArea).Area; |
|
var geomj = (repair.Geometry as IArea).Area; |
|
if (refmj == geomj || Math.Abs(refmj - geomj) < 1) |
|
{ |
|
repair.ListReference.Add( |
|
new ReferenceEntity() |
|
{ |
|
BSM = $"NMK_{repair.JCBH}", |
|
CZCSXM = repair.CZCSXM, |
|
DLBM = repair.DLBM, |
|
RefWKT = jcdltb.RefWKT, |
|
Modify = true |
|
}); |
|
jcdltb.Modify = true; |
|
jcdltb.RefWKT = ""; |
|
jcdltb.RefGeometry = null; |
|
return repair.ListReference; |
|
} |
|
#endregion |
|
|
|
#region 图形在基础数据内部 且被动变更图斑不存在尖锐角/狭长图形 |
|
IGeometry diffGeo = FeatureAPI.Difference(jcdltb.RefGeometry, repair.Geometry); |
|
List<IGeometry> geos = FeatureAPI.DissolveGeometryByRing(diffGeo); |
|
if (geos != null && geos.Count > 0) |
|
{ |
|
bool iscontinue = true; |
|
foreach (IGeometry diff in geos) |
|
{ |
|
if (diff == null || diff.IsEmpty) continue; |
|
double area = (diff as IArea).Area; |
|
if (area < 1) |
|
{ |
|
iscontinue = false; break; |
|
} |
|
if (SharpAngle.JudgmentSharpAngle(diff, ref yspointList, ref ysangle)) |
|
{ |
|
iscontinue = false; break; |
|
} |
|
List<IPolygon> NarrowAreas = PolygonNarrowAreaChecker.CheckLocalNarrowAreas(diff as IPolygon); |
|
if (NarrowAreas != null && NarrowAreas.Count > 0) |
|
{ |
|
iscontinue = false; break; |
|
} |
|
} |
|
if (iscontinue) |
|
{ |
|
if (geos.Count == 1) |
|
{ |
|
jcdltb.RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(geos[0]); |
|
jcdltb.RefGeometry = geos[0]; |
|
jcdltb.Modify = true; |
|
} |
|
else |
|
{ |
|
IGeometry difference = FeatureAPI.Difference(jcdltb.RefGeometry, repair.Geometry); |
|
if (difference != null && !difference.IsEmpty) |
|
{ |
|
jcdltb.RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(difference); |
|
jcdltb.RefGeometry = difference; |
|
jcdltb.Modify = true; |
|
} |
|
} |
|
repair.ListReference.Add( |
|
new ReferenceEntity() |
|
{ |
|
BSM = $"NMK_{repair.JCBH}", |
|
CZCSXM = repair.CZCSXM, |
|
DLBM = repair.DLBM, |
|
RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(repair.Geometry), |
|
Modify = true |
|
}); |
|
if (jrjReference.Count > 0) |
|
{ |
|
foreach (ReferenceEntity item in repair.ListReference.FindAll(x => x.Modify && !x.BSM.Contains("NMK_"))) |
|
{ |
|
if (item.RefGeometry == null || item.RefGeometry.IsEmpty) continue; |
|
item.RefGeometry = FeatureAPI.Difference(item.RefGeometry, restSharpGeo); |
|
if (item.RefGeometry == null || item.RefGeometry.IsEmpty) continue; |
|
item.RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(item.RefGeometry); |
|
} |
|
repair.ListReference.AddRange(jrjReference); |
|
} |
|
return repair.ListReference; |
|
} |
|
} |
|
#endregion |
|
|
|
if (repair.ListReference != null && repair.ListReference.Count >= 1) |
|
{ |
|
foreach (ReferenceEntity jcfc in repair.ListReference) |
|
{ |
|
#region 与基础库相交 |
|
if (repair.Geometry.IsEmpty) break; |
|
IGeometry InterArearesult = FeatureAPI.InterSect(jcfc.RefGeometry, repair.Geometry); |
|
if (InterArearesult != null) |
|
{ |
|
if (InterArearesult == null || InterArearesult.IsEmpty) continue;//未相交到或相交为空图形的直接跳过 |
|
double area = (InterArearesult as IArea).Area; |
|
if (area < 1)//相交面积小于1的图形擦除 |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) |
|
//{ |
|
// jcfc.IsReference = true; continue; |
|
//} |
|
IGeometry result = FeatureAPI.Difference(repair.Geometry, InterArearesult); |
|
if (result != null && !result.IsEmpty) |
|
{ |
|
repair.Geometry = result; continue; |
|
} |
|
} |
|
else if (area > 1 && area < 10) |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) |
|
//{ |
|
// jcfc.IsReference = true; continue; |
|
//} |
|
//相交面积小于10且相交图形为尖锐角或者狭长图形的擦除 |
|
if (SharpAngle.JudgmentSharpAngle(InterArearesult, ref yspointList, ref ysangle)) |
|
{ |
|
IGeometry result = FeatureAPI.Difference(repair.Geometry, InterArearesult); |
|
if (result != null && !result.IsEmpty) |
|
repair.Geometry = result; continue; |
|
} |
|
else |
|
{ |
|
jcfc.IsReference = true; continue; |
|
} |
|
} |
|
else |
|
{ |
|
//参与图形修复的基础库 |
|
jcfc.IsReference = true; |
|
continue; |
|
} |
|
} |
|
#endregion |
|
} |
|
} |
|
else |
|
{ |
|
return repair.ListReference; |
|
} |
|
} |
|
#endregion |
|
|
|
if (repair.ListReference != null && repair.ListReference.Count >= 1) |
|
{ |
|
foreach (ReferenceEntity jcfc in repair.ListReference) |
|
{ |
|
#region 与基础库相交 |
|
if (repair.Geometry.IsEmpty) break; |
|
IGeometry InterArearesult = FeatureAPI.InterSect(jcfc.RefGeometry, repair.Geometry); |
|
if (InterArearesult != null) |
|
{ |
|
if (InterArearesult == null || InterArearesult.IsEmpty) continue;//未相交到或相交为空图形的直接跳过 |
|
double area = (InterArearesult as IArea).Area; |
|
if (area < 1)//相交面积小于1的图形擦除 |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) |
|
//{ |
|
// jcfc.IsReference = true; continue; |
|
//} |
|
IGeometry result = FeatureAPI.Difference(repair.Geometry, InterArearesult); |
|
if (result != null && !result.IsEmpty) |
|
{ |
|
repair.Geometry = result; continue; |
|
} |
|
} |
|
else if (area > 1 && area < 10) |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) |
|
//{ |
|
// jcfc.IsReference = true; continue; |
|
//} |
|
//相交面积小于10且相交图形为尖锐角或者狭长图形的擦除 |
|
if (SharpAngle.JudgmentSharpAngle(InterArearesult, ref yspointList, ref ysangle)) |
|
{ |
|
IGeometry result = FeatureAPI.Difference(repair.Geometry, InterArearesult); |
|
if (result != null && !result.IsEmpty) |
|
repair.Geometry = result; continue; |
|
} |
|
else |
|
{ |
|
jcfc.IsReference = true; continue; |
|
} |
|
} |
|
else |
|
{ |
|
//参与图形修复的基础库 |
|
jcfc.IsReference = true; |
|
continue; |
|
} |
|
} |
|
#endregion |
|
|
|
if (!jcfc.IsReference) continue; |
|
|
|
#region 与基础库不相交的面积 |
|
IGeometry diffresult = FeatureAPI.Difference(jcfc.RefGeometry, repair.Geometry); |
|
if (diffresult != null && !diffresult.IsEmpty) |
|
{ |
|
List<IPoint> pointList1 = null; |
|
double angle = 0; |
|
double area = (diffresult as IArea).Area; |
|
if (area < 1)//未相交面积小于1的图形合并 |
|
{ |
|
if (FeatureAPI.IsAdjacent(repair.Geometry, diffresult)) |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) continue;//线状地物不与碎图斑合并 |
|
IGeometry unionresult = FeatureAPI.Union(repair.Geometry, diffresult); |
|
if (unionresult != null && !unionresult.IsEmpty) |
|
{ |
|
repair.Geometry = unionresult; |
|
} |
|
} |
|
} |
|
else if (area < 10 && AECommonHelper.SharpAngleDataCheck(diffresult, ref pointList1, ref angle)) |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) continue;//线状地物不与碎图斑合并 |
|
if (FeatureAPI.IsAdjacent(repair.Geometry, diffresult)) |
|
{ |
|
IGeometry unionresult = FeatureAPI.Union(repair.Geometry, diffresult); |
|
if (unionresult != null && unionresult != null) |
|
{ |
|
repair.Geometry = unionresult; |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
#region 被动变更小于30平且相邻的图斑与当前图斑合并 |
|
//小于30平的合并问题还需要验证 |
|
if (area < 30) |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) continue;//线状地物不与碎图斑合并 |
|
if (FeatureAPI.IsAdjacent(repair.Geometry, diffresult)) |
|
{ |
|
IGeometry unionresult = FeatureAPI.Union(repair.Geometry, diffresult); |
|
if (unionresult != null && unionresult != null) |
|
{ |
|
repair.Geometry = unionresult; |
|
} |
|
} |
|
} |
|
#endregion |
|
} |
|
} |
|
#endregion |
|
} |
|
|
|
if (repair.Geometry.IsEmpty) return repair.ListReference; |
|
if (repair.ListReference.Where(x => x.IsReference).ToList().Count == 1) |
|
{ |
|
ReferenceEntity jcdltb = repair.ListReference.Where(x => x.IsReference).ToList().FirstOrDefault(); |
|
|
|
#region 压盖带一个参考图形 |
|
#region 面积相差小于1的 直接使用基础库图形 |
|
jcdltb.EllipseArea = (jcdltb.RefGeometry as IArea).Area; |
|
var geomj = (repair.Geometry as IArea).Area; |
|
if (jcdltb.EllipseArea == geomj || Math.Abs(jcdltb.EllipseArea - geomj) < 1) |
|
{ |
|
//基础数据库存在多部件,且面积较小的图形,删掉对应的碎图斑 |
|
string RefWKT = jcdltb.RefWKT; |
|
jcdltb.RefWKT = ""; |
|
jcdltb.Modify = true; |
|
jcdltb.RefGeometry = null; |
|
repair.ListReference.Add(new ReferenceEntity() |
|
{ |
|
BSM = $"NMK_{repair.JCBH}", |
|
CZCSXM = repair.CZCSXM, |
|
DLBM = repair.DLBM, |
|
RefWKT = RefWKT, |
|
Modify = true |
|
//IsNeedAddNewZDK = false |
|
}); |
|
return repair.ListReference; |
|
} |
|
#endregion |
|
|
|
#region 图形在基础数据内部 且被动变更图斑不存在尖锐角/狭长图形 |
|
bool iscontinue = true; |
|
IGeometry diffresult = FeatureAPI.Difference(jcdltb.RefGeometry, repair.Geometry); |
|
if (diffresult != null && !diffresult.IsEmpty) |
|
{ |
|
List<IPoint> pointList = null; |
|
double angle = 0; |
|
if (SharpAngle.JudgmentSharpAngle(diffresult, ref pointList, ref angle) || PolygonNarrowAreaChecker.CheckLocalNarrowAreas(diffresult as IPolygon).Count > 0) |
|
{ |
|
iscontinue = false; |
|
} |
|
foreach (var item in repair.ListReference) |
|
{ |
|
if (item.BSM == jcdltb.BSM) continue; |
|
if (FeatureAPI.IsInterSect(item.RefGeometry, diffresult)) |
|
{ |
|
iscontinue = false; break; |
|
} |
|
} |
|
if (iscontinue) |
|
{ |
|
//Difference 擦除的结果与修复后的repair.Geometry 存在误差范围内的差别 |
|
//repair.Geometry = FeatureAPI.Difference(jcdltb.RefGeometry, Difference); |
|
#region 出现多部件的图形,需要进行节点修复逻辑 |
|
List<IGeometry> geometryList = FeatureAPI.DissolveGeometryByRing(repair.Geometry);//拆分多部件 |
|
if (geometryList.Count > 1) |
|
{ |
|
LogAPI.Debug($"jcbh:{repair.JCBH},的图斑,BoundaryRepairHelper.ExecuteRepair方法中的 出现多部件的图形,需要进行节点修复逻辑,geometryList.Count > 1的相关逻辑暂未处理 ! "); |
|
} |
|
else |
|
{ |
|
if (diffresult.IsEmpty) |
|
{ |
|
jcdltb.RefWKT = ""; |
|
jcdltb.RefGeometry = null; |
|
} |
|
else |
|
{ |
|
jcdltb.RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(diffresult); |
|
jcdltb.RefGeometry = diffresult; |
|
} |
|
jcdltb.Modify = true; |
|
repair.ListReference.Add(new ReferenceEntity() |
|
{ |
|
BSM = $"NMK_{repair.JCBH}", |
|
CZCSXM = repair.CZCSXM, |
|
DLBM = repair.DLBM, |
|
RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(repair.Geometry), |
|
Modify = true, |
|
//Describe = "图形修复:" |
|
}); |
|
if (jrjReference.Count > 0) |
|
{ |
|
foreach (var item in repair.ListReference.FindAll(x => x.Modify && !x.BSM.Contains("NMK_"))) |
|
{ |
|
if (item.RefGeometry == null || item.RefGeometry.IsEmpty) continue; |
|
item.RefGeometry = FeatureAPI.Difference(item.RefGeometry, restSharpGeo); |
|
if (item.RefGeometry == null || item.RefGeometry.IsEmpty) continue; |
|
item.RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(item.RefGeometry); |
|
} |
|
repair.ListReference.AddRange(jrjReference); |
|
} |
|
return repair.ListReference; |
|
} |
|
#endregion |
|
} |
|
} |
|
#endregion |
|
#endregion |
|
} |
|
|
|
#region 没有参考基础库 |
|
if (repair.ListReference.Where(x => x.IsReference).ToList().Count == 0) return repair.ListReference; |
|
#endregion |
|
|
|
geometries.Clear(); |
|
foreach (var item in repair.ListReference) |
|
{ |
|
if (!item.IsReference) continue; |
|
geometries.Add(item.RefGeometry); |
|
} |
|
List<IGeometry> geometrys = ExecuteBoundaryRepair(repair, geometries); |
|
if (geometrys != null) |
|
{ |
|
foreach (var item in geometrys) |
|
{ |
|
if (item.IsEmpty || item as IArea == null || (item as IArea).Area == 0) continue; |
|
foreach (ReferenceEntity jcdltb in repair.ListReference) |
|
{ |
|
if (!jcdltb.IsReference) continue; |
|
IGeometry diff = FeatureAPI.Difference(jcdltb.RefGeometry, item); |
|
if (diff == null || diff.IsEmpty || (diff as IArea).Area == 0) |
|
{ |
|
jcdltb.RefWKT = ""; |
|
jcdltb.RefGeometry = null; |
|
jcdltb.Modify = true; |
|
} |
|
else |
|
{ |
|
jcdltb.RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(diff); |
|
jcdltb.RefGeometry = diff; |
|
jcdltb.Modify = true; |
|
} |
|
} |
|
ReferenceEntity referenceEntity = new ReferenceEntity |
|
{ |
|
BSM = $"NMK_{repair.JCBH}", |
|
CZCSXM = repair.CZCSXM, |
|
DLBM = repair.DLBM, |
|
RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(item), |
|
RefGeometry = item, |
|
Modify = true |
|
}; |
|
if (repair.ListReference.FirstOrDefault(x => x.BSM == referenceEntity.BSM) != null) |
|
{ |
|
referenceEntity.BSM = $"NMK_{repair.JCBH}_{Guid.NewGuid().ToTrim().Replace("-", "")}"; |
|
} |
|
repair.ListReference.Add(referenceEntity); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
return repair.ListReference; |
|
} |
|
|
|
if (jrjReference.Count > 0) |
|
{ |
|
foreach (ReferenceEntity item in repair.ListReference.FindAll(x => x.Modify && !x.BSM.Contains("NMK_"))) |
|
{ |
|
if (item.RefGeometry == null || item.RefGeometry.IsEmpty) continue; |
|
item.RefGeometry = FeatureAPI.Difference(item.RefGeometry, restSharpGeo); |
|
if (item.RefGeometry == null || item.RefGeometry.IsEmpty) continue; |
|
item.RefWKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(item.RefGeometry); |
|
} |
|
repair.ListReference.AddRange(jrjReference); |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
LogAPI.Debug("执行边界修复失败:\r\n"); |
|
LogAPI.Debug(ex); |
|
throw ex; |
|
} |
|
return repair.ListReference; |
|
} |
|
|
|
|
|
#region 节点去重 |
|
private static void RemoveDuplicatePointsInRing(IRing ring) |
|
{ |
|
IPointCollection pointColl = ring as IPointCollection; |
|
if (pointColl == null) return; |
|
// 从第 1 个点开始(索引 1),向前比较(避免越界) |
|
for (int i = 1; i < pointColl.PointCount;) |
|
{ |
|
IPoint currentPoint = pointColl.get_Point(i); |
|
IPoint prevPoint = pointColl.get_Point(i - 1); |
|
// 检查坐标是否完全一致(X、Y、Z、M 均相等) |
|
if (currentPoint.X == prevPoint.X && currentPoint.Y == prevPoint.Y) |
|
{ |
|
// 删除当前重复点(删除后后续点索引前移,i 不递增) |
|
pointColl.RemovePoints(i, 1); |
|
} |
|
else |
|
{ |
|
i++; // 无重复,继续下一个点 |
|
} |
|
} |
|
// 重新闭合环(确保最后一个点与第一个点一致,避免几何无效) |
|
ring.Close(); |
|
} |
|
#endregion |
|
|
|
private static List<IGeometry> ExecuteBoundaryRepair(RepairEntity repair, List<IGeometry> jcdltb_features) |
|
{ |
|
List<IGeometry> ResultgeometryList = new List<IGeometry>(); |
|
List<IGeometry> geometryList = null; |
|
List<IPoint> pointList = null; |
|
double angle = 0; |
|
try |
|
{ |
|
if (IsMultipartGeometry(repair.Geometry)) |
|
{ |
|
#region 拆分多部件 |
|
List<IGeometry> Dissolves = FeatureAPI.DissolveGeometryByRing(repair.Geometry); |
|
if (Dissolves != null && Dissolves.Count > 0) |
|
{ |
|
for (int i = 0; i < Dissolves.Count; i++) |
|
{ |
|
IGeometry single = Dissolves[i]; |
|
if (single == null || (single as IArea).Area == 0) continue; |
|
|
|
#region 拆分多部件过后检查图形是否存在尖锐角/狭长 |
|
|
|
#region 尖锐角检查与修复 |
|
if (!single.IsEmpty && SharpAngle.JudgmentSharpAngle(single, ref pointList, ref angle)) |
|
{ |
|
single = SharpAngle.ProcessSharpAngles(single, 3); |
|
single.SpatialReference = _SpatialReference; |
|
} |
|
#endregion |
|
|
|
#region 狭长/局部狭长检查与修复 |
|
if (!single.IsEmpty) |
|
{ |
|
var NarrowAreas = PolygonNarrowAreaChecker.CheckLocalNarrowAreas(single as IPolygon); |
|
if (NarrowAreas != null && NarrowAreas.Count > 0) |
|
{ |
|
LogAPI.Debug($"jcbh:{repair.JCBH}的图斑,BoundaryRepairHelper.ExecuteBoundaryRepair方法中的 狭长/局部狭长检查与修复,检查出来暂未处理 ! "); |
|
} |
|
} |
|
#endregion |
|
if (single.IsEmpty) continue; |
|
#endregion |
|
|
|
#region 判断当前图斑是否压盖多个图斑且存在碎图斑 |
|
foreach (IGeometry jcdltb in jcdltb_features) |
|
{ |
|
#region 相交部分 |
|
IGeometry InterSect = FeatureAPI.InterSect(single, jcdltb); |
|
List<IGeometry> InterSects = FeatureAPI.DissolveGeometryByRing(InterSect); |
|
if (InterSects != null && InterSects.Count > 0) |
|
{ |
|
foreach (IGeometry intersect in InterSects) |
|
{ |
|
if (intersect == null || intersect.IsEmpty || (intersect as IArea).Area == 0) continue; |
|
if ((intersect as IArea).Area < 1 || (SharpAngle.JudgmentSharpAngle(intersect, ref pointList, ref angle) && (intersect as IArea).Area < 10)) |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) continue;//线状地物不与碎图斑合并 |
|
IGeometry Difference1 = FeatureAPI.Difference(single, intersect); |
|
if (Difference1 != null && !Difference1.IsEmpty) |
|
single = Difference1; |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
continue; |
|
} |
|
#endregion |
|
|
|
#region 不相交部分 |
|
IGeometry Difference = FeatureAPI.Difference(jcdltb, single); |
|
List<IGeometry> Differences = FeatureAPI.DissolveGeometryByRing(Difference); |
|
if (Differences != null && Differences.Count > 0) |
|
{ |
|
for (int j = 0; j < Differences.Count; j++) |
|
{ |
|
IGeometry difference = Differences[j]; |
|
if (difference == null || difference.IsEmpty || (difference as IArea).Area == 0) continue; |
|
//与基础库不相交的部分面积小于30平且相邻的情况下 合并 |
|
if (FeatureAPI.IsAdjacent(single, difference)) |
|
{ |
|
double area = (difference as IArea).Area; |
|
if ((difference as IArea).Area < 10) |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) continue;//线状地物不与碎图斑合并 |
|
IGeometry unionresult = FeatureAPI.Union(single, difference); |
|
if (unionresult != null && !unionresult.IsEmpty) |
|
{ |
|
single = unionresult; |
|
} |
|
continue; |
|
} |
|
else if (area > 10 && area < 30) |
|
{ |
|
ResultgeometryList.Add(single); |
|
} |
|
} |
|
else |
|
{ |
|
if (AECommonHelper.SharpAngleDataCheck(difference, ref pointList, ref angle)) |
|
{ |
|
if (angle > 10)//狭长图形 |
|
{ |
|
continue; |
|
} |
|
else |
|
{ |
|
LogAPI.Debug($"jcbh:{repair.JCBH}的图斑,BoundaryRepairHelper.ExecuteBoundaryRepair方法中的 被动变更尖锐角处理 暂未处理 ! "); |
|
#region 被动变更尖锐角处理 |
|
//geometry = Passive_Sharp_Repair(pointList, geometry, item); |
|
#endregion |
|
} |
|
} |
|
} |
|
} |
|
} |
|
#endregion |
|
} |
|
#endregion |
|
|
|
List<IGeometry> Dissolve = FeatureAPI.DissolveGeometryByRing(single);//拆分多部件 |
|
if (Dissolve != null && Dissolve.Count > 1) |
|
{ |
|
foreach (IGeometry item in Dissolve) |
|
{ |
|
ResultgeometryList.Add(item); |
|
} |
|
} |
|
else |
|
{ |
|
ResultgeometryList.Add(single); |
|
} |
|
} |
|
} |
|
#endregion |
|
} |
|
else |
|
{ |
|
#region 拆分多部件过后检查图形是否存在尖锐角/狭长 |
|
|
|
#region 尖锐角检查与修复 |
|
if (!repair.Geometry.IsEmpty && SharpAngle.JudgmentSharpAngle(repair.Geometry, ref pointList, ref angle)) |
|
{ |
|
repair.Geometry = SharpAngle.ProcessSharpAngles(repair.Geometry, 3); |
|
repair.Geometry.SpatialReference = _SpatialReference; |
|
} |
|
#endregion |
|
|
|
#region 狭长/局部狭长检查与修复 |
|
if (!repair.Geometry.IsEmpty) |
|
{ |
|
var NarrowAreas = PolygonNarrowAreaChecker.CheckLocalNarrowAreas(repair.Geometry as IPolygon); |
|
if (NarrowAreas != null && NarrowAreas.Count > 0) |
|
{ |
|
LogAPI.Debug($"jcbh:{repair.JCBH}的图斑,BoundaryRepairHelper.ExecuteBoundaryRepair方法中的 拆分多部件过后检查图形是否存在狭长,检查出来暂未处理 ! "); |
|
} |
|
} |
|
#endregion |
|
#endregion |
|
|
|
#region 判断当前图斑是否压盖多个图斑且存在碎图斑 |
|
foreach (IGeometry jcdltb in jcdltb_features) |
|
{ |
|
#region 相交部分 |
|
IGeometry InterSect = FeatureAPI.InterSect(repair.Geometry, jcdltb); |
|
List<IGeometry> InterSects = FeatureAPI.DissolveGeometryByRing(InterSect); |
|
if (InterSects != null && InterSects.Count > 0) |
|
{ |
|
foreach (IGeometry intersect in InterSects) |
|
{ |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) continue; |
|
if ((!intersect.IsEmpty && (intersect as IArea).Area < 1)/* || (SharpAngle.JudgmentSharpAngle(intersect.Geometry, ref pointList, ref angle) && intersect.mj < 10)*/) |
|
{ |
|
IGeometry differenceresult1 = FeatureAPI.Difference(repair.Geometry, intersect); |
|
if (differenceresult1 != null && !differenceresult1.IsEmpty) |
|
repair.Geometry = differenceresult1; |
|
} |
|
} |
|
} |
|
#endregion |
|
|
|
#region 不相交部分 |
|
IGeometry differenceresult = FeatureAPI.Difference(jcdltb, repair.Geometry); |
|
List<IGeometry> differenceresults = FeatureAPI.DissolveGeometryByRing(differenceresult); |
|
if (differenceresults != null && differenceresults.Count > 0) |
|
{ |
|
foreach (IGeometry differenc in differenceresults) |
|
{ |
|
if (differenc == null || differenc.IsEmpty) |
|
{ |
|
continue; |
|
} |
|
double area = (differenc as IArea).Area; |
|
if (area == 0) continue; |
|
//与基础库不相交的部分面积小于30平且相邻的情况下 合并 |
|
if (FeatureAPI.IsAdjacent(repair.Geometry, differenc)) |
|
{ |
|
//线状地物不与碎图斑合并 |
|
//if (!string.IsNullOrEmpty(repair.DLBM) && XZDW_List.Contains(repair.DLBM)) continue; |
|
if (area < 10) |
|
{ |
|
IGeometry unionresult = FeatureAPI.Union(repair.Geometry, differenc); |
|
if (unionresult != null && !unionresult.IsEmpty) |
|
{ |
|
//假设合并之后为尖锐角或者狭长,就不合并 |
|
if (SharpAngle.JudgmentSharpAngle(unionresult, ref pointList, ref angle) || PolygonNarrowAreaChecker.CheckLocalNarrowAreas(unionresult as IPolygon).Count > 0) |
|
{ |
|
continue; |
|
} |
|
repair.Geometry = unionresult; |
|
continue; |
|
} |
|
} |
|
else if (area > 10 && area < 30) |
|
{ |
|
ResultgeometryList.Add(differenc); |
|
} |
|
//不相交部分,判定是否有尖锐角或者狭长图形,不相交部分的尖锐角或者狭长图形剩余部分合并给相邻的子地块 |
|
else if (SharpAngle.JudgmentSharpAngle(differenc, ref pointList, ref angle)) |
|
{ |
|
IGeometry repairGeo = SharpAngle.ProcessSharpAngles(differenc, 5); |
|
repairGeo.SpatialReference = _SpatialReference; |
|
IGeometry diffresult = FeatureAPI.Difference(differenc, repairGeo); |
|
if (diffresult != null && !diffresult.IsEmpty) |
|
{ |
|
double diffArea = (diffresult as IArea).Area; |
|
if (diffArea > 0) |
|
{ |
|
List<IGeometry> tempGeometryList = FeatureAPI.DissolveGeometryByRing(diffresult);//拆分多部件 |
|
foreach (IGeometry SharpGeo in tempGeometryList) |
|
{ |
|
if (FeatureAPI.IsAdjacent(SharpGeo, repair.Geometry)) |
|
{ |
|
IGeometry unionresult = FeatureAPI.Union(repair.Geometry, SharpGeo); |
|
if (unionresult != null && unionresult != null) |
|
{ |
|
if (!SharpAngle.JudgmentSharpAngle(unionresult, ref pointList, ref angle) && PolygonNarrowAreaChecker.CheckLocalNarrowAreas(unionresult as IPolygon).Count <= 0) |
|
{ |
|
repair.Geometry = unionresult; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
else if (PolygonNarrowAreaChecker.CheckLocalNarrowAreas(differenc as IPolygon).Count > 0) |
|
{ |
|
var NarrowAreas = PolygonNarrowAreaChecker.CheckLocalNarrowAreas(differenc as IPolygon); |
|
if (NarrowAreas != null && NarrowAreas.Count > 0) |
|
{ |
|
foreach (var item in NarrowAreas) |
|
{ |
|
if (FeatureAPI.IsAdjacent(item, repair.Geometry)) |
|
{ |
|
IGeometry unionresult = FeatureAPI.Union(repair.Geometry, item); |
|
if (!SharpAngle.JudgmentSharpAngle(unionresult, ref pointList, ref angle) && PolygonNarrowAreaChecker.CheckLocalNarrowAreas(unionresult as IPolygon).Count <= 0) |
|
{ |
|
repair.Geometry = unionresult; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
if (AECommonHelper.SharpAngleDataCheck(differenc, ref pointList, ref angle)) |
|
{ |
|
if (angle > 10)//狭长图形 |
|
{ |
|
continue; |
|
} |
|
else |
|
{ |
|
LogAPI.Debug($"jcbh:{repair.JCBH}的图斑,BoundaryRepairHelper.ExecuteBoundaryRepair方法中的 不相交部分的被动变更尖锐角处理,检查出来暂未处理 ! "); |
|
#region 被动变更尖锐角处理 |
|
//geometry = Passive_Sharp_Repair(pointList, geometry, item); |
|
#endregion |
|
} |
|
} |
|
} |
|
} |
|
} |
|
#endregion |
|
} |
|
#endregion |
|
|
|
List<IGeometry> Dissolve = FeatureAPI.DissolveGeometryByRing(repair.Geometry); |
|
if (Dissolve != null && Dissolve.Count > 1) |
|
{ |
|
foreach (var item in Dissolve) |
|
{ |
|
if (item == null || item.IsEmpty || (item as IArea).Area < 0.01) continue; |
|
ResultgeometryList.Add(item); |
|
} |
|
} |
|
else |
|
{ |
|
ResultgeometryList.Add(repair.Geometry); |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
ResultgeometryList = geometryList; |
|
return ResultgeometryList; |
|
} |
|
return ResultgeometryList; |
|
} |
|
|
|
/// <summary> |
|
/// 判断图形是否为多部件 |
|
/// </summary> |
|
/// <param name="geometry"></param> |
|
/// <returns></returns> |
|
private static bool IsMultipartGeometry(IGeometry geometry) |
|
{ |
|
// 检查是否为支持多部件的几何类型 |
|
if (geometry.GeometryType != esriGeometryType.esriGeometryPolygon && |
|
geometry.GeometryType != esriGeometryType.esriGeometryPolyline) |
|
{ |
|
return false; |
|
} |
|
// 转换为IGeometryCollection接口 |
|
IGeometryCollection geometryCollection = geometry as IGeometryCollection; |
|
if (geometryCollection == null) |
|
{ |
|
return false; |
|
} |
|
// 判断部件数量 |
|
return geometryCollection.GeometryCount > 1; |
|
} |
|
|
|
/// <summary> |
|
/// 处理边界修复后新增或修改的子地块 |
|
/// </summary> |
|
/// <param name="entities">边界修复结果</param> |
|
/// <param name="ListDLTB">年末数据库</param> |
|
/// <param name="repairs">所有参与边界修复子地块</param> |
|
/// <param name="repair">当前修复子地块</param> |
|
/// <param name="RepairLayerZDK">边界修复多部件图斑新增的子地块</param> |
|
private static void AddResultToAnalysisLayer(List<ReferenceEntity> entities, List<ReferenceEntity> ListDLTB, List<RepairEntity> repairs, RepairEntity repair, List<RepairEntity> RepairLayerZDK) |
|
{ |
|
try |
|
{ |
|
//所有他图形都没有被修改,删除当前子地块 |
|
if (entities.FirstOrDefault(x => x.Modify == true) == null) |
|
{ |
|
//repair.JCBH = "-1"; |
|
repair.JCBH = $"{repair.JCBH}_DELETE"; |
|
return; |
|
} |
|
entities = entities.OrderBy(x => x.BSM.Contains("_New")).ToList(); |
|
bool isadd = false;//判断是否需要新增子地块 |
|
foreach (var item in entities) |
|
{ |
|
if (!item.Modify) continue; |
|
var dltb = ListDLTB.FirstOrDefault(x => x.BSM == item.BSM); |
|
if (dltb != null) |
|
{ |
|
if (dltb.BSM.StartsWith("NMK")) |
|
{ |
|
string dkid = dltb.BSM.Split('_')[2]; |
|
var updatezdk = repairs.FirstOrDefault(x => x.JCBH.ToTrim().Replace("-", "") == dkid); |
|
if (updatezdk != null) updatezdk.WKT = item.RefWKT; |
|
} |
|
dltb.RefWKT = item.RefWKT; |
|
dltb.RefGeometry = item.RefGeometry; |
|
} |
|
else |
|
{ |
|
var exist = ListDLTB.FirstOrDefault(x => x.RefWKT == item.RefWKT); |
|
if (exist != null && !item.BSM.StartsWith("NMK_")) continue; |
|
ListDLTB.Add(new ReferenceEntity() |
|
{ |
|
#region 属性值 |
|
BSM = item.BSM, |
|
CZCSXM = item.CZCSXM, |
|
RefWKT = item.RefWKT, |
|
RefGeometry = item.RefGeometry, |
|
DLBM = item.DLBM, |
|
IsReference = true, |
|
oid = item.oid |
|
#endregion |
|
}); |
|
if (!isadd) |
|
{ |
|
repair.WKT = item.RefWKT; |
|
repair.Geometry = item.RefGeometry; |
|
isadd = true; |
|
|
|
//只修改后续有相交子地块,先擦除掉因此子地块修改后造成的相交部分,便于点修复时的修改 |
|
for (int i = repairs.Count - 1; i >= 0; i--) |
|
{ |
|
if (repairs[i].JCBH == repair.JCBH) break; |
|
|
|
IGeometry otherZDKGeo = repairs[i].Geometry == null ? ConvertWKTAndSetSpatialRef(repairs[i].WKT, _SpatialReference) : repairs[i].Geometry; |
|
if (FeatureAPI.IsInterSect(repair.Geometry, otherZDKGeo)) |
|
{ |
|
IGeometry geo = FeatureAPI.InterSect(repair.Geometry, otherZDKGeo); |
|
if (geo != null) |
|
{ |
|
IGeometry diffGeo = FeatureAPI.Difference(otherZDKGeo, geo); |
|
if (diffGeo != null && !diffGeo.IsEmpty) |
|
{ |
|
repairs[i].Geometry = diffGeo; |
|
repairs[i].WKT = GeometryConvertHelper.ConvertIGeoemtryToWKT(diffGeo); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
RepairEntity zDK = new RepairEntity(); |
|
zDK.WKT = item.RefWKT; |
|
zDK.CZCSXM = repair.CZCSXM; |
|
zDK.DLBM = repair.DLBM; |
|
if (item.BSM.Contains("_SharpAngle") || item.BSM.Contains("_New")) |
|
{ |
|
zDK.JCBH = item.BSM; |
|
} |
|
else |
|
{ |
|
zDK.JCBH = Guid.NewGuid().ToTrim().Replace("-", ""); |
|
} |
|
RepairLayerZDK.Add(zDK); |
|
} |
|
} |
|
} |
|
} |
|
catch (Exception ex) |
|
{ |
|
|
|
throw; |
|
} |
|
} |
|
|
|
private static IGeometry ConvertWKTAndSetSpatialRef(string wkt, ISpatialReference spatialRef) |
|
{ |
|
var geometry = GeometryConvertHelper.ConvertWKTToIGeometry(wkt); |
|
geometry.SpatialReference = spatialRef; |
|
return geometry; |
|
} |
|
|
|
/// <summary> |
|
/// 判断两个包围盒是否相交 |
|
/// </summary> |
|
/// <param name="envA">包围盒A</param> |
|
/// <param name="envB">包围盒B</param> |
|
/// <returns>true-相交;false-不相交</returns> |
|
private static bool AreEnvelopesIntersecting(IEnvelope envA, IEnvelope envB) |
|
{ |
|
// 任一包围盒为空时,视为不相交 |
|
if (envA == null || envB == null || envA.IsEmpty || envB.IsEmpty) |
|
return false; |
|
// X轴投影不重叠 |
|
if (envA.XMin >= envB.XMax || envA.XMax <= envB.XMin) |
|
return false; |
|
// Y轴投影不重叠 |
|
if (envA.YMin >= envB.YMax || envA.YMax <= envB.YMin) |
|
return false; |
|
// X和Y轴均重叠,包围盒相交 |
|
return true; |
|
} |
|
|
|
private static T DeepCopyByReflect<T>(T obj) |
|
{ |
|
//如果是字符串或值类型则直接返回 |
|
if (obj == null || (obj is string) || obj.GetType().IsValueType) return obj; |
|
object retval = System.Activator.CreateInstance(obj.GetType()); |
|
System.Reflection.FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); |
|
foreach (System.Reflection.FieldInfo field in fields) |
|
{ |
|
try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); } |
|
catch { } |
|
} |
|
return (T)retval; |
|
} |
|
} |
|
}
|
|
|