/// <summary> /// Writes a point /// </summary> /// <param name="X"></param> /// <param name="Y"></param> public void WritePointShape(double X, double Y) { IntPtr obj = ShapeLib.SHPCreateSimpleObject(ShapeLib.ShapeType.Point, 1, new double[] { X }, new double[] { Y }, null); // IntPtr obj = ShapeLib.SHPCreateObject(ShapeLib.ShapeType.Point, -1, 0, null, null, 1, new double[] { X }, new double[] { Y }, null, null); if (_shapePointer == IntPtr.Zero) { _shapePointer = ShapeLib.SHPCreate(_fileName, ShapeLib.ShapeType.Point); } ShapeLib.SHPWriteObject(_shapePointer, -1, obj); ShapeLib.SHPDestroyObject(obj); NoOfEntries++; }
public void Write(GeoRefData geodata) { double[] Xs = null; double[] Ys = null; ShapeLib.ShapeType type = ShapeLib.ShapeType.NullShape; if (geodata.Geometry is IXYPoint) { IXYPoint p = (IXYPoint)geodata.Geometry; type = ShapeLib.ShapeType.Point; Xs = new double[] { p.X }; Ys = new double[] { p.Y }; } else if (geodata.Geometry.GetType().Equals(typeof(XYPolyline))) { XYPolyline p = (XYPolyline)geodata.Geometry; type = ShapeLib.ShapeType.PolyLine; int npoints = p.Points.Count; Xs = new double[npoints]; Ys = new double[npoints]; for (int i = 0; i < npoints; i++) { Xs[i] = p.Points[i].X; Ys[i] = p.Points[i].Y; } } else if (geodata.Geometry.GetType().Equals(typeof(XYLine))) { XYLine p = (XYLine)geodata.Geometry; type = ShapeLib.ShapeType.PolyLine; int npoints = 2; Xs = new double[] { p.P1.X, p.P2.X }; Ys = new double[] { p.P1.Y, p.P2.Y };; } else if (geodata.Geometry.GetType().Equals(typeof(XYPolygon))) { XYPolygon p = (XYPolygon)geodata.Geometry; type = ShapeLib.ShapeType.Polygon; int npoints = p.Points.Count; Xs = new double[npoints]; Ys = new double[npoints]; p.Points.Reverse(); for (int i = 0; i < npoints; i++) { Xs[i] = p.Points[i].X; Ys[i] = p.Points[i].Y; } p.Points.Reverse(); } else if (geodata.Geometry.GetType().Equals(typeof(MultiPartPolygon))) { MultiPartPolygon p = (MultiPartPolygon)geodata.Geometry; type = ShapeLib.ShapeType.Polygon; int npoints = p.Polygons.Sum(pol => pol.Points.Count); foreach (var poly in p.Polygons) { poly.Points.Reverse(); } Xs = new double[npoints]; Ys = new double[npoints]; int i = 0; foreach (var point in p.Polygons.SelectMany(pol => pol.Points)) { Xs[i] = point.X; Ys[i] = point.Y; i++; } foreach (var poly in p.Polygons) { poly.Points.Reverse(); } } if (_shapePointer == IntPtr.Zero) { _shapePointer = ShapeLib.SHPCreate(_fileName, type); } if (_shapePointer == IntPtr.Zero) { throw new Exception("Could not create: " + Path.GetFullPath(_fileName) + "\nMake sure directory exists."); } IntPtr obj; if (geodata.Geometry.GetType().Equals(typeof(MultiPartPolygon))) { MultiPartPolygon p = (MultiPartPolygon)geodata.Geometry; int[] partstarts = new int[p.Polygons.Count]; partstarts[0] = 0; ShapeLib.PartType[] partype = new ShapeLib.PartType[p.Polygons.Count]; for (int i = 0; i < partype.Count(); i++) { partype[i] = ShapeLib.PartType.Ring; } for (int i = 1; i < partstarts.Count(); i++) { partstarts[i] = partstarts[i - 1] + p.Polygons[i - 1].Points.Count; } obj = ShapeLib.SHPCreateObject(type, -1, partstarts.Count(), partstarts, partype, Xs.Count(), Xs, Ys, null, null); } else { obj = ShapeLib.SHPCreateSimpleObject(type, Xs.Count(), Xs, Ys, null); } ShapeLib.SHPWriteObject(_shapePointer, -1, obj); ShapeLib.SHPDestroyObject(obj); _dbf.WriteData(geodata.Data); NoOfEntries++; }
/// <summary> /// Reads the next shape /// </summary> /// <returns></returns> public IGeometry ReadNext(int RecordNumber) { IntPtr pShape = ShapeLib.SHPReadObject(_shapePointer, RecordNumber); ShapeLib.SHPObject shpObject = new ShapeLib.SHPObject(); Marshal.PtrToStructure(pShape, shpObject); double[] x = new double[shpObject.nVertices]; Marshal.Copy(shpObject.padfX, x, 0, x.Length); double[] y = new double[shpObject.nVertices]; Marshal.Copy(shpObject.padfY, y, 0, y.Length); double[] z = new double[shpObject.nVertices]; Marshal.Copy(shpObject.padfZ, z, 0, z.Length); int[] partstarts = null; if (shpObject.nParts > 0) { partstarts = new int[shpObject.nParts]; Marshal.Copy(shpObject.paPartStart, partstarts, 0, partstarts.Length); } ShapeLib.SHPDestroyObject(pShape); IGeometry geom = null; switch (type) { case ShapeLib.ShapeType.NullShape: break; case ShapeLib.ShapeType.MultiPoint: case ShapeLib.ShapeType.MultiPointZ: case ShapeLib.ShapeType.MultiPointM: case ShapeLib.ShapeType.PointM: case ShapeLib.ShapeType.PointZ: case ShapeLib.ShapeType.Point: geom = new XYPoint(x[0], y[0]); break; case ShapeLib.ShapeType.PolyLineM: case ShapeLib.ShapeType.PolyLineZ: case ShapeLib.ShapeType.PolyLine: geom = new XYPolyline(); for (int i = 0; i < x.Length; i++) { ((XYPolyline)geom).Points.Add(new XYPoint(x[i], y[i])); } break; case ShapeLib.ShapeType.PolygonM: case ShapeLib.ShapeType.PolygonZ: case ShapeLib.ShapeType.Polygon: if (partstarts.Count() == 1) { geom = new XYPolygon(); for (int i = 0; i < x.Length; i++) { ((XYPolygon)geom).Points.Add(new XYPoint(x[i], y[i])); } ((XYPolygon)geom).Points.Reverse(); } else { geom = new MultiPartPolygon(); //foreach (var partstart in partstarts.Reverse()) //{ // var poly = new XYPolygon(); // for (int i = end; i > partstart; i--) // poly.Points.Add(new XYPoint(x[i], y[i])); // end = partstart; // ((MultiPartPolygon)geom).Polygons.Add(poly); //} for (int j = 0; j < partstarts.Count(); j++) { int end; if (j < partstarts.Count() - 1) { end = partstarts[j + 1]; } else { end = x.Length; } var poly = new XYPolygon(); for (int i = partstarts[j]; i < end; i++) { poly.Points.Add(new XYPoint(x[i], y[i])); } poly.Points.Reverse(); ((MultiPartPolygon)geom).Polygons.Add(poly); } } break; case ShapeLib.ShapeType.MultiPatch: break; default: break; } return(geom); }