Esempio n. 1
0
        public void TestSTBuffer()
        {
            using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
            {
                var point1  = db.Select(() => GeometryInput.STGeomFromText("POINT(100 90)"));
                var buffer1 = db.Select(() => GeometryProcessing.STBuffer(point1, 50, "quad_segs=8").STGeometryType());
                Assert.AreEqual("ST_Polygon", buffer1);

                var buffer2 = db.Select(() => GeometryProcessing.STBuffer(point1, 50).STNPoints());
                Assert.AreEqual(33, buffer2);

                var buffer3 = db.Select(() => GeometryProcessing.STBuffer(point1, 50, 2).STNPoints());
                Assert.AreEqual(9, buffer3);

                Assert.IsNull(db.Select(() => GeometryProcessing.STBuffer(null, 0)));
                Assert.IsNull(db.Select(() => GeometryProcessing.STBuffer(null, 0, null)));

                db.TestGeographies
                .Value(g => g.Id, 1)
                .Value(g => g.Geography, () => GeometryInput.STGeogFromText("POINT(0 0)"))
                .Insert();

                var geographyPointBufferArea = db.TestGeographies
                                               .Where(g => g.Id == 1)
                                               .Select(g => g.Geography.STBuffer(50.0).STArea())
                                               .Single();

                Assert.AreEqual(7788.324, geographyPointBufferArea.Value, 1.0E-3);
            }
        }
        public void TestSTGeographyFromText()
        {
            using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
            {
                const string Wkt1        = "POINT(177.0092 38.889588)";
                var          geography11 = db.Select(() => GeometryInput.STGeographyFromText(Wkt1));

                Assert.IsNotNull(geography11);
                Assert.AreEqual(SRID4326, geography11.SRID);
                Assert.AreEqual("Point", geography11.GeometryType);
                Assert.AreEqual(177.0092, geography11.Coordinates[0].X, 1.0E-4);
                Assert.AreEqual(38.889588, geography11.Coordinates[0].Y, 1.0E-6);

                db.TestGeographies
                .Value(g => g.Id, 1)
                .Value(g => g.Geography, () => GeometryInput.STGeographyFromText(Wkt1))
                .Insert();

                var geography12 = db.TestGeographies
                                  .Where(g => g.Id == 1)
                                  .Select(g => g.Geography)
                                  .Single();

                Assert.IsNotNull(geography12);
                Assert.AreEqual(SRID4326, geography12.SRID);
                Assert.AreEqual("Point", geography12.GeometryType);
                Assert.AreEqual(177.0092, geography12.Coordinates[0].X, 1.0E-4);
                Assert.AreEqual(38.889588, geography12.Coordinates[0].Y, 1.0E-6);


                const string Wkt2        = "SRID=4267;POINT(-77.0092 38.889588)";
                var          geography21 = db.Select(() => GeometryInput.STGeographyFromText(Wkt2));

                Assert.IsNotNull(geography21);
                Assert.AreEqual(4267, geography21.SRID);
                Assert.AreEqual("Point", geography21.GeometryType);
                Assert.AreEqual(-77.0092, geography21.Coordinates[0].X, 1.0E-4);
                Assert.AreEqual(38.889588, geography21.Coordinates[0].Y, 1.0E-6);


                // Test for alias ST_GeogFromText = ST_GeographyFromText
                Assert.AreEqual(
                    db.Select(() => GeometryInput.STGeographyFromText(Wkt2).STAsEWKT()),
                    db.Select(() => GeometryInput.STGeogFromText(Wkt2).STAsEWKT()));


                Assert.IsNull(db.Select(() => GeometryInput.STGeographyFromText(null)));
                Assert.IsNull(db.Select(() => GeometryInput.STGeogFromText(null)));
            }
        }
        public void TestSTAsBinary()
        {
            using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
            {
                const string Wkt1 = "POINT(2.0 4.0)";
                db.TestGeometries.Value(g => g.Id, 1).Value(g => g.Geometry, () => GeometryInput.STGeomFromText(Wkt1)).Insert();

                var wkb = db.TestGeometries.Select(g => g.Geometry.STAsBinary()).Single();

                Assert.AreEqual(21, wkb.Length);
                Assert.AreEqual(1, wkb[0]); // TODO: depends on environment endianness
                Assert.AreEqual(1, BitConverter.ToUInt32(wkb, 1));
                Assert.AreEqual(2, BitConverter.ToDouble(wkb, 5));
                Assert.AreEqual(4, BitConverter.ToDouble(wkb, 13));

                const string Wkt2 = "POLYGON((0 0,0 1,1 1,1 0,0 0))";

                var wkbLittleEndian = db.Select(() => GeometryInput.STGeometryFromText(Wkt2).STAsBinary(EndiannessEncoding.LittleEndian));
                Assert.AreEqual(1, wkbLittleEndian[0]);
                Assert.AreEqual(3, wkbLittleEndian[1]);

                var wkbBigEndian = db.Select(() => GeometryInput.STGeometryFromText(Wkt2).STAsBinary(EndiannessEncoding.BigEndian));
                Assert.AreEqual(0, wkbBigEndian[0]);
                Assert.AreEqual(3, wkbBigEndian[4]);

                Assert.IsNull(db.Select(() => GeometryOutput.STAsBinary(null, EndiannessEncoding.BigEndian)));

                // geography
                db.TestGeographies
                .Value(g => g.Id, 1)
                .Value(g => g.Geography, () => GeometryInput.STGeogFromText(Wkt1))
                .Insert();

                var wkbGeographyPoint = db.TestGeographies
                                        .Where(g => g.Id == 1)
                                        .Select(g => g.Geography.STAsBinary())
                                        .Single();

                Assert.AreEqual(21, wkbGeographyPoint.Length);
                Assert.AreEqual(1, wkbGeographyPoint[0]); // TODO: depends on environment endianness
                Assert.AreEqual(1, BitConverter.ToUInt32(wkbGeographyPoint, 1));
                Assert.AreEqual(2, BitConverter.ToDouble(wkbGeographyPoint, 5));
                Assert.AreEqual(4, BitConverter.ToDouble(wkbGeographyPoint, 13));
            }
        }
