Ejemplo n.º 1
0
        private static void AddRingByBuilder(SqlGeometryBuilder builder, SqlGeometry ring)
        {
            try
            {
                var firstPoint = ring.STPointN(1);
                var startPoint = firstPoint;
                var pointCount = ring.STNumPoints();
                // Begin the polygon with the first point
                builder.BeginFigure((double)firstPoint.STX, (double)firstPoint.STY);
                // While there are still unchecked points in polygon
                for (int i = 2; i <= pointCount; i++)
                {
                    var secondPoint = ring.STPointN(i);

                    builder.AddLine((double)secondPoint.STX, (double)secondPoint.STY);
                }
                // Add last point - the same as first
                builder.AddLine((double)startPoint.STX, (double)startPoint.STY);
                builder.EndFigure();
            }
            catch (System.Exception ex)
            {
                throw new Exception(string.Format("  AddRingByBuilder: {0}", ex.Message));
            }
        }
        public static SqlGeometry Extend(
            SqlGeometry @geom1,
            SqlGeometry @geom2,
            SqlInt32 @Offset)
        {
            // Start the LineString
            SqlGeometryBuilder gb = new SqlGeometryBuilder();

            gb.SetSrid((int)(@geom1.STSrid));
            gb.BeginGeometry(OpenGisGeometryType.LineString);
            gb.BeginFigure(
                (double)@geom1.STStartPoint().STX,
                (double)@geom1.STStartPoint().STY
                );
            // Add the points from the first geometry
            for (int x = 2; x <= (int)@geom1.STNumPoints(); x++)
            {
                gb.AddLine(
                    (double)@geom1.STPointN(x).STX,
                    (double)@geom1.STPointN(x).STY
                    );
            }
            // Add the points from the second geometry
            for (int x = 1 + (int)@Offset; x <= (int)@geom2.STNumPoints(); x++)
            {
                gb.AddLine(
                    (double)@geom2.STPointN(x).STX,
                    (double)@geom2.STPointN(x).STY
                    );
            }
            gb.EndFigure();
            gb.EndGeometry();
            return(gb.ConstructedGeometry);
        }
        public static SqlGeometry MakeGeometry(List <Point> points, bool isClosed, int srid = 32639)
        {
            SqlGeometryBuilder builder = new SqlGeometryBuilder();

            builder.SetSrid(srid);

            builder.BeginGeometry(isClosed ? OpenGisGeometryType.Polygon : OpenGisGeometryType.LineString);

            builder.BeginFigure(points[0].X, points[0].Y);

            for (int i = 1; i < points.Count; i++)
            {
                builder.AddLine(points[i].X, points[i].Y);
            }

            if (isClosed)
            {
                builder.AddLine(points[0].X, points[0].Y);
            }

            builder.EndFigure();

            builder.EndGeometry();

            return(builder.ConstructedGeometry.MakeValid());
        }
 // This is where the real work is done.
 public void AddLine(double latitude, double longitude, double?z, double?m)
 {
     // If current measure is betweem start measure and end measure, we should add segment to the result linestring
     if (m > _startPoint.M.Value && m < _endPoint.M.Value)
     {
         _target.AddLine(latitude, longitude, z, m);
     }
 }
 public void BeginFigure(double x, double y, double?z, double?m)
 {
     ++_indexCounter;
     if (_isFirstSegment)
     {
         _target.BeginFigure(x, y, z, m);
     }
     else
     {
         _target.AddLine(x, y, z, m);
     }
 }
        // Construct a triangle from 3 vertices
        private static SqlGeometry Triangle3dFromPoints(SimplePoint3d p1, SimplePoint3d p2, SimplePoint3d p3, int srid)
        {
            SqlGeometryBuilder TriangleBuilder = new SqlGeometryBuilder();

            TriangleBuilder.SetSrid(srid);
            TriangleBuilder.BeginGeometry(OpenGisGeometryType.Polygon);
            TriangleBuilder.BeginFigure(p1.x, p1.y, p1.z, null);
            TriangleBuilder.AddLine(p2.x, p2.y, p2.z, null);
            TriangleBuilder.AddLine(p3.x, p3.y, p3.z, null);
            TriangleBuilder.AddLine(p1.x, p1.y, p1.z, null);
            TriangleBuilder.EndFigure();
            TriangleBuilder.EndGeometry();
            return(TriangleBuilder.ConstructedGeometry);
        }
        private SqlGeometry Sample_Polygon(int srid)
        {
            SqlGeometryBuilder builder = new SqlGeometryBuilder();

            builder.SetSrid(srid);
            builder.BeginGeometry(OpenGisGeometryType.Polygon);
            builder.BeginFigure(10, 110);
            builder.AddLine(60, 10);
            builder.AddLine(110, 110);
            builder.AddLine(10, 110);
            builder.EndFigure();
            builder.EndGeometry();
            return(builder.ConstructedGeometry);
        }
        SqlGeometry GetGeoRectangle(PointF topleft, PointF bottomright)
        {
            var geomBuilder = new SqlGeometryBuilder();

            geomBuilder.SetSrid((0));
            geomBuilder.BeginGeometry(OpenGisGeometryType.Polygon);
            geomBuilder.BeginFigure(topleft.X, topleft.Y);
            geomBuilder.AddLine(topleft.X, bottomright.Y);
            geomBuilder.AddLine(bottomright.X, bottomright.Y);
            geomBuilder.AddLine(bottomright.X, topleft.X);
            geomBuilder.AddLine(topleft.X, topleft.Y);
            geomBuilder.EndFigure();
            geomBuilder.EndGeometry();
            return(geomBuilder.ConstructedGeometry);
        }
