完整系统源码地址:https://gitee.com/rzcgis/pipeline
管网系统中涉及到的净距分析,计算两条管线的最小水平、垂直净距。
用鼠标左键在图形窗口点击选择两条管线,系统将自动计算水平距离或垂直距离。
-
选择两条管线,计算出两条关系的最小水平距离和最小垂直距离。首先需要计算出选择的两条线相距最近的位置分别在哪里。
-
超图本身是没有计算两个三维线对象的最近点的方法。通过google查询,得到一个方法:
stackoverflow
但是通过这个方法调用后发现很多时候计算不出来。
- 后来在Nts中发现直接有这样一个接口:
nettopologysuite
NearestPoints(Geometry, Geometry)
//Compute the the nearest points of two geometries. The points are presented in the same order as the input Geometries.
public static Coordinate[] NearestPoints(Geometry g0, Geometry g1)
这个接口返回的是两个点的数组,获取到数组后作为净距计算的两个点,分别计算出水平距离、垂直距离,并标绘在场景中即可。
于是只需要将超图的三维线对象转换为NTS的线对象即可:
GeometryNTS Convert(GeoLine3D geoLine3D)
{
var lineStrings = new List<LineString>();
for (var i = 0; i < geoLine3D.PartCount; i++)
{
var ls = new List<Coordinate>();
var partPointsInLine1 = geoLine3D[i];
for (var j = 0; j < partPointsInLine1.Count; j++)
{
var seg1Point = new CoordinateZ() { X = partPointsInLine1[j].X, Y = partPointsInLine1[j].Y, Z = partPointsInLine1[j].Z };
ls.Add(seg1Point);
}
lineStrings.Add(new LineString(ls.ToArray()));
}
var result = new MultiLineString(lineStrings.ToArray(), GeometryFactory.Default);
return result;
}