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); }
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(); }
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(); }
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)); }
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); } }
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(); } }
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); }
/// <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); }
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(); }
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(); }
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); }
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); }
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(); }
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(); }
/// <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); }
/// <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); }
/// <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()); }
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(); } }
/// <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)); } } }
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(); }
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(); }
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; }
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."); } }
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(); }
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(); }
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(); }
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; }
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; }
/// <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)); } } }
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(); } }
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(); }
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; }
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)); } }
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; }
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; }
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(); } }