Ejemplo n.º 9
0
        public static SqlGeometry AsGeomety(this BoundingBox bbox, int srid = 4326)
        {
            SqlGeometryBuilder gb = new SqlGeometryBuilder();

            gb.SetSrid(srid);
            gb.BeginGeometry(OpenGisGeometryType.Polygon);
            gb.BeginFigure(bbox.xMin, bbox.yMax);
            gb.AddLine(bbox.xMax, bbox.yMax);
            gb.AddLine(bbox.xMax, bbox.yMin);
            gb.AddLine(bbox.xMin, bbox.yMin);
            gb.AddLine(bbox.xMin, bbox.yMax);
            gb.EndFigure();
            gb.EndGeometry();
            return(gb.ConstructedGeometry);
        }
        SqlGeometry GetGeoRectangle(double Lon1, double Lat1, double Lon2, double Lat2)
        {
            var geomBuilder = new SqlGeometryBuilder();

            geomBuilder.SetSrid((0));
            geomBuilder.BeginGeometry(OpenGisGeometryType.Polygon);
            geomBuilder.BeginFigure(Lon1, Lat1);
            geomBuilder.AddLine(Lon1, Lat2);
            geomBuilder.AddLine(Lon2, Lat2);
            geomBuilder.AddLine(Lon2, Lat1);
            geomBuilder.AddLine(Lon1, Lat1);
            geomBuilder.EndFigure();
            geomBuilder.EndGeometry();
            return(geomBuilder.ConstructedGeometry);
        }
        private void AddCoordinates(ICoordinate[] coordinates)
        {
            int points = 0;

            Array.ForEach <ICoordinate>(coordinates, delegate(ICoordinate coordinate)
            {
                double?z = null;
                if (!double.IsNaN(coordinate.Z) && !double.IsInfinity(coordinate.Z))
                {
                    z = coordinate.Z;
                }
                if (points == 0)
                {
                    builder.BeginFigure(coordinate.X, coordinate.Y, z, null);
                }
                else
                {
                    builder.AddLine(coordinate.X, coordinate.Y, z, null);
                }
                points++;
            });
            if (points != 0)
            {
                builder.EndFigure();
            }
        }
        private static void AddLineStringOrRing <T>(SqlGeometryBuilder builder, Geometry <T> geometry, bool isRing) where T : IPoint, new()
        {
            builder.BeginFigure(geometry.Points[0].X, geometry.Points[0].Y);

            for (int i = 1; i < geometry.Points.Count; i++)
            {
                builder.AddLine(geometry.Points[i].X, geometry.Points[i].Y);
            }

            if (isRing)
            {
                builder.AddLine(geometry.Points[0].X, geometry.Points[0].Y);
            }

            builder.EndFigure();
        }
Ejemplo n.º 13
0
        private static void AddFigureRingPoints(SqlGeometryBuilder builder, Point[] points)
        {
            try
            {
              int pointqty = points.Length;
                int unicqty = points.Distinct().Count();
                if (unicqty  < 3) return;
             if (points[0] != points[pointqty - 1]) return;
             if (points[0] != points[pointqty - 1]) return;

            Point point = points[0];
                Point prevPoint = point;
            builder.BeginFigure(point.X, point.Y);
            for (int i = 1; i < pointqty; i++)
            {
                point = points[i];
                if (point != prevPoint) builder.AddLine(point.X, point.Y);
                prevPoint = point;
            }
            builder.EndFigure();
            }
            catch (Exception)
            {

                throw;
            }
        }
 private static void Internal_FillGeometryBuilder(SqlGeometryBuilder gb, MultiLineString multiLineString)
 {
     gb.BeginGeometry(OpenGisGeometryType.MultiLineString);
     foreach (var lineString in multiLineString.Coordinates)
     {
         gb.BeginGeometry(OpenGisGeometryType.LineString);
         bool beginFigureCalled = false;
         foreach (var ipos in lineString.Coordinates)
         {
             Position pos = ipos as Position;
             if (!beginFigureCalled)
             {
                 gb.BeginFigure(pos.Longitude, pos.Latitude);
                 beginFigureCalled = true;
             }
             else
             {
                 gb.AddLine(pos.Longitude, pos.Latitude);
             }
         }
         gb.EndFigure();
         gb.EndGeometry();
     }
     gb.EndGeometry();
 }
Ejemplo n.º 15
0
        public static System.Data.Entity.Spatial.DbGeometry Reverse(
            this System.Data.Entity.Spatial.DbGeometry linestring)
        {
            var fromWkb = SqlGeometry.STGeomFromWKB(new SqlBytes(linestring.AsBinary()), 0);

            // Create a new Geometry Builder
            var gb = new SqlGeometryBuilder();

            // Set the Spatial Reference ID equal to the supplied linestring
            gb.SetSrid((int)(fromWkb.STSrid));
            // Start the linestring
            gb.BeginGeometry(OpenGisGeometryType.LineString);
            // Add the first point using BeginFigure()
            gb.BeginFigure((double)fromWkb.STEndPoint().STX, (double)fromWkb.STEndPoint().STY);
            // Loop through remaining points in reverse order
            for (var x = (int)fromWkb.STNumPoints() - 1; x > 0; --x)
            {
                gb.AddLine((double)fromWkb.STPointN(x).STX, (double)fromWkb.STPointN(x).STY);
            }
            // End the figure
            gb.EndFigure();
            // End the geometry
            gb.EndGeometry();
            // Return that as a SqlGeometry instance
            return(System.Data.Entity.Spatial.DbGeometry.FromBinary(gb.ConstructedGeometry.STAsBinary().Buffer));
        }
Ejemplo n.º 16
0
        public static IEnumerable <SqlGeometry> Segments(this SqlGeometry lineGeom)
        {
            if (lineGeom == null || lineGeom.IsNull || lineGeom.STIsEmpty())
            {
                yield return(null);
            }
            if (lineGeom.STGeometryType().ToString() != OpenGisGeometryType.LineString.ToString())
            {
                yield return(null);
            }
            if (lineGeom.STNumPoints().Value < 2)
            {
                yield return(null);
            }

            for (int i = 1; i < lineGeom.STNumPoints().Value; i++)
            {
                SqlGeometry ptStart = lineGeom.STPointN(i);
                SqlGeometry ptNext  = lineGeom.STPointN(i + 1);

                SqlGeometryBuilder gb = new SqlGeometryBuilder();
                gb.SetSrid(lineGeom.STSrid.Value);
                gb.BeginGeometry(OpenGisGeometryType.LineString);
                gb.BeginFigure(ptStart.STX.Value, ptStart.STY.Value);
                gb.AddLine(ptNext.STX.Value, ptNext.STY.Value);
                gb.EndFigure();
                gb.EndGeometry();

                yield return(gb.ConstructedGeometry);
            }
        }
