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

233 lines
9.1 KiB

4 months ago
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using KGIS.Framework.Maps;
using KGIS.Framework.Platform;
using KGIS.Framework.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kingo.Plugin.EngineEditor.helper
{
public class PointAnalysisHelperForGdb
{
public readonly string DltbName = "DLTB_ERR_Result";
public readonly string XZQName = "XZQ_ERR_Result";
public readonly string DltbALLName = "DLTB_All_Result";
public readonly string XZQALLName = "XZQ_All_Result";
public string Path = "\\DataCheckResult.gdb";
public IFeatureClass ShpFeatureClass = null;
public IFeatureClass ALLFeatureClass = null;
IWorkspaceFactory pWorkspaceFactory = null;
IWorkspace pWorkspace = null;
IFeatureWorkspace pFeatureWorkspace = null;
public PointAnalysisHelperForGdb()
{
}
/// <summary>
/// 给图形加点保证平均距离小于一定距离
/// </summary>
/// <param name="NodeInformation">有问题的线段集合</param>
/// <param name="featureLayer">要加点的图层</param>
/// <param name="distinct">平均距离</param>
/// 适合环型图斑
public void AddConcurrentPoint(IPoint point, IIdentify identify)
{
int max = 0;
int partIndexMax = 0;
IPoint BeforePoint = null;
if (identify == null || point == null)
{
return;
}
IArray pIDs = identify.Identify(point);
if (pIDs == null || pIDs.Count == 0)
return;
for (int index = 0; index < pIDs.Count; index++)
{
IFeatureIdentifyObj pFeatIdObj = pIDs.get_Element(index) as IFeatureIdentifyObj;
IRowIdentifyObject pRowObj = pFeatIdObj as IRowIdentifyObject;
IFeature iF = pRowObj.Row as IFeature;
IGeometry geometry = iF.Shape;
IPolyline polyline1 = GetPolyline2(iF);
if (PointUpLine(polyline1, point))
{
continue;
}
IPoint iHitPt = new ESRI.ArcGIS.Geometry.Point();
IHitTest iHitTest = geometry as IHitTest;
double hitDist = 0;
int partIndex = 0;
int vertexIndex = 0;
bool bRightSide = false;
IPointCollection pc = (SpliteLineAtPoint(polyline1, point) as IPointCollection);
if (pc == null)
{
//MessageHelper.Show("在批量节点密度处理中,添加共点失败,请查看oid为" + iF.OID + "的图层在点" + point.X + ";" + point.Y + "处是否有拓扑问题,我们将继续处理...");
LogAPI.Debug("在批量节点密度处理中,添加共点失败,请查看oid为" + iF.OID + "的图层在点" + point.X + ";" + point.Y + "处是否有拓扑问题");
continue;
}
for (int j = 0; j < pc.PointCount; j++)
{
if (j == 0)
{
continue;
}
if (pc.Point[j].X == point.X && pc.Point[j].Y == point.Y)
{
BeforePoint = pc.Point[j - 1];
break;
}
}
bool isTrue = iHitTest.HitTest(BeforePoint, 0.0001, esriGeometryHitPartType.esriGeometryPartVertex,
iHitPt, ref hitDist, ref partIndex, ref vertexIndex, ref bRightSide);
if (isTrue)
{
max = vertexIndex;
partIndexMax = partIndex;
iF.Shape = this.AddPoint(iF.Shape, point, partIndexMax, max, false);
iF.Store();
break;
}
}
}
/// <summary>
/// 图形转点
/// </summary>
/// <param name="geometry"></param>
/// <param name="isCopy"></param>
/// <returns></returns>
public IPointCollection GeoToPoints(IGeometry geometry, bool isCopy = true)
{
IGeometry CopyGeometry = null;
IPointCollection collection = null;
if (isCopy)
{
ESRI.ArcGIS.esriSystem.IClone colone = geometry as ESRI.ArcGIS.esriSystem.IClone;
CopyGeometry = colone.Clone() as ESRI.ArcGIS.Geometry.IGeometry;
if (CopyGeometry.SpatialReference == null)
{
CopyGeometry.SpatialReference = MapsManager.Instance.MapService.getAxMapControl().ActiveView.FocusMap.SpatialReference;
}
collection = CopyGeometry as IPointCollection;
}
else
collection = geometry as IPointCollection;
return collection;
}
/// <summary>
/// 点是否在线上
/// </summary>
/// <returns></returns>
private bool PointUpLine(IPolyline polyline, IPoint point, bool isDelete = false)
{
IPointCollection Allcollection = new PolylineClass() as IPointCollection;
Allcollection = polyline as IPointCollection;
double angle = 0;
for (int i = 0; i < Allcollection.PointCount; i++)
{
if (Allcollection.Point[i].X == point.X && Allcollection.Point[i].Y == point.Y)
{
if (isDelete)
{
if (i == 0 || i == Allcollection.PointCount - 1)
{
return false;
}
angle = GetAngle(point, Allcollection.Point[i - 1], Allcollection.Point[i + 1]);
angle = Math.Round(angle, 0);
if (angle == 180 || angle == 0)
{
return true;
}
else
return false;
}
return true;
}
}
return false;
}
public double GetAngle(IPoint cenPoint, IPoint firstPoint, IPoint secondPoint)
{
double ma_x = firstPoint.X - cenPoint.X;
double ma_y = firstPoint.Y - cenPoint.Y;
double mb_x = secondPoint.X - cenPoint.X;
double mb_y = secondPoint.Y - cenPoint.Y;
double v1 = (ma_x * mb_x) + (ma_y * mb_y);
double ma_val = Math.Sqrt(ma_x * ma_x + ma_y * ma_y);
double mb_val = Math.Sqrt(mb_x * mb_x + mb_y * mb_y);
if (ma_val * mb_val == 0)
{
return -1;
}
double cosM = v1 / (ma_val * mb_val);
double angleAMB = Math.Acos(cosM) * 180 / Math.PI;
return angleAMB;
}
/// <summary>
/// 在线的指定位置上打断点
/// </summary>
/// <param name="LineCurve">线</param>
/// <param name="SplitePoint">断点</param>
/// <returns></returns>
public IPolyline SpliteLineAtPoint(IPolyline LineCurve, IPoint SplitePoint)
{
IPolyline Lines = null;
bool isSplit;
int splitIndex, segIndex;
LineCurve.SplitAtPoint(SplitePoint, false, false, out isSplit, out splitIndex, out segIndex);
if (isSplit)
{
Lines = LineCurve as IPolyline;
}
return Lines;
}
private IPolyline GetPolyline2(IFeature pFeature)
{
IPointCollection point = pFeature.Shape as IPointCollection;
IPointCollection collection = new PolylineClass() as IPointCollection;
collection.AddPointCollection(point);
return collection as IPolyline;
}
/// <summary>
/// 给图形加点
/// </summary>
/// <param name="geometry"></param>
/// <param name="point">要添加的点</param>
/// <param name="partIndex">片段顺序</param>
/// <param name="vertexIndex">点的索引</param>
/// <param name="beforeOrAfter">true:Before;false:After</param>
/// <returns></returns>
public IGeometry AddPoint(IGeometry geometry, IPoint point, int partIndex, int vertexIndex, bool beforeOrAfter = true)
{
IGeometryCollection collection = geometry as IGeometryCollection;
IGeometry geo = collection.get_Geometry(partIndex);
IPointCollection points = geo as IPointCollection;
object index = vertexIndex;
object mss = Type.Missing;
if (beforeOrAfter)
{
points.AddPoint(point, ref index, ref mss);
}
else
points.AddPoint(point, ref mss, ref index);
//geo = points as IGeometry;
return geometry;
}
}
}