Esempio n. 4
0
        public void TestSTCentroid()
        {
            using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
            {
                const string Wkt1 = "MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )";

                db.TestGeometries
                .Value(g => g.Id, 1)
                .Value(g => g.Geometry, () => GeometryInput.STGeomFromText(Wkt1))
                .Insert();

                var centroid1 = db.TestGeometries
                                .Where(g => g.Id == 1)
                                .Select(g => g.Geometry.STCentroid())
                                .Single() as NTSGS.Point;

                Assert.AreEqual(2.30769230769231, centroid1.X, 1.0E-12);
                Assert.AreEqual(3.30769230769231, centroid1.Y, 1.0E-12);

                const string Wkt2 = "LINESTRING(0 30,120 30)";

                db.TestGeographies
                .Value(g => g.Id, 1)
                .Value(g => g.Geography, () => GeometryInput.STGeogFromText(Wkt2))
                .Insert();

                var centroid2 = db.TestGeographies
                                .Where(g => g.Id == 1)
                                .Select(g => g.Geography.STCentroid())
                                .Single() as NTSGS.Point;

                Assert.AreEqual(4326, centroid2.SRID);
                Assert.AreEqual("Point", centroid2.GeometryType);
                Assert.AreEqual(60.0, centroid2.X, 1.0E-9);
                Assert.AreEqual(49.1066, centroid2.Y, 1.0E-4);
            }
        }
        public void TestSTAsText()
        {
            using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
            {
                var g1 = db.Select(() => GeometryConstructors.STMakePoint(-71.064544, 42.28787));

                Assert.AreEqual("POINT(-71.064544 42.28787)", db.Select(() => GeometryOutput.STAsText(g1)));
                Assert.AreEqual("POINT(-71.065 42.288)", db.Select(() => GeometryOutput.STAsText(g1, 3)));
                Assert.AreEqual("POINT(-71 42)", db.Select(() => GeometryOutput.STAsText(g1, 0)));

                Assert.AreEqual(
                    "POLYGON((0 0,0 1,1 1,1 0,0 0))",
                    db.Select(() => GeometryOutput.STAsText("01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000")));

                Assert.AreEqual(
                    "POINT(111.11 1.11)",
                    db.Select(() => GeometryOutput.STAsText(GeometryInput.STGeomFromEWKT("SRID=4326;POINT(111.1111111 1.1111111)"), 2)));

                Assert.IsNull(db.Select(() => GeometryOutput.STAsText((NTSG)null)));


                const string Wkt2 = "LINESTRING(0 30,120 30)";

                db.TestGeographies
                .Value(g => g.Id, 1)
                .Value(g => g.Geography, () => GeometryInput.STGeogFromText(Wkt2))
                .Insert();

                var geographyText = db.TestGeographies
                                    .Where(g => g.Id == 1)
                                    .Select(g => g.Geography.STAsText())
                                    .Single();

                Assert.AreEqual(Wkt2, geographyText);
            }
        }
        public void TestSTContainsSTCoversSTExteriorRing()
        {
            using (var db = new PostGisTestDataConnection(TestDatabaseConnectionString))
            {
                const string Wkt1 = "POINT(1 2)";
                db.TestGeometries.Value(g => g.Id, 1).Value(g => g.Geometry, () => GeometryInput.STGeomFromText(Wkt1).STBuffer(10)).Insert();
                var smallc = db.TestGeometries.Single(g => g.Id == 1).Geometry;

                const string Wkt2 = "POINT(1 2)";
                db.TestGeometries.Value(g => g.Id, 2).Value(g => g.Geometry, () => GeometryInput.STGeomFromText(Wkt2).STBuffer(20)).Insert();

                var bigc = db.TestGeometries.Single(g => g.Id == 2).Geometry;
                db.TestGeometries.Value(g => g.Id, 3).Value(g => g.Geometry, () => GeometryInput.STGeomFromText(Wkt1)).Insert();

                Assert.IsTrue(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STCovers(smallc)).Single());
                Assert.IsFalse(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STCovers(bigc)).Single());
                Assert.IsTrue(db.TestGeometries.Where(g => g.Id == 2).Select(g => g.Geometry.STCovers(bigc.STExteriorRing())).Single());
                Assert.IsFalse(db.TestGeometries.Where(g => g.Id == 2).Select(g => g.Geometry.STContains(bigc.STExteriorRing())).Single());

                Assert.IsTrue(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STCoveredBy(smallc)).Single());
                Assert.IsTrue(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STCoveredBy(bigc)).Single());
                Assert.IsTrue(db.TestGeometries.Where(g => g.Id == 2).Select(g => g.Geometry.STExteriorRing().STCoveredBy(bigc)).Single());
                Assert.IsFalse(db.TestGeometries.Where(g => g.Id == 2).Select(g => g.Geometry.STExteriorRing().STWithin(bigc)).Single());

                Assert.IsNull(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STContains(null)).Single());
                Assert.IsNull(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STCovers(null)).Single());
                Assert.IsNull(db.TestGeometries.Where(g => g.Id == 1).Select(g => g.Geometry.STCoveredBy(null)).Single());
                Assert.IsNull(db.TestGeometries.Where(g => g.Id == 3).Select(g => g.Geometry.STExteriorRing()).Single());
                Assert.IsNull(db.TestGeometries.Where(g => g.Id == 2).Select(g => g.Geometry.STExteriorRing().STWithin(null)).Single());

                Assert.IsTrue(db.Select(() => SpatialRelationships.STCovers(
                                            "POLYGON((0 0,1 0,1 1,0 1, 0 0))",
                                            "LINESTRING(0.2 0.2, 0.8 0.8)")));

                Assert.IsFalse(db.Select(() => SpatialRelationships.STCovers(
                                             "POLYGON((0 0,1 0,1 1,0 1, 0 0))",
                                             "LINESTRING(0.2 0.2, 1.2 1.2)")));

                Assert.IsTrue(db.Select(() => SpatialRelationships.STCoveredBy(
                                            "LINESTRING(0.2 0.2, 0.8 0.8)",
                                            "POLYGON((0 0,1 0,1 1,0 1, 0 0))")));

                Assert.IsFalse(db.Select(() => SpatialRelationships.STCoveredBy(
                                             "LINESTRING(0.2 0.2, 1.2 1.2)",
                                             "POLYGON((0 0,1 0,1 1,0 1, 0 0))")));


                db.TestGeographies
                .Value(g => g.Id, 1)
                .Value(g => g.Geography, () => GeometryInput.STGeogFromText("SRID=4326;POINT(-99.327 31.4821)"))
                .Insert();

                db.TestGeographies
                .Value(g => g.Id, 2)
                .Value(g => g.Geography, () => GeometryInput.STGeogFromText("SRID=4326;POINT(-99.33 31.483)"))
                .Insert();

                var polyCoversPoint = db.TestGeographies
                                      .Where(g => g.Id == 1)
                                      .Select(g => g.Geography
                                              .STBuffer(300)
                                              .STCovers(db.TestGeographies.Where(g0 => g0.Id == 2).Single().Geography))
                                      .Single();

                Assert.IsFalse(polyCoversPoint);

                var buffer10mCoversPoint = db.TestGeographies
                                           .Where(g => g.Id == 2)
                                           .Select(g => g.Geography
                                                   .STBuffer(10)
                                                   .STCovers(db.TestGeographies.Where(g0 => g0.Id == 2).Single().Geography))
                                           .Single();

                Assert.IsTrue(buffer10mCoversPoint);
            }
        }