Ejemplo n.º 17
0
        private void ReprojectFigure(SqlGeometry geometry, SqlGeometryBuilder bldr)
        {
            SqlGeometry point;
            int         numPoints = geometry.STNumPoints().Value;

            double[] pts = new double[numPoints * 2];

            for (int i = 0, idx = 0; i < numPoints; i++)
            {
                point = geometry.STPointN(i + 1);

                pts[idx++] = point.STX.Value;
                pts[idx++] = point.STY.Value;
            }

            if (numPoints > 0)
            {
                DotSpatial.Projections.Reproject.ReprojectPoints(pts, null, _proj_source, _proj_target, 0, numPoints);

                bldr.BeginFigure(pts[0], pts[1]);

                for (int i = 2; i < pts.Length; i += 2)
                {
                    bldr.AddLine(pts[i], pts[i + 1]);
                }

                bldr.EndFigure();
            }
        }
Ejemplo n.º 18
0
        public static System.Data.Entity.Spatial.DbGeometry Reverse(
            this System.Data.Entity.Spatial.DbGeometry linestring)
        {
            var fromWkb = SqlGeometry.STGeomFromWKB(new SqlBytes(linestring.AsBinary()), 0);

            // Create a new Geometry Builder
            var gb = new SqlGeometryBuilder();
            // Set the Spatial Reference ID equal to the supplied linestring
            gb.SetSrid((int) (fromWkb.STSrid));
            // Start the linestring
            gb.BeginGeometry(OpenGisGeometryType.LineString);
            // Add the first point using BeginFigure()
            gb.BeginFigure((double) fromWkb.STEndPoint().STX, (double) fromWkb.STEndPoint().STY);
            // Loop through remaining points in reverse order
            for (var x = (int) fromWkb.STNumPoints() - 1; x > 0; --x)
            {
                gb.AddLine((double) fromWkb.STPointN(x).STX, (double) fromWkb.STPointN(x).STY);
            }
            // End the figure
            gb.EndFigure();
            // End the geometry
            gb.EndGeometry();
            // Return that as a SqlGeometry instance
            return System.Data.Entity.Spatial.DbGeometry.FromBinary(gb.ConstructedGeometry.STAsBinary().Buffer);
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Problem here : self intersecting lines are not supported. Not ideal for GPS tracks...
        /// </summary>
        /// <param name="points"></param>
        /// <returns></returns>
        public static SqlGeometry ParseGeoPointAsGeometryLine(IEnumerable <GeoPoint> points)
        {
            SqlGeometryBuilder gb = new SqlGeometryBuilder();

            gb.SetSrid(4326);
            gb.BeginGeometry(OpenGisGeometryType.LineString);
            bool first = true;

            foreach (var pt in points)
            {
                if (first)
                {
                    gb.BeginFigure(pt.Longitude, pt.Latitude);
                    first = false;
                }
                else
                {
                    gb.AddLine(pt.Longitude, pt.Latitude);
                }
            }
            gb.EndFigure();
            gb.EndGeometry();

            SqlGeometry geom = gb.ConstructedGeometry.MakeValidIfInvalid(1);

            return(geom);
        }
Ejemplo n.º 20
0
        private static void AddLineStringOrRing(SqlGeometryBuilder builder, Geometry geometry, bool isRing)
        {
            builder.BeginFigure(geometry.Points[0].X, geometry.Points[0].Y);

            for (int i = 1; i < geometry.Points.Length; i++)
            {
                builder.AddLine(geometry.Points[i].X, geometry.Points[i].Y);
            }

            if (isRing)
            {
                builder.AddLine(geometry.Points[0].X, geometry.Points[0].Y);
            }

            builder.EndFigure();
        }
Ejemplo n.º 21
0
        private static void SpatialTraceLine(List <GeoPoint> lineElevationData, string message)
        {
            const int DEFAULT_HEIGHT = 300;
            // Say that 1 sample is one pixel and a graph is usually 300px tall
            // So 300px = 300 samples = max height (H)
            // So for numSamples, (H * numSamples / 300) = height of 1px


            double minH      = lineElevationData.Min(p => p.Elevation.GetValueOrDefault(0));
            double maxH      = lineElevationData.Max(p => p.Elevation.GetValueOrDefault(0));
            double H         = maxH - minH;
            double ratio_11  = lineElevationData.Last().DistanceFromOriginMeters / H;
            double ratio     = ratio_11 / 4;
            double tolerance = H / DEFAULT_HEIGHT;

            // Make 4:1 geom
            SqlGeometryBuilder gb = new SqlGeometryBuilder();

            gb.SetSrid(0);             // custom SRID
            gb.BeginGeometry(OpenGisGeometryType.LineString);

            gb.BeginFigure(lineElevationData[0].DistanceFromOriginMeters / ratio, lineElevationData[0].Elevation.GetValueOrDefault(0));
            for (int i = 1; i < lineElevationData.Count; i++)
            {
                gb.AddLine(lineElevationData[i].DistanceFromOriginMeters / ratio, lineElevationData[i].Elevation.GetValueOrDefault(0));
            }
            gb.EndFigure();
            gb.EndGeometry();
            SqlGeometry geom = gb.ConstructedGeometry;

            SpatialTrace.Enable();
            SpatialTrace.TraceGeometry(geom, message);
            SpatialTrace.Disable();
        }
Ejemplo n.º 22
0
            public void AddLine(double latitude, double longitude, double?z, double?m)
            {
                double x = 0;
                double y = 0;

                SphericalMercator.FromLonLat(longitude, latitude, out x, out y);
                _builder.AddLine(x, y, z, m);
            }
Ejemplo n.º 23
0
        private SqlGeometry GetRect(double currentX, double currentY)
        {
            SqlGeometryBuilder builder = new SqlGeometryBuilder();

            builder.SetSrid(this.geometry.STSrid.Value);
            builder.BeginGeometry(OpenGisGeometryType.Polygon);
            builder.BeginFigure(currentX, currentY);
            builder.AddLine(currentX + stepX, currentY);
            builder.AddLine(currentX + stepX, currentY + stepY);
            builder.AddLine(currentX, currentY + stepY);
            builder.AddLine(currentX, currentY);

            builder.EndFigure();
            builder.EndGeometry();

            return(builder.ConstructedGeometry);
        }
Ejemplo n.º 24
0
        public ActionResult TagImage(long id, FormCollection values)
        {
            if (!this.Security.IsUserAdministrator(this.CurrentUser))
            {
                return(View("NotAuthorized"));
            }

            var x1 = Math.Min(1.0, Math.Max(0.0, double.Parse(values["x1"])));
            var y1 = Math.Min(1.0, Math.Max(0.0, double.Parse(values["y1"])));
            var x2 = Math.Min(1.0, Math.Max(0.0, double.Parse(values["x2"])));
            var y2 = Math.Min(1.0, Math.Max(0.0, double.Parse(values["y2"])));

            var user = this.GetUser(values["username"]);

            if (user == null)
            {
                throw new ArgumentException("User does not exists.");
            }

            SqlGeometryBuilder b = new SqlGeometryBuilder();

            b.SetSrid(0);
            b.BeginGeometry(OpenGisGeometryType.Polygon);
            b.BeginFigure(x1, y1);
            b.AddLine(x2, y1);
            b.AddLine(x2, y2);
            b.AddLine(x1, y2);
            b.AddLine(x1, y1);
            b.EndFigure();
            b.EndGeometry();

            var geometry = b.ConstructedGeometry;

            this.Db.EventImageUserTags.InsertOnSubmit(new EventImageUserTag
            {
                EventImageId     = id,
                CreatorUserId    = this.CurrentUser.UserID,
                TaggedUserUserId = user.UserID,
                RegionGeometry   = geometry,
            });

            this.Db.SubmitChanges();

            return(Redirect(this.Request.UrlReferrer.ToString()));
        }
        public static SqlParameter GetGeometrySqlParameter(string paramName, List <PointD> lines, bool makeValid)
        {
            SqlParameter sqlParam = new SqlParameter();

            sqlParam.ParameterName = paramName;
            sqlParam.UdtTypeName   = "geometry";

            SqlGeometryBuilder geomBuilder = new SqlGeometryBuilder();

            // SqlGeometryBuilder.SetSrid Must be called at the beginning of each geometry sequence
            geomBuilder.SetSrid(0);
            geomBuilder.BeginGeometry(OpenGisGeometryType.GeometryCollection);

            if (lines.Count > 0)
            {
                if (lines.Count == 1) //check if its a point or a line and start a geometry for the point or line
                {
                    geomBuilder.BeginGeometry(OpenGisGeometryType.Point);
                }
                else
                {
                    geomBuilder.BeginGeometry(OpenGisGeometryType.LineString);
                }

                int count = 0;
                foreach (PointD p in lines) //add all points
                {
                    if (count == 0)
                    {
                        geomBuilder.BeginFigure(p.X, p.Y);
                    }
                    else
                    {
                        geomBuilder.AddLine(p.X, p.Y);
                    }

                    count++;
                }

                geomBuilder.EndFigure();
                geomBuilder.EndGeometry();
            }

            geomBuilder.EndGeometry();

            SqlGeometry constructed = geomBuilder.ConstructedGeometry;

            if (makeValid)
            {
                //Note required to convert into a geometry instance with a valid Open Geospatial Consortium (OGC) type.
                // this can cause the points to shift - use with caution...
                constructed = constructed.MakeValid();
            }
            sqlParam.Value = constructed;

            return(sqlParam);
        }
        private static void AddFigure(ILineString line, SqlGeometryBuilder bldr)
        {
            IList<Coordinate> coords = line.Coordinates;

            bldr.BeginFigure(coords[0].X, coords[0].Y);
            for (int i = 0; i < coords.Count; i++)
                bldr.AddLine(coords[i].X, coords[i].Y);
            bldr.EndFigure();
        }
Ejemplo n.º 27
0
 private void AddFigure(SqlGeometryBuilder bldr, params Coordinate[] coords)
 {
     bldr.BeginFigure(coords[0].X, coords[0].Y);
     for (int i = 1; i < coords.Length; i++)
     {
         bldr.AddLine(coords[i].X, coords[i].Y);
     }
     bldr.EndFigure();
 }
Ejemplo n.º 28
0
        /// <summary>
        /// Build an SqlGeometry Polygon from a bounding box.
        /// </summary>
        /// <param name="box">Bounding Box</param>
        /// <returns>SqlGeometry Polygon</returns>
        public static SqlGeometry GeometryFromBoundingBox(Models.BoundingBox box, int srid = 4326)
        {
            var geob = new SqlGeometryBuilder();

            geob.SetSrid(srid);
            geob.BeginGeometry(OpenGisGeometryType.Polygon);
            geob.BeginFigure(box.minX, box.maxY);
            geob.AddLine(box.minX, box.minY);
            geob.AddLine(box.maxX, box.minY);
            geob.AddLine(box.maxX, box.maxY);
            geob.AddLine(box.minX, box.maxY);
            geob.EndFigure();
            geob.EndGeometry();
            var geom = geob.ConstructedGeometry;

            //Debug.WriteLine(geog.AsGml().Value);
            return(geom);
        }
Ejemplo n.º 29
0
        /// <summary>
        /// Build an SqlGeometry Polygon from a bounding box.
        /// </summary>
        /// <param name="box">Bounding Box</param>
        /// <returns>SqlGeometry Polygon</returns>
        public static SqlGeometry GeometryFromBoundingBox(Models.BoundingBox box)
        {
            var geob = new SqlGeometryBuilder();

            geob.SetSrid(SRID);
            geob.BeginGeometry(OpenGisGeometryType.Polygon);
            geob.BeginFigure(box.West, box.South);
            geob.AddLine(box.East, box.South);
            geob.AddLine(box.East, box.North);
            geob.AddLine(box.West, box.North);
            geob.AddLine(box.West, box.South);
            geob.EndFigure();
            geob.EndGeometry();
            var geom = geob.ConstructedGeometry;

            //Trace.WriteLine("GeometryFromBoundingBox : " + geom.AsGml().Value);
            return(geom);
        }
Ejemplo n.º 30
0
        /// <summary>
        /// Convert list of WebGridCellSpeciesObservationCount to multi polygon
        /// </summary>
        /// <param name="gridCells"></param>
        /// <returns></returns>
        public static SqlGeometry GridCellsToMultiPolygon(List <WebGridCellSpeciesObservationCount> gridCells)
        {
            if (gridCells == null || !gridCells.Any())
            {
                return(null);
            }

            var gb = new SqlGeometryBuilder();

            // Set the Spatial Reference ID
            gb.SetSrid(gridCells.First().GridCoordinateSystem.Srid());

            // Start the collection
            gb.BeginGeometry(OpenGisGeometryType.MultiPolygon);

            foreach (var gridCell in gridCells)
            {
                var boundingBox = gridCell.OrginalBoundingBox;

                if (boundingBox == null)
                {
                    continue;
                }

                // Define a new polygon
                gb.BeginGeometry(OpenGisGeometryType.Polygon);

                gb.BeginFigure(boundingBox.Min.X, boundingBox.Min.Y);
                gb.AddLine(boundingBox.Min.X, boundingBox.Max.Y);
                gb.AddLine(boundingBox.Max.X, boundingBox.Max.Y);
                gb.AddLine(boundingBox.Max.X, boundingBox.Min.Y);
                gb.AddLine(boundingBox.Min.X, boundingBox.Min.Y);

                // End the polygon
                gb.EndFigure();
                gb.EndGeometry();
            }

            // End the multipolygon
            gb.EndGeometry();

            // Return as a valid SqlGeometry instance
            return(gb.ConstructedGeometry.MakeValid());
        }
Ejemplo n.º 31
0
        private void AddMultiLineStringFromPolygon(SqlGeometryBuilder geomBuilder, SqlGeometry poly)
        {
            int intnum       = (int)poly.STNumInteriorRing();
            var exteriorRing = poly.STExteriorRing();

            if (intnum > 0)
            {
                geomBuilder.BeginGeometry(OpenGisGeometryType.MultiLineString);
            }
            geomBuilder.BeginGeometry(OpenGisGeometryType.LineString);
            var startpoint = exteriorRing.STStartPoint();

            geomBuilder.BeginFigure((double)startpoint.STX, (double)startpoint.STY);
            for (int i = 2; i <= exteriorRing.STNumPoints(); i++)
            {
                geomBuilder.AddLine((double)exteriorRing.STPointN(i).STX, (double)exteriorRing.STPointN(i).STY);
            }
            geomBuilder.EndFigure();
            geomBuilder.EndGeometry();
            if (intnum > 0)
            {
                SqlGeometry intRing;
                SqlGeometry point;
                for (int i = 1; i <= intnum; i++)
                {
                    intRing = poly.STInteriorRingN(i);
                    geomBuilder.BeginGeometry(OpenGisGeometryType.LineString);
                    startpoint = intRing.STStartPoint();
                    geomBuilder.BeginFigure((double)startpoint.STX, (double)startpoint.STY);
                    for (int p = 2; p <= intRing.STNumPoints(); p++)
                    {
                        point = intRing.STPointN(p);
                        geomBuilder.AddLine((double)point.STX, (double)point.STY);
                    }
                    geomBuilder.EndFigure();
                    geomBuilder.EndGeometry();
                }

                geomBuilder.EndFigure();
                geomBuilder.EndGeometry();
            }
        }
Ejemplo n.º 32
0
        /// <summary>
        /// Add points to single ring in polygon
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="ring"></param>
        /// <param name="shortestDistance"></param>
        private static void AddShortenedRingByBuilder(SqlGeometryBuilder builder, SqlGeometry ring,
                                                      SqlDouble shortestDistance)
        {
            var pointCount = ring.STNumPoints();

            //var area = GetGeography(ring).STArea();
            if (pointCount <= MinPointCountToProceed)
            {
                AddRingByBuilder(builder, ring);
            }
            else
            {
                try
                {
                    var firstPoint      = ring.STPointN(1);
                    var startPoint      = firstPoint;
                    int resulPointCount = 0;
                    // Begin the polygon with the first point

                    builder.BeginFigure((double)firstPoint.STX, (double)firstPoint.STY);
                    // While there are still unchecked points in polygon
                    for (int i = 2; i <= pointCount; i++)
                    {
                        var secondPoint = ring.STPointN(i);
                        if (GetDistanceBetweenPoints(firstPoint, secondPoint) >= shortestDistance || (resulPointCount < MinPointCountInPolygon && i >= (pointCount - 1)))
                        {
                            resulPointCount++;
                            builder.AddLine((double)secondPoint.STX, (double)secondPoint.STY);
                            firstPoint = ring.STPointN(i);
                        }
                    }
                    // Add last point - the same as first
                    builder.AddLine((double)startPoint.STX, (double)startPoint.STY);
                    builder.EndFigure();
                }
                catch (System.Exception ex)
                {
                    throw new Exception(string.Format(" AddShortenedRingByBuilder: {0}  Точек в кольце:{1}", ex.Message,
                                                      pointCount));
                }
            }
        }
Ejemplo n.º 33
0
 private static void AddRing(SqlGeometryBuilder builder, SMLinearRing linearRing)
 {
     SMPoint pt = linearRing.StartPoint;
     builder.BeginFigure(pt.X, pt.Y);
     for (int i = 1; i < linearRing.NumPoints; i++)
     {
         pt = linearRing.Point(i);
         builder.AddLine(pt.X, pt.Y);
     }
     builder.EndFigure();
 }
Ejemplo n.º 34
0
        private static void AddFigurePoints(SqlGeometryBuilder builder, Point[] points)
        {
            int geomlen = points.Length;

            Point point = points[0];
            builder.BeginFigure(point.X, point.Y);
            for (int i = 1; i < geomlen; i++)
            {
                point = points[i];
                builder.AddLine(point.X, point.Y);
            }
            builder.EndFigure();
        }
Ejemplo n.º 35
0
 public static SqlGeometry ToLineString(this SqlGeometry poly)
 {
     var geomBuilder = new SqlGeometryBuilder();
     geomBuilder.SetSrid((0));
     geomBuilder.BeginGeometry(OpenGisGeometryType.LineString);
     var startpoint = poly.STStartPoint();
     geomBuilder.BeginFigure((double)startpoint.STX, (double)startpoint.STY);
     for (int i = 1; i <= poly.STNumPoints(); i++)
     {
         geomBuilder.AddLine((double)poly.STPointN(i).STX, (double)poly.STPointN(i).STY);
     }
     geomBuilder.EndFigure();
     geomBuilder.EndGeometry();
     return geomBuilder.ConstructedGeometry;
 }
Ejemplo n.º 36
0
        private static byte[] ConstructLineString(List<Node> nodes, OsmPrimitive osmPrimitive)
        {
            if (nodes != null)
            {
                try
                {
                    SqlGeometry line;
                    SqlGeometryBuilder lineBuilder = new SqlGeometryBuilder();
                    lineBuilder.SetSrid(4326);
                    lineBuilder.BeginGeometry(OpenGisGeometryType.LineString);
                    lineBuilder.BeginFigure(nodes.First().Latitude, nodes.First().Longtitude);
                    for (int i = 1; i < nodes.Count; i++)
                    {
                        lineBuilder.AddLine(nodes[i].Latitude, nodes[i].Longtitude);
                    }

                    lineBuilder.EndFigure();
                    lineBuilder.EndGeometry();
                    line = lineBuilder.ConstructedGeometry;

                    if (line.STIsValid())
                    {
                        return line.STAsBinary().Buffer;
                    }
                    else
                    {
                        Log.Log.Write(osmPrimitive.GetType() + " " + osmPrimitive.Id + " not valid");
                        return null;
                    }
                }
                catch (Exception e)
                {
                    Log.Log.Write(osmPrimitive.GetType() + " " + osmPrimitive.Id + " Error constructed Geometry LINE STRING: " + e.Message);
                    return null;
                }
            }
            else
            {
                throw new NullReferenceException("Construct polygon failed. Nodes not found.");
            }
        }
Ejemplo n.º 37
0
 private static void SharpMapLineStringToSqlGeometry(SqlGeometryBuilder geomBuilder, SMLineString lineString)
 {
     geomBuilder.BeginGeometry(OpenGisGeometryType.LineString);
     var coords = lineString.Coordinates;
     geomBuilder.BeginFigure(coords[0].X, coords[0].Y);
     for (int i = 1; i < lineString.NumPoints; i++)
     {
         var point = coords[i];
         geomBuilder.AddLine(point.X, point.Y);
     }
     geomBuilder.EndFigure();
     geomBuilder.EndGeometry();
 }
Ejemplo n.º 38
0
 private void AddFigure(SqlGeometryBuilder bldr, params Coordinate[] coords)
 {
     bldr.BeginFigure(coords[0].X, coords[0].Y);
     for (int i = 1; i < coords.Length; i++)
         bldr.AddLine(coords[i].X, coords[i].Y);
     bldr.EndFigure();
 }
Ejemplo n.º 39
0
 SqlGeometry GetGeoRectangle(double Lon1, double Lat1, double Lon2, double Lat2)
 {
     var geomBuilder = new SqlGeometryBuilder();
     geomBuilder.SetSrid((0));
     geomBuilder.BeginGeometry(OpenGisGeometryType.Polygon);
     geomBuilder.BeginFigure(Lon1, Lat1);
     geomBuilder.AddLine(Lon1, Lat2);
     geomBuilder.AddLine(Lon2, Lat2);
     geomBuilder.AddLine(Lon2, Lat1);
     geomBuilder.AddLine(Lon1, Lat1);
     geomBuilder.EndFigure();
     geomBuilder.EndGeometry();
     return geomBuilder.ConstructedGeometry;
 }
		private static void Internal_FillGeometryBuilder(SqlGeometryBuilder gb, LineString lineString)
		{
			gb.BeginGeometry(OpenGisGeometryType.LineString);
			bool beginFigureCalled = false;
			foreach (var ipos in lineString.Coordinates)
			{
				GeographicPosition pos = ipos as GeographicPosition;
				if (!beginFigureCalled)
				{
					gb.BeginFigure(pos.Longitude, pos.Latitude);
					beginFigureCalled = true;

				}
				else
				{
					gb.AddLine(pos.Longitude, pos.Latitude);
				}

			}
			gb.EndFigure();
			gb.EndGeometry();
		}
Ejemplo n.º 41
0
 SqlGeometry GetGeoRectangle(PointF topleft, PointF bottomright)
 {
     var geomBuilder = new SqlGeometryBuilder();
     geomBuilder.SetSrid((0));
     geomBuilder.BeginGeometry(OpenGisGeometryType.Polygon);
     geomBuilder.BeginFigure(topleft.X, topleft.Y);
     geomBuilder.AddLine(topleft.X, bottomright.Y);
     geomBuilder.AddLine(bottomright.X, bottomright.Y);
     geomBuilder.AddLine(bottomright.X, topleft.X);
     geomBuilder.AddLine(topleft.X, topleft.Y);
     geomBuilder.EndFigure();
     geomBuilder.EndGeometry();
     return geomBuilder.ConstructedGeometry;
 }
Ejemplo n.º 42
0
        private SqlGeometry GetRect(double currentX, double currentY)
        {
            SqlGeometryBuilder builder = new SqlGeometryBuilder();
            builder.SetSrid(this.geometry.STSrid.Value);
            builder.BeginGeometry(OpenGisGeometryType.Polygon);
            builder.BeginFigure(currentX, currentY);
            builder.AddLine(currentX + stepX, currentY);
            builder.AddLine(currentX + stepX, currentY + stepY);
            builder.AddLine(currentX, currentY + stepY);
            builder.AddLine(currentX, currentY);

            builder.EndFigure();
            builder.EndGeometry();

            return builder.ConstructedGeometry;
        }
Ejemplo n.º 43
0
        /// <summary>
        /// Add points to single ring in polygon
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="ring"></param>
        /// <param name="shortestDistance"></param>
        private static void AddShortenedRingByBuilder(SqlGeometryBuilder builder, SqlGeometry ring,
                                                      SqlDouble shortestDistance)
        {
            var pointCount = ring.STNumPoints();
            //var area = GetGeography(ring).STArea();
            if (pointCount <= MinPointCountToProceed ) AddRingByBuilder(builder, ring);
            else
            {
                try
                {
                    var firstPoint = ring.STPointN(1);
                    var startPoint = firstPoint;
                    int resulPointCount = 0;
                    // Begin the polygon with the first point

                    builder.BeginFigure((double) firstPoint.STX, (double) firstPoint.STY);
                    // While there are still unchecked points in polygon
                    for (int i = 2; i <= pointCount; i++)
                    {

                        var secondPoint = ring.STPointN(i);
                        if (GetDistanceBetweenPoints(firstPoint, secondPoint) >= shortestDistance || (resulPointCount < MinPointCountInPolygon && i >= (pointCount - 1)))
                        {
                            resulPointCount++;
                            builder.AddLine((double) secondPoint.STX, (double) secondPoint.STY);
                            firstPoint = ring.STPointN(i);
                        }

                    }
                    // Add last point - the same as first
                    builder.AddLine((double) startPoint.STX, (double) startPoint.STY);
                    builder.EndFigure();
                }
                catch (System.Exception ex)
                {

                    throw new Exception(string.Format(" AddShortenedRingByBuilder: {0}  Точек в кольце:{1}", ex.Message,
                                                      pointCount));
                }
            }
        }
Ejemplo n.º 44
0
        private void ReprojectFigure(SqlGeometry geometry, SqlGeometryBuilder bldr)
        {
            SqlGeometry point;
            int numPoints = geometry.STNumPoints().Value;
            double[] pts = new double[numPoints * 2];

            for (int i = 0, idx = 0; i < numPoints; i++)
            {
                point = geometry.STPointN(i + 1);

                pts[idx++] = point.STX.Value;
                pts[idx++] = point.STY.Value;
            }

            if (numPoints > 0)
            {
                DotSpatial.Projections.Reproject.ReprojectPoints(pts, null, _proj_source, _proj_target, 0, numPoints);

                bldr.BeginFigure(pts[0], pts[1]);

                for (int i = 2; i < pts.Length; i += 2)
                    bldr.AddLine(pts[i], pts[i + 1]);

                bldr.EndFigure();
            }
        }
Ejemplo n.º 45
0
 private static void SharpMapLineStringToSqlGeometry(SqlGeometryBuilder geomBuilder, SMLineString lineString)
 {
     geomBuilder.BeginGeometry(OpenGisGeometryType.LineString);
     SMPoint point = lineString.StartPoint;
     geomBuilder.BeginFigure(point.X, point.Y);
     for (int i = 1; i < lineString.NumPoints; i++)
     {
         point = lineString.Point(i);
         geomBuilder.AddLine(point.X, point.Y);
     }
     geomBuilder.EndFigure();
     geomBuilder.EndGeometry();
 }
Ejemplo n.º 46
0
        private static void AddRing(SqlGeometryBuilder builder, SMLinearRing linearRing)
        {
            if (linearRing.NumPoints < 3)
                return;

            //if (linearRing.Area == 0)
            //    return;

            var coords = linearRing.Coordinates;
            builder.BeginFigure(coords[0].X, coords[0].Y);
            for (var i = 1; i < linearRing.NumPoints; i++)
            {
                var pt = coords[i];
                builder.AddLine(pt.X, pt.Y);
            }
            builder.EndFigure();
        }
    public static SqlGeometry GetImageBound(SqlDouble Longitude, SqlDouble Latitude, SqlInt32 Width, SqlInt32 Height,
        SqlDouble Zoom, SqlInt32 PixelYOffset)
    {
        long cpX, cpY, LeftTopX, LeftTopY, RightBottomX, RightBottomY;
        long halfWidth = ((long) Width) >> 1;
        long halfHeight = ((long) Height) >> 1;
        double dZoom = (double) Zoom;
        // получить центральный пиксел по коорд
        cpX = (long) FromLongitudeToXPixel(Longitude, Zoom);
        cpY = (long) (FromLatitudeToYPixel(Latitude, Zoom) + PixelYOffset);
        LeftTopX = cpX - halfWidth;
        LeftTopY = cpY - halfHeight;
        RightBottomX = cpX + halfWidth;
        RightBottomY = cpY + halfHeight;
        double Lat1, Lon1, Lat2, Lon2;
        Lat1 = FromYPixelToLat(LeftTopY, dZoom);
        Lon1 = FromXPixelToLon(LeftTopX, dZoom);
        Lat2 = FromYPixelToLat(RightBottomY, dZoom);
        Lon2 = FromXPixelToLon(RightBottomX, dZoom);

        //
        var geomBuilder = new SqlGeometryBuilder();
        geomBuilder.SetSrid((0));
        geomBuilder.BeginGeometry(OpenGisGeometryType.Polygon);
        geomBuilder.BeginFigure(Lon1, Lat1);
        geomBuilder.AddLine(Lon1, Lat2);
        geomBuilder.AddLine(Lon2, Lat2);
        geomBuilder.AddLine(Lon2, Lat1);
        geomBuilder.AddLine(Lon1, Lat1);
        geomBuilder.EndFigure();
        geomBuilder.EndGeometry();
        return geomBuilder.ConstructedGeometry;
    }
Ejemplo n.º 48
0
        private static void AddRingByBuilder(SqlGeometryBuilder builder, SqlGeometry ring)
        {
            try
            {

            var firstPoint = ring.STPointN(1);
            var startPoint = firstPoint;
            var pointCount = ring.STNumPoints();
            // Begin the polygon with the first point
            builder.BeginFigure((double) firstPoint.STX, (double) firstPoint.STY);
            // While there are still unchecked points in polygon
            for (int i = 2; i <= pointCount; i++)
            {
                var secondPoint = ring.STPointN(i);

                builder.AddLine((double) secondPoint.STX, (double) secondPoint.STY);

            }
            // Add last point - the same as first
            builder.AddLine((double) startPoint.STX, (double) startPoint.STY);
            builder.EndFigure();
            }
            catch (System.Exception ex)
            {

                throw new Exception(string.Format("  AddRingByBuilder: {0}", ex.Message));
            }
        }
Ejemplo n.º 49
0
        private static void AddFigureRingPoints(SqlGeometryBuilder builder, Point[] points)
        {
            try
            {
              int pointqty = points.Length;
                int unicqty = points.Distinct().Count();
                if (unicqty  < 3) return;
             if (points[0] != points[pointqty - 1]) return;
             if (points[0] != points[pointqty - 1]) return;

            Point point = points[0];
                Point prevPoint = point;
            builder.BeginFigure(point.X, point.Y);
            for (int i = 1; i < pointqty; i++)
            {
                point = points[i];
                if (point != prevPoint) builder.AddLine(point.X, point.Y);
                prevPoint = point;
            }
            builder.EndFigure();
            }
            catch (Exception)
            {

                throw;
            }
        }
		private SqlGeometry Sample_Polygon(int srid)
		{
			SqlGeometryBuilder builder = new SqlGeometryBuilder();
			builder.SetSrid(srid);
			builder.BeginGeometry(OpenGisGeometryType.Polygon);
			builder.BeginFigure(10, 110);
			builder.AddLine(60, 10);
			builder.AddLine(110, 110);
			builder.AddLine(10, 110);
			builder.EndFigure();
			builder.EndGeometry();
			return builder.ConstructedGeometry;
		}
Ejemplo n.º 51
0
        public static SqlGeometry DrawGeoSpatialSectorVarAngle(SqlDouble longitude, SqlDouble latitude, SqlDouble azimuth,
                                                       SqlDouble angle, SqlDouble radius, SqlDouble stepAngle)
        {
            if (longitude == SqlDouble.Null || latitude == SqlDouble.Null || azimuth == SqlDouble.Null ||
                angle == SqlDouble.Null || radius == SqlDouble.Null || radius == 0 || angle == 0)
                return SqlGeometry.Parse("GEOMETRYCOLLECTION EMPTY");
            SqlGeometryBuilder builder = new SqlGeometryBuilder();
            builder.SetSrid(0);
            builder.BeginGeometry(OpenGisGeometryType.Polygon);
            double firstPointLon;
            double firstPointLat;
            double sectorStepAngle = (double) stepAngle;
            const double earthRadius = 6367.0;
            double lat = (double) latitude;
            double lon = (double) longitude;
            double azim = (double) azimuth;
            double ang = (double) angle;
            double piRad = (Math.PI/180.0);
            double tLat = piRad*lat;
            double tLon = piRad*lon;
            double distkm = ((double) radius/1000)/earthRadius;
            double angleStart = azim - ang/2;
            double angleEnd = azim + ang/2;

            var _angle = Math.Abs(ang);
            if (_angle > 360.0)
            {
                angle = 360.0;
            }
            int pointCount = (int) Math.Floor(ang/sectorStepAngle);
            double brng;
            double latRadians;
            double lngRadians;
            double ptX;
            double ptY;
            int i = 0;

            if (angle < 360.0)
            {

                builder.BeginFigure(lon, lat);
                firstPointLon = lon;
                firstPointLat = lat;
            }
            else
            {

                brng = piRad*(angleStart);
                latRadians = Math.Asin(Math.Sin(tLat)*Math.Cos(distkm) + Math.Cos(tLat)*Math.Sin(distkm)*Math.Cos(brng));
                lngRadians = tLon +
                             Math.Atan2(Math.Sin(brng)*Math.Sin(distkm)*Math.Cos(tLat),
                                        Math.Cos(distkm) - Math.Sin(tLat)*Math.Sin(latRadians));
                ptX = 180.0*lngRadians/Math.PI;
                ptY = 180.0*latRadians/Math.PI;
                builder.BeginFigure(ptX, ptY);
                firstPointLon = ptX;
                firstPointLat = ptY;
            }
            while (i <= pointCount)
            {

                brng = piRad*(angleStart + i*sectorStepAngle);
                latRadians = Math.Asin(Math.Sin(tLat)*Math.Cos(distkm) + Math.Cos(tLat)*Math.Sin(distkm)*Math.Cos(brng));
                lngRadians = tLon +
                             Math.Atan2(Math.Sin(brng)*Math.Sin(distkm)*Math.Cos(tLat),
                                        Math.Cos(distkm) - Math.Sin(tLat)*Math.Sin(latRadians));
                ptX = 180.0*lngRadians/Math.PI;
                ptY = 180.0*latRadians/Math.PI;

                builder.AddLine(ptX, ptY);

                i = i + 1;
            }
            if (((angleStart + pointCount * sectorStepAngle) < angleEnd))
            {
                brng = piRad * (angleEnd);
                latRadians = Math.Asin(Math.Sin(tLat) * Math.Cos(distkm) + Math.Cos(tLat) * Math.Sin(distkm) * Math.Cos(brng));
                lngRadians = tLon +
                             Math.Atan2(Math.Sin(brng) * Math.Sin(distkm) * Math.Cos(tLat),
                                        Math.Cos(distkm) - Math.Sin(tLat) * Math.Sin(latRadians));
                ptX = 180.0 * lngRadians / Math.PI;
                ptY = 180.0 * latRadians / Math.PI;
                builder.AddLine(ptX, ptY);

            }
            builder.AddLine(firstPointLon, firstPointLat);
            builder.EndFigure();
            builder.EndGeometry();
            return builder.ConstructedGeometry;
        }
Ejemplo n.º 52
0
        private void AddMultiLineStringFromPolygon(SqlGeometryBuilder geomBuilder, SqlGeometry poly)
        {

            int intnum = (int) poly.STNumInteriorRing();
            var exteriorRing = poly.STExteriorRing();

            if (intnum > 0) geomBuilder.BeginGeometry(OpenGisGeometryType.MultiLineString);
            geomBuilder.BeginGeometry(OpenGisGeometryType.LineString);
            var startpoint = exteriorRing.STStartPoint();
            geomBuilder.BeginFigure((double) startpoint.STX, (double) startpoint.STY);
            for (int i = 2; i <= exteriorRing.STNumPoints(); i++)
                geomBuilder.AddLine((double) exteriorRing.STPointN(i).STX, (double) exteriorRing.STPointN(i).STY);
            geomBuilder.EndFigure();
            geomBuilder.EndGeometry();
            if (intnum > 0)
            {
                SqlGeometry intRing;
                SqlGeometry point;
                for (int i = 1; i <= intnum; i++)
                {
                    intRing = poly.STInteriorRingN(i);
                    geomBuilder.BeginGeometry(OpenGisGeometryType.LineString);
                    startpoint = intRing.STStartPoint();
                    geomBuilder.BeginFigure((double) startpoint.STX, (double) startpoint.STY);
                    for (int p = 2; p <= intRing.STNumPoints(); p++)
                    {
                        point = intRing.STPointN(p);
                        geomBuilder.AddLine((double) point.STX, (double) point.STY);
                    }
                    geomBuilder.EndFigure();
                    geomBuilder.EndGeometry();
                }

                geomBuilder.EndFigure();
                geomBuilder.EndGeometry();
            }
        }