Skip to content

Commit 5b4f700

Browse files
committed
Implemented most Geometry Processing methods
1 parent 4b0f7f3 commit 5b4f700

File tree

5 files changed

+391
-74
lines changed

5 files changed

+391
-74
lines changed

LinqToDBPostGisNetTopologySuite.Tests/AffineTransformationsTests.cs

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using LinqToDB;
55
using NUnit.Framework;
6+
67
using NTSG = NetTopologySuite.Geometries;
78

89
namespace LinqToDBPostGisNetTopologySuite.Tests
@@ -24,8 +25,8 @@ public void TestSTAffine3D()
2425
{
2526
var expected = new double[][]
2627
{
27-
new[]{-1.0,-2.0,3.0},
28-
new[]{-1.0,-4.0,3.0}
28+
new[]{-1.0, -2.0, 3.0},
29+
new[]{-1.0, -4.0, 3.0}
2930
};
3031

3132
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
@@ -49,8 +50,8 @@ public void TestSTAffine2D()
4950
{
5051
var expected = new double[][]
5152
{
52-
new[]{0.0,0.0,3.0},
53-
new[]{0.0,0.0,3.0}
53+
new[]{0.0, 0.0, 3.0},
54+
new[]{0.0, 0.0, 3.0}
5455
};
5556

5657
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
@@ -73,9 +74,9 @@ public void TestSTRotate()
7374
{
7475
var expected = new double[][]
7576
{
76-
new[]{-50.00000000000002, -160.00},
77-
new[]{-50.00000000000001, -49.99999999999999},
78-
new[]{-100, -49.999999999999986}
77+
new[]{-50.0, -160.0},
78+
new[]{-50.0, -50.0},
79+
new[]{-100.0, -50.0}
7980
};
8081

8182
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
@@ -96,9 +97,9 @@ public void TestSTRotateOrigin()
9697
{
9798
var expected = new double[][]
9899
{
99-
new[]{50.00, 160.00},
100-
new[]{104.99999999999999 ,64.73720558371174},
101-
new[]{148.30127018922192 ,89.73720558371173}
100+
new[]{50.00, 160.0},
101+
new[]{105.0, 64.73720558371174},
102+
new[]{148.30127018922192, 89.73720558371173}
102103
};
103104

104105
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
@@ -110,7 +111,7 @@ public void TestSTRotateOrigin()
110111
.Select(g => g.Geometry.STRotate(Math.PI / 6.0, 50, 160))
111112
.Single() as NTSG.LineString;
112113

113-
CheckLineEquals(expected, result, 1.0e-8);
114+
CheckLineEquals(expected, result, 1.0E-8);
114115
}
115116
}
116117

@@ -119,8 +120,8 @@ public void TestSTRotateOriginGeom()
119120
{
120121
var expected = new double[][]
121122
{
122-
new[]{116.42245883568916 ,130.67207346706593},
123-
new[]{21.15966441940092 ,75.67207346706593},
123+
new[]{116.42245883568916, 130.67207346706593},
124+
new[]{21.15966441940092, 75.67207346706593},
124125
new[]{46.15966441940093, 32.370803277844}
125126
};
126127

@@ -142,8 +143,8 @@ public void TestSTRotateX()
142143
{
143144
var expected = new double[][]
144145
{
145-
new[]{1.0 ,-3.0 ,2.0},
146-
new[]{1.0 ,-1.0 ,1.0}
146+
new[]{1.0, -3.0, 2.0},
147+
new[]{1.0, -1.0, 1.0}
147148
};
148149

149150
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
@@ -164,8 +165,8 @@ public void TestSTRotateY()
164165
{
165166
var expected = new double[][]
166167
{
167-
new[]{3.0, 2.0 ,-1.0},
168-
new[]{1.0, 1.0 ,-1.0}
168+
new[]{3.0, 2.0, -1.0},
169+
new[]{1.0, 1.0, -1.0}
169170
};
170171

171172
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
@@ -231,7 +232,7 @@ public void TestSTScaleXY()
231232
var expected = new double[][]
232233
{
233234
new[]{0.5, 1.5, 3},
234-
new[]{0.5, 0.75 ,1}
235+
new[]{0.5, 0.75, 1}
235236
};
236237

237238
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
@@ -274,8 +275,8 @@ public void TestSTScaleFalseOrigin()
274275
{
275276
var expected = new double[][]
276277
{
277-
new[]{1.00 ,1.00},
278-
new[]{3.00,3.00}
278+
new[]{1.00, 1.00},
279+
new[]{3.00, 3.00}
279280
};
280281

281282
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
@@ -296,8 +297,8 @@ public void TestSTTranslatedXY()
296297
{
297298
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
298299
{
299-
const string geomText = "POINT(-71.01 42.37)";
300-
db.TestGeometries.Value(g => g.Id, 1).Value(p => p.Geometry, () => GeometryInput.STGeomFromText(geomText, 4326)).Insert();
300+
const string wkt = "POINT(-71.01 42.37)";
301+
db.TestGeometries.Value(g => g.Id, 1).Value(p => p.Geometry, () => GeometryInput.STGeomFromText(wkt, 4326)).Insert();
301302
var result = db.TestGeometries
302303
.Where(g => g.Id == 1)
303304
.Select(g => g.Geometry.STTranslate(1, 0))
@@ -313,8 +314,8 @@ public void TestSTTranslatedXYZ()
313314
{
314315
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
315316
{
316-
const string geomText = "POINT(0 0 0)";
317-
db.TestGeometries.Value(g => g.Id, 1).Value(p => p.Geometry, () => GeometryInput.STGeomFromText(geomText)).Insert();
317+
const string wkt = "POINT(0 0 0)";
318+
db.TestGeometries.Value(g => g.Id, 1).Value(p => p.Geometry, () => GeometryInput.STGeomFromText(wkt)).Insert();
318319
var result = db.TestGeometries
319320
.Where(g => g.Id == 1)
320321
.Select(g => g.Geometry.STTranslate(5, 12, 3))
@@ -336,8 +337,8 @@ public void TestSTTransScale()
336337

337338
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
338339
{
339-
const string geomText = "LINESTRING(1 2 3, 1 1 1)";
340-
db.TestGeometries.Value(g => g.Id, 1).Value(p => p.Geometry, () => GeometryInput.STGeomFromText(geomText)).Insert();
340+
const string wkt = "LINESTRING(1 2 3, 1 1 1)";
341+
db.TestGeometries.Value(g => g.Id, 1).Value(p => p.Geometry, () => GeometryInput.STGeomFromText(wkt)).Insert();
341342
var result = db.TestGeometries
342343
.Where(g => g.Id == 1)
343344
.Select(g => g.Geometry.STTransScale(0.5, 1, 1, 2))
@@ -347,21 +348,21 @@ public void TestSTTransScale()
347348
}
348349
}
349350

350-
private void CheckLineEquals(double[][] expected, NTSG.LineString result, double tolerance)
351+
private static void CheckLineEquals(double[][] expected, NTSG.LineString actual, double tolerance)
351352
{
352353
var pointsCount = expected.Length;
353-
var dimensionCount = expected[0].Length;
354+
var dimensionCount = expected[0].Length; // Depends on 2D / 3D geometry dimensions
354355

355-
for (int i = 0; i < pointsCount; i++)
356+
for (var i = 0; i < pointsCount; i++)
356357
{
357-
for (int j = 0; j < dimensionCount; j++)
358+
for (var j = 0; j < dimensionCount; j++)
358359
{
359360
var exp = expected[i][j];
360-
var res = result.GetCoordinateN(i).CoordinateValue[j];
361+
var res = actual.GetCoordinateN(i).CoordinateValue[j];
361362

362363
Assert.AreEqual(exp, res, tolerance);
363364
}
364365
}
365366
}
366367
}
367-
}
368+
}

LinqToDBPostGisNetTopologySuite.Tests/GeometryProcessingTests.cs

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,101 @@ public void TestSTChaikinSmoothing()
569569
}
570570
}
571571

572+
[Test]
573+
public void TestSTFilterByM()
574+
{
575+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
576+
{
577+
const string wkt = "LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)";
578+
db.TestGeometries
579+
.Value(g => g.Id, 1)
580+
.Value(p => p.Geometry, () => GeometryInput.STGeometryFromText(wkt).STSetEffectiveArea())
581+
.Insert();
582+
583+
var result = db.TestGeometries
584+
.Where(g => g.Id == 1)
585+
.Select(g => g.Geometry.STFilterByM(30).STAsText())
586+
.Single();
587+
588+
Assert.AreEqual("LINESTRING(5 2,7 25,10 10)", result);
589+
}
590+
}
591+
592+
[Test]
593+
public void TestSTSetEffectiveArea()
594+
{
595+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
596+
{
597+
const string wkt = "LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)";
598+
db.TestGeometries
599+
.Value(g => g.Id, 1)
600+
.Value(p => p.Geometry, () => GeometryInput.STGeometryFromText(wkt))
601+
.Insert();
602+
603+
var result1 = db.TestGeometries
604+
.Where(g => g.Id == 1)
605+
.Select(g => g.Geometry.STSetEffectiveArea().STAsText())
606+
.Single();
607+
608+
Assert.AreEqual("LINESTRING M (5 2 3.40282e+038,3 8 29,6 20 1.5,7 25 49.5,10 10 3.40282e+038)", result1);
609+
610+
var result2 = db.TestGeometries
611+
.Where(g => g.Id == 1)
612+
.Select(g => g.Geometry.STSetEffectiveArea(30).STAsText())
613+
.Single();
614+
615+
Assert.AreEqual("LINESTRING M (5 2 3.40282e+038,7 25 49.5,10 10 3.40282e+038)", result2);
616+
}
617+
}
618+
619+
[Test]
620+
public void TestSTSplit()
621+
{
622+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
623+
{
624+
db.TestGeometries
625+
.Value(g => g.Id, 1)
626+
.Value(p => p.Geometry, () => GeometryConstructors.STMakeLine(GeometryConstructors.STMakePoint(10, 10), GeometryConstructors.STMakePoint(190, 190)))
627+
.Insert();
628+
db.TestGeometries
629+
.Value(g => g.Id, 2)
630+
.Value(p => p.Geometry, () => GeometryInput.STGeomFromText("POINT(100 90)").STBuffer(50))
631+
.Insert();
632+
633+
var result = db.TestGeometries
634+
.Where(g => g.Id == 1)
635+
.Select(g => g.Geometry.STSplit(db.TestGeometries.Where(g2 => g2.Id == 2).Single().Geometry))
636+
.Single() as NTSG.GeometryCollection;
637+
638+
Assert.IsNotNull(result);
639+
}
640+
}
641+
642+
[Test]
643+
public void TestSTSymDifference()
644+
{
645+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
646+
{
647+
const string wkt1 = "LINESTRING(50 100, 50 200)";
648+
const string wkt2 = "LINESTRING(50 50, 50 150)";
649+
db.TestGeometries
650+
.Value(g => g.Id, 1)
651+
.Value(p => p.Geometry, () => GeometryInput.STGeometryFromText(wkt1))
652+
.Insert();
653+
db.TestGeometries
654+
.Value(g => g.Id, 2)
655+
.Value(p => p.Geometry, () => GeometryInput.STGeometryFromText(wkt2))
656+
.Insert();
657+
658+
var result = db.TestGeometries
659+
.Where(g => g.Id == 1)
660+
.Select(g => g.Geometry.STSymDifference(db.TestGeometries.Where(g2 => g2.Id == 2).Single().Geometry).STAsText())
661+
.Single();
662+
663+
Assert.AreEqual("MULTILINESTRING((50 150,50 200),(50 50,50 100))", result);
664+
}
665+
}
666+
572667
[Test]
573668
public void TestSTUnion()
574669
{
@@ -586,5 +681,45 @@ public void TestSTUnion()
586681
Assert.AreEqual("MULTIPOINT(1 2,-2 3)", union);
587682
}
588683
}
684+
685+
[Test]
686+
public void TestSTVoronoiLines()
687+
{
688+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
689+
{
690+
const string wkt = "MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)";
691+
db.TestGeometries
692+
.Value(g => g.Id, 1)
693+
.Value(p => p.Geometry, () => GeometryInput.STGeometryFromText(wkt))
694+
.Insert();
695+
696+
var result = db.TestGeometries
697+
.Where(g => g.Id == 1)
698+
.Select(g => g.Geometry.STVoronoiLines(30.0).STAsText())
699+
.Single();
700+
701+
Assert.AreEqual("MULTILINESTRING((135.555555555556 270,36.8181818181818 92.2727272727273),(36.8181818181818 92.2727272727273,-110 43.3333333333333),(230 -45.7142857142858,36.8181818181818 92.2727272727273))", result);
702+
}
703+
}
704+
705+
[Test]
706+
public void TestSTVoronoiPolygons()
707+
{
708+
using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
709+
{
710+
const string wkt = "MULTIPOINT (50 30, 60 30, 100 100,10 150, 110 120)";
711+
db.TestGeometries
712+
.Value(g => g.Id, 1)
713+
.Value(p => p.Geometry, () => GeometryInput.STGeomFromText(wkt))
714+
.Insert();
715+
716+
var result1 = db.TestGeometries
717+
.Where(g => g.Id == 1)
718+
.Select(g => g.Geometry.STVoronoiPolygons())
719+
.Single() as NTSG.GeometryCollection;
720+
721+
Assert.IsNotNull(result1);
722+
}
723+
}
589724
}
590725
}

0 commit comments

Comments
 (0)