@@ -233,6 +233,342 @@ public void TestSTMakeValid()
233233 }
234234 }
235235
236+ [ Test ]
237+ public void TestSTMinimumBoundingCircle ( )
238+ {
239+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
240+ {
241+ const string wkt = "LINESTRING(55 75,125 150)" ;
242+ db . TestGeometries
243+ . Value ( g => g . Id , 1 )
244+ . Value ( p => p . Geometry , ( ) =>
245+ GeometryConstructors . STCollect (
246+ GeometryInput . STGeomFromText ( wkt ) ,
247+ GeometryConstructors . STPoint ( 20 , 80 ) ) )
248+ . Insert ( ) ;
249+
250+ var geometry = db . TestGeometries
251+ . Where ( g => g . Id == 1 )
252+ . Select ( g => g . Geometry . STAsText ( ) )
253+ . Single ( ) ;
254+
255+ Assert . AreEqual ( "GEOMETRYCOLLECTION(LINESTRING(55 75,125 150),POINT(20 80))" , geometry ) ;
256+
257+ // TODO: fix 'points must form a closed linestring'
258+ ////var circle = db.TestGeometries
259+ //// .Where(g => g.Id == 1)
260+ //// .Select(g => g.Geometry.STMinimumBoundingCircle(8))
261+ //// .Single();
262+
263+ //Assert.AreEqual(135.59714732062, circle.InteriorRings[0].GetPointN(0).X, 1.0E-8);
264+ //Assert.AreEqual(115, circle.InteriorRings[0].GetPointN(0).Y, 1.0E-8);
265+ }
266+ }
267+
268+ [ Test ]
269+ public void TestSTOrientedEnvelope ( )
270+ {
271+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
272+ {
273+ const string wkt = "MULTIPOINT ((0 0), (-1 -1), (3 2))" ;
274+ db . TestGeometries
275+ . Value ( g => g . Id , 1 )
276+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromText ( wkt ) )
277+ . Insert ( ) ;
278+
279+ db . TestGeometries
280+ . Value ( g => g . Id , 2 )
281+ . Value ( p => p . Geometry , ( ) =>
282+ GeometryConstructors . STCollect (
283+ GeometryInput . STGeomFromText ( "LINESTRING(55 75,125 150)" ) ,
284+ GeometryConstructors . STPoint ( 20 , 80 ) ) )
285+ . Insert ( ) ;
286+
287+ var result1 = db . TestGeometries
288+ . Where ( g => g . Id == 1 )
289+ . Select ( g => g . Geometry . STOrientedEnvelope ( ) . STAsText ( ) )
290+ . Single ( ) ;
291+
292+ Assert . AreEqual ( "POLYGON((3 2,2.88 2.16,-1.12 -0.84,-1 -1,3 2))" , result1 ) ;
293+
294+ var result2 = db . TestGeometries
295+ . Where ( g => g . Id == 2 )
296+ . Select ( g => g . Geometry . STOrientedEnvelope ( ) )
297+ . Single ( ) as NTSG . Polygon ;
298+
299+ Assert . AreEqual ( 20 , result2 . ExteriorRing . GetPointN ( 0 ) . X , 1.0E-8 ) ;
300+ Assert . AreEqual ( 80 , result2 . ExteriorRing . GetPointN ( 0 ) . Y , 1.0E-8 ) ;
301+ }
302+ }
303+
304+ [ Test ]
305+ public void TestSTNode ( )
306+ {
307+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
308+ {
309+ const string wkt = "LINESTRINGZ(0 0 0, 10 10 10, 0 10 5, 10 0 3)" ;
310+ db . TestGeometries
311+ . Value ( g => g . Id , 1 )
312+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromText ( wkt ) )
313+ . Insert ( ) ;
314+
315+ var result = db . TestGeometries
316+ . Where ( g => g . Id == 1 )
317+ . Select ( g => g . Geometry . STNode ( ) . STAsText ( ) )
318+ . Single ( ) ;
319+
320+ Assert . AreEqual ( "MULTILINESTRING Z ((0 0 0,5 5 4.5),(5 5 4.5,10 10 10,0 10 5,5 5 4.5),(5 5 4.5,10 0 3))" , result ) ;
321+ }
322+ }
323+
324+ [ Test ]
325+ public void TestSTOffsetCurve ( )
326+ {
327+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
328+ {
329+ const string wkt = @"LINESTRING(164 16,144 16,124 16,104 16,84 16,64 16,
330+ 44 16,24 16,20 16,18 16,17 17,
331+ 16 18,16 20,16 40,16 60,16 80,16 100,
332+ 16 120,16 140,16 160,16 180,16 195)" ;
333+ db . TestGeometries
334+ . Value ( g => g . Id , 1 )
335+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromText ( wkt ) )
336+ . Insert ( ) ;
337+
338+ var result = db . TestGeometries
339+ . Where ( g => g . Id == 1 )
340+ . Select ( g => g . Geometry . STOffsetCurve ( 15 , "quad_segs=4 join=round" ) . STAsText ( ) )
341+ . Single ( ) ;
342+
343+ Assert . AreEqual ( "LINESTRING(164 1,18 1,12.2597485145237 2.1418070123307,7.39339828220179 5.39339828220179,5.39339828220179 7.39339828220179,2.14180701233067 12.2597485145237,1 18,1 195)" , result ) ;
344+ }
345+ }
346+
347+ [ Test ]
348+ public void TestSTPointOnSurface ( )
349+ {
350+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
351+ {
352+ const string ewkt = "LINESTRING(0 5 1, 0 0 1, 0 10 2)" ;
353+ db . TestGeometries
354+ . Value ( g => g . Id , 1 )
355+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromEWKT ( ewkt ) )
356+ . Insert ( ) ;
357+
358+ var result = db . TestGeometries
359+ . Where ( g => g . Id == 1 )
360+ . Select ( g => g . Geometry . STPointOnSurface ( ) . STAsEWKT ( ) )
361+ . Single ( ) ;
362+
363+ Assert . AreEqual ( "POINT(0 0 1)" , result ) ;
364+ }
365+ }
366+
367+ [ Test ]
368+ public void TestSTRemoveRepeatedPoints ( )
369+ {
370+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
371+ {
372+ const string wkt = "LINESTRING(0 5, 0 0, 0 0, 0 10)" ;
373+ db . TestGeometries
374+ . Value ( g => g . Id , 1 )
375+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromText ( wkt ) )
376+ . Insert ( ) ;
377+
378+ var result = db . TestGeometries
379+ . Where ( g => g . Id == 1 )
380+ . Select ( g => g . Geometry . STRemoveRepeatedPoints ( 1 ) . AsText ( ) )
381+ . Single ( ) ;
382+
383+ Assert . AreEqual ( "LINESTRING (0 5, 0 0, 0 10)" , result ) ;
384+ }
385+ }
386+
387+ [ Test ]
388+ public void TestSTSharedPaths ( )
389+ {
390+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
391+ {
392+ const string wkt1 = "MULTILINESTRING((26 125,26 200,126 200,126 125,26 125),(51 150, 101 150, 76 175, 51 150))" ;
393+ const string wkt2 = "LINESTRING(151 100,126 156.25,126 125,90 161, 76 175)" ;
394+ db . TestGeometries
395+ . Value ( g => g . Id , 1 )
396+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromText ( wkt1 ) )
397+ . Insert ( ) ;
398+ db . TestGeometries
399+ . Value ( g => g . Id , 2 )
400+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromText ( wkt2 ) )
401+ . Insert ( ) ;
402+
403+ var result = db . TestGeometries
404+ . Where ( g => g . Id == 1 )
405+ . Select ( g => g . Geometry . STSharedPaths ( db . TestGeometries . Where ( g2 => g2 . Id == 2 ) . Single ( ) . Geometry ) . AsText ( ) )
406+ . Single ( ) ;
407+
408+ Assert . AreEqual ( "GEOMETRYCOLLECTION (MULTILINESTRING ((126 156.25, 126 125), (101 150, 90 161), (90 161, 76 175)), MULTILINESTRING EMPTY)" , result ) ;
409+ }
410+ }
411+
412+ [ Test ]
413+ public void TestSTShiftLongitude ( )
414+ {
415+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
416+ {
417+ const string ewkt1 = "SRID=4326;POINT(-118.58 38.38 10)" ;
418+ const string ewkt2 = "SRID=4326;POINT(241.42 38.38 10)" ;
419+ db . TestGeometries
420+ . Value ( g => g . Id , 1 )
421+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromEWKT ( ewkt1 ) )
422+ . Insert ( ) ;
423+ db . TestGeometries
424+ . Value ( g => g . Id , 2 )
425+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeomFromEWKT ( ewkt2 ) )
426+ . Insert ( ) ;
427+
428+ var result1 = db . TestGeometries
429+ . Where ( g => g . Id == 1 )
430+ . Select ( g => g . Geometry . STShiftLongitude ( ) . STAsEWKT ( ) )
431+ . Single ( ) ;
432+
433+ var result2 = db . TestGeometries
434+ . Where ( g => g . Id == 2 )
435+ . Select ( g => g . Geometry . STShiftLongitude ( ) . STAsEWKT ( ) )
436+ . Single ( ) ;
437+
438+ Assert . AreEqual ( "SRID=4326;POINT(241.42 38.38 10)" , result1 ) ;
439+ Assert . AreEqual ( "SRID=4326;POINT(-118.58 38.38 10)" , result2 ) ;
440+ }
441+ }
442+
443+ [ Test ]
444+ public void TestSTSimplify ( )
445+ {
446+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
447+ {
448+ const string wkt = "POINT(1 3)" ;
449+ db . TestGeometries
450+ . Value ( g => g . Id , 1 )
451+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeometryFromText ( wkt ) . STBuffer ( 10 , 12 ) )
452+ . Insert ( ) ;
453+
454+ var result1 = db . TestGeometries
455+ . Where ( g => g . Id == 1 )
456+ . Select ( g => g . Geometry . STNPoints ( ) )
457+ . Single ( ) ;
458+
459+ Assert . AreEqual ( 49 , result1 ) ;
460+
461+ var result2 = db . TestGeometries
462+ . Where ( g => g . Id == 1 )
463+ . Select ( g => g . Geometry . STSimplify ( 0.1 ) . STNPoints ( ) )
464+ . Single ( ) ;
465+
466+ Assert . AreEqual ( 33 , result2 ) ;
467+
468+ var result3 = db . TestGeometries
469+ . Where ( g => g . Id == 1 )
470+ . Select ( g => g . Geometry . STSimplify ( 0.5 ) . STNPoints ( ) )
471+ . Single ( ) ;
472+
473+ Assert . AreEqual ( 17 , result3 ) ;
474+
475+ var result4 = db . TestGeometries
476+ . Where ( g => g . Id == 1 )
477+ . Select ( g => g . Geometry . STSimplify ( 1.0 ) . STNPoints ( ) )
478+ . Single ( ) ;
479+
480+ Assert . AreEqual ( 9 , result4 ) ;
481+
482+ var result5 = db . TestGeometries
483+ . Where ( g => g . Id == 1 )
484+ . Select ( g => g . Geometry . STSimplify ( 10.0 ) . STNPoints ( ) )
485+ . Single ( ) ;
486+
487+ Assert . AreEqual ( 4 , result5 ) ;
488+
489+ var result6 = db . TestGeometries
490+ . Where ( g => g . Id == 1 )
491+ . Select ( g => g . Geometry . STSimplify ( 100.0 ) . STNPoints ( ) )
492+ . Single ( ) ;
493+
494+ Assert . IsNull ( result6 ) ;
495+ }
496+ }
497+
498+ [ Test ]
499+ public void TestSTSimplifyPreserveTopology ( )
500+ {
501+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
502+ {
503+ const string wkt = "POINT(1 3)" ;
504+ db . TestGeometries
505+ . Value ( g => g . Id , 1 )
506+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeometryFromText ( wkt ) . STBuffer ( 10 , 12 ) )
507+ . Insert ( ) ;
508+
509+ var result1 = db . TestGeometries
510+ . Where ( g => g . Id == 1 )
511+ . Select ( g => g . Geometry . STNPoints ( ) )
512+ . Single ( ) ;
513+
514+ Assert . AreEqual ( 49 , result1 ) ;
515+
516+ var result2 = db . TestGeometries
517+ . Where ( g => g . Id == 1 )
518+ . Select ( g => g . Geometry . STSimplifyPreserveTopology ( 1.0 ) . STNPoints ( ) )
519+ . Single ( ) ;
520+
521+ Assert . AreEqual ( 9 , result2 ) ;
522+
523+ var result3 = db . TestGeometries
524+ . Where ( g => g . Id == 1 )
525+ . Select ( g => g . Geometry . STSimplifyPreserveTopology ( 10.0 ) . STNPoints ( ) )
526+ . Single ( ) ;
527+
528+ Assert . AreEqual ( 5 , result3 ) ;
529+ }
530+ }
531+
532+ [ Test ]
533+ public void TestSTSimplifyVW ( )
534+ {
535+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
536+ {
537+ const string wkt = "LINESTRING(5 2, 3 8, 6 20, 7 25, 10 10)" ;
538+ db . TestGeometries
539+ . Value ( g => g . Id , 1 )
540+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeometryFromText ( wkt ) )
541+ . Insert ( ) ;
542+
543+ var result = db . TestGeometries
544+ . Where ( g => g . Id == 1 )
545+ . Select ( g => g . Geometry . STSimplifyVW ( 30 ) . STAsText ( ) )
546+ . Single ( ) ;
547+
548+ Assert . AreEqual ( "LINESTRING(5 2,7 25,10 10)" , result ) ;
549+ }
550+ }
551+
552+ [ Test ]
553+ public void TestSTChaikinSmoothing ( )
554+ {
555+ using ( var db = new PostGisTestDataConnection ( TestDatabaseConnectionString ) )
556+ {
557+ const string wkt = "POLYGON((0 0, 8 8, 0 16, 0 0))" ;
558+ db . TestGeometries
559+ . Value ( g => g . Id , 1 )
560+ . Value ( p => p . Geometry , ( ) => GeometryInput . STGeometryFromText ( wkt ) )
561+ . Insert ( ) ;
562+
563+ var result = db . TestGeometries
564+ . Where ( g => g . Id == 1 )
565+ . Select ( g => g . Geometry . STChaikinSmoothing ( ) . STAsText ( ) )
566+ . Single ( ) ;
567+
568+ Assert . AreEqual ( "POLYGON((2 2,6 6,6 10,2 14,0 12,0 4,2 2))" , result ) ;
569+ }
570+ }
571+
236572 [ Test ]
237573 public void TestSTUnion ( )
238574 {
0 commit comments