// When we end, we'll make all of our output calls to our target. public void EndGeometry() { // if not multi line then add the current line to the collection. if (!_isMultiLine) { _lines.AddLine(_currentLine); } // if line counter is 0 then it is multiline // if 1 then it is linestring if (_lineCounter == 0 || !_isMultiLine) { _target = _lines.ToSqlGeometry(); } else { _lines.AddLine(_currentLine); // reset the line counter so that the child line strings chaining is done and return to base multiline type _lineCounter--; } }
// This is where real work is done. public void EndGeometry() { // if not multi line then add the current line to the collection. if (!_isMultiLine) { _lines.AddLine(_currentLine); } // if line counter is 0 then it is multiline // if 1 then it is linestring if (_lineCounter == 0 || !_isMultiLine) { // reverse the line before constructing the geometry _lines.ReversLines(); _lines.TranslateMeasure(_translateMeasure); _lines.ToSqlGeometry(ref _target); } else { _lines.AddLine(_currentLine); // reset the line counter so that the child line strings chaining is done and return to base multiline type _lineCounter--; } }
public void LRSMultiLineToSqlTest() { // empty LRS Point check var point1 = new LRSPoint("LINESTRING EMPTY".GetGeom()); var hashCode = point1.GetHashCode(); Assert.IsTrue(hashCode > 0); Assert.AreEqual(point1.ToString(), "POINT (0 0 )"); // LRS Point Equality check point1 = new LRSPoint("POINT(1 1 0 1)".GetGeom()); var point2 = new LRSPoint("POINT(1 1 0 1)".GetGeom()); Assert.IsTrue(point1 == point2); // range check Assert.IsTrue(point1.IsXYWithinTolerance(point2, 0.5)); point2 = new LRSPoint("POINT(2 2 0 2)".GetGeom()); var point3 = new LRSPoint("POINT(3 3 0 3)".GetGeom()); var point4 = new LRSPoint("POINT(4 4 0 4)".GetGeom()); var lrsPoints = new List <LRSPoint> { point1, point2, point3 }; // next and previous point Assert.AreEqual(LRSPoint.GetNextPoint(ref lrsPoints, point2), point3); Assert.AreEqual(LRSPoint.GetNextPoint(ref lrsPoints, point4), null); Assert.AreEqual(LRSPoint.GetPreviousPoint(ref lrsPoints, point2), point1); Assert.AreEqual(LRSPoint.GetPreviousPoint(ref lrsPoints, point4), null); // Multiline var lrs = new LRSMultiLine(4326); SqlGeometryBuilder geomBuilder = null; lrs.ToSqlGeometry(ref geomBuilder); lrs.BuildSqlGeometry(ref geomBuilder); geomBuilder = new SqlGeometryBuilder(); lrs.ToSqlGeometry(ref geomBuilder); lrs.BuildSqlGeometry(ref geomBuilder); var lrsLine = new LRSLine(4326); lrsLine.AddPoint(new LRSPoint(1, 1, 0, 1, 4326)); lrs.AddLine(lrsLine); geomBuilder = new SqlGeometryBuilder(); lrs.ToSqlGeometry(ref geomBuilder); var lrsLine1 = new LRSLine(4326); var wkt = lrs.ToString(); Assert.AreEqual("MULTILINESTRING EMPTY", wkt); Assert.AreEqual(lrs.GetPointAtM(10), null); var pt = new LRSPoint(1, 1, 0, 1, 4326); lrsLine1.AddPoint(pt); Assert.AreEqual(lrsLine1.ToString(), "POINT (1 1 1)"); pt = new LRSPoint(2, 2, 0, 2, 4326); lrsLine1.AddPoint(pt); lrs = new LRSMultiLine(4326); lrs.AddLine(lrsLine1); wkt = lrs.ToString(); Assert.AreEqual("LINESTRING (1 1 1, 2 2 2)", wkt); var lrsLine2 = new LRSLine(4326); pt = new LRSPoint(3, 3, 0, 3, 4326); Assert.AreEqual(pt.ToString(), "POINT (3 3 3)"); lrsLine2.AddPoint(pt); pt = new LRSPoint(4, 4, 0, 4, 4326); lrsLine2.AddPoint(pt); lrs = new LRSMultiLine(4326); lrs.AddLine(lrsLine1); lrs.AddLine(lrsLine2); geomBuilder = null; lrs.BuildSqlGeometry(ref geomBuilder); Assert.AreEqual(lrs.GetPointAtM(10), null); Assert.AreEqual(lrs.GetPointAtM(2), new LRSPoint(2, 2, 0, 2, 4326)); wkt = lrs.ToString(); lrs.RemoveFirst(); Assert.AreEqual(lrs.Count, 1); lrs.RemoveLast(); Assert.AreEqual(lrs.Count, 0); lrs.RemoveFirst(); lrs.RemoveLast(); Assert.AreEqual("MULTILINESTRING ((1 1 1, 2 2 2), (3 3 3, 4 4 4))", wkt); }
// add segments to target public void EndGeometry() { // if not multi line then add the current line to the collection. if (!_isMultiLine) { _segment1.AddLine(_currentLineForSegment1); _segment2.AddLine(_currentLineForSegment2); } // if line counter is 0 then it is multiline // if 1 then it is linestring if (_lineCounter == 0 || !_isMultiLine) { Segment1 = _segment1.ToSqlGeometry(); // TODO:: Messy logic to be meet as per Oracle; need to be re-factored // if second is a multi line // end measure of first line > end measure of last line // then consider only first line // by locating the point if (!_segment1.IsEmpty && _segment2.IsMultiLine) { var endSegmentEndM = _segment2.GetLastLine().GetEndPointM(); var startSegmentStartM = _segment2.GetFirstLine().GetEndPointM(); if (startSegmentStartM > endSegmentEndM) { var trimmedLine = _segment2.GetFirstLine(); var newLRSLine = new LRSLine(_srid); // add points up to end segment measure foreach (var point in trimmedLine) { if (point.M < endSegmentEndM) { newLRSLine.AddPoint(point); } } // add the end point if (endSegmentEndM.EqualsTo(_splitPointMeasure)) { newLRSLine.AddPoint(_splitPoint); } else { newLRSLine.AddPoint(trimmedLine.LocatePoint(endSegmentEndM, newLRSLine.GetEndPoint())); } Segment2 = newLRSLine.ToSqlGeometry(); } // if end segment measure is equal to split measure; then return the split alone for second segment else if (endSegmentEndM.EqualsTo(_splitPointMeasure)) { Segment2 = _splitPoint; } else { Segment2 = _segment2.ToSqlGeometry(); } } else { Segment2 = _segment2.ToSqlGeometry(); } } else { if (_currentLineForSegment1.IsLine) { _segment1.AddLine(_currentLineForSegment1); } if (_currentLineForSegment2.IsLine) { _segment2.AddLine(_currentLineForSegment2); } // reset the line counter so that the child line strings chaining is done and return to base multiline type _lineCounter--; } }
public SqlGeometry ToSqlGeometry() { return(MultiLine.ToSqlGeometry()); }