/// <summary> /// Saves the file to a new location /// </summary> /// <param name="fileName">The fileName to save</param> /// <param name="overwrite">Boolean that specifies whether or not to overwrite the existing file</param> public override void SaveAs(string fileName, bool overwrite) { EnsureValidFileToSave(fileName, overwrite); Filename = fileName; // Set ShapeType before setting header. if (CoordinateType == CoordinateType.Regular) { Header.ShapeType = ShapeType.PolyLine; } if (CoordinateType == CoordinateType.M) { Header.ShapeType = ShapeType.PolyLineM; } if (CoordinateType == CoordinateType.Z) { Header.ShapeType = ShapeType.PolyLineZ; } HeaderSaveAs(fileName); if (IndexMode) { SaveAsIndexed(fileName); return; } var bbWriter = new BufferedBinaryWriter(fileName); var indexWriter = new BufferedBinaryWriter(Header.ShxFilename); int fid = 0; int offset = 50; // the shapefile header starts at 100 bytes, so the initial offset is 50 words int contentLength = 0; foreach (IFeature f in Features) { List<int> parts = new List<int>(); offset += contentLength; // adding the previous content length from each loop calculates the word offset List<Coordinate> points = new List<Coordinate>(); contentLength = 22; for (int iPart = 0; iPart < f.NumGeometries; iPart++) { parts.Add(points.Count); IBasicLineString bl = f.GetBasicGeometryN(iPart) as IBasicLineString; if (bl == null) continue; points.AddRange(bl.Coordinates); } contentLength += 2 * parts.Count; if (Header.ShapeType == ShapeType.PolyLine) { contentLength += points.Count * 8; // x, y } if (Header.ShapeType == ShapeType.PolyLineM) { contentLength += 8; // mmin mmax contentLength += points.Count * 12; // x, y, m } if (Header.ShapeType == ShapeType.PolyLineZ) { contentLength += 16; // mmin, mmax, zmin, zmax contentLength += points.Count * 16; // x, y, z, m } // Index File // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- indexWriter.Write(offset, false); // Byte 0 Offset Integer 1 Big indexWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big // X Y Poly Lines // --------------------------------------------------------- // Position Value Type Number Byte Order // ------------------------------------------------------- bbWriter.Write(fid + 1, false); // Byte 0 Record Number Integer 1 Big bbWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big bbWriter.Write((int)Header.ShapeType); // Byte 8 Shape Type 3 Integer 1 Little if (Header.ShapeType == ShapeType.NullShape) { continue; } IEnvelope env = f.Envelope ?? new Envelope(); bbWriter.Write(env.Minimum.X); // Byte 12 Xmin Double 1 Little bbWriter.Write(env.Minimum.Y); // Byte 20 Ymin Double 1 Little bbWriter.Write(env.Maximum.X); // Byte 28 Xmax Double 1 Little bbWriter.Write(env.Maximum.Y); // Byte 36 Ymax Double 1 Little bbWriter.Write(parts.Count); // Byte 44 NumParts Integer 1 Little bbWriter.Write(points.Count); // Byte 48 NumPoints Integer 1 Little // Byte 52 Parts Integer NumParts Little foreach (int iPart in parts) { bbWriter.Write(iPart); } double[] xyVals = new double[points.Count * 2]; for (int ipoint = 0; ipoint < points.Count; ipoint++) { double[] c = points[ipoint].ToArray(); xyVals[ipoint * 2] = c[0]; xyVals[ipoint * 2 + 1] = c[1]; } bbWriter.Write(xyVals); if (Header.ShapeType == ShapeType.PolyLineZ) { if (f.Envelope != null) { bbWriter.Write(f.Envelope.Minimum.Z); bbWriter.Write(f.Envelope.Maximum.Z); } double[] zVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; ipoint++) { zVals[ipoint] = points[ipoint].Z; } bbWriter.Write(zVals); } if (Header.ShapeType == ShapeType.PolyLineM || Header.ShapeType == ShapeType.PolyLineZ) { if (f.Envelope == null) { bbWriter.Write(0.0); bbWriter.Write(0.0); } else { bbWriter.Write(f.Envelope.Minimum.M); bbWriter.Write(f.Envelope.Maximum.M); } double[] mVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; ipoint++) { mVals[ipoint] = points[ipoint].M; } bbWriter.Write(mVals); } fid++; offset += 4; // header bytes } bbWriter.Close(); indexWriter.Close(); offset += contentLength; //offset += 4; WriteFileLength(Filename, offset); WriteFileLength(Header.ShxFilename, 50 + fid * 4); UpdateAttributes(); SaveProjection(); }
/// <summary> /// Saves the file to a new location /// </summary> /// <param name="fileName">The fileName to save</param> /// <param name="overwrite">Boolean that specifies whether or not to overwrite the existing file</param> public override void SaveAs(string fileName, bool overwrite) { EnsureValidFileToSave(fileName, overwrite); Filename = fileName; // Set ShapeType before setting extent. if (CoordinateType == CoordinateType.Regular) { Header.ShapeType = ShapeType.MultiPoint; } if (CoordinateType == CoordinateType.M) { Header.ShapeType = ShapeType.MultiPointM; } if (CoordinateType == CoordinateType.Z) { Header.ShapeType = ShapeType.MultiPointZ; } HeaderSaveAs(Filename); if (IndexMode) { SaveAsIndexed(Filename); return; } var bbWriter = new BufferedBinaryWriter(Filename); var indexWriter = new BufferedBinaryWriter(Header.ShxFilename); int fid = 0; int offset = 50; // the shapefile header starts at 100 bytes, so the initial offset is 50 words int contentLength = 0; ProgressMeter = new ProgressMeter(ProgressHandler, "Saving (Not Indexed)...", Features.Count); foreach (IFeature f in Features) { offset += contentLength; // adding the previous content length from each loop calculates the word offset List <Coordinate> points = new List <Coordinate>(); contentLength = 20; for (int iPart = 0; iPart < f.Geometry.NumGeometries; iPart++) { IList <Coordinate> coords = f.Geometry.GetGeometryN(iPart).Coordinates; foreach (Coordinate coord in coords) { points.Add(coord); } } if (Header.ShapeType == ShapeType.MultiPoint) { contentLength += points.Count * 8; } if (Header.ShapeType == ShapeType.MultiPointM) { contentLength += 8; // mmin, mmax contentLength += points.Count * 12; } if (Header.ShapeType == ShapeType.MultiPointZ) { contentLength += 16; // mmin, mmax, zmin, zmax contentLength += points.Count * 16; } // Index File // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- indexWriter.Write(offset, false); // Byte 0 Offset Integer 1 Big indexWriter.Write(contentLength, false); // Byte 4 Length Integer 1 Big // X Y Poly Lines // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- bbWriter.Write(fid + 1, false); // Byte 0 Record Integer 1 Big bbWriter.Write(contentLength, false); // Byte 4 Length Integer 1 Big bbWriter.Write((int)Header.ShapeType); // Byte 8 Shape Integer 1 Little if (Header.ShapeType == ShapeType.NullShape) { continue; } bbWriter.Write(f.Geometry.EnvelopeInternal.MinX); // Byte 12 Xmin Double 1 Little bbWriter.Write(f.Geometry.EnvelopeInternal.MinY); // Byte 20 Ymin Double 1 Little bbWriter.Write(f.Geometry.EnvelopeInternal.MaxX); // Byte 28 Xmax Double 1 Little bbWriter.Write(f.Geometry.EnvelopeInternal.MaxY); // Byte 36 Ymax Double 1 Little bbWriter.Write(points.Count); // Byte 44 #Points Integer 1 Little // Byte X Points Point #Points Little foreach (Coordinate coord in points) { bbWriter.Write(coord.X); bbWriter.Write(coord.Y); } if (Header.ShapeType == ShapeType.MultiPointZ) { bbWriter.Write(f.Geometry.EnvelopeInternal.Minimum.Z); bbWriter.Write(f.Geometry.EnvelopeInternal.Maximum.Z); foreach (Coordinate coord in points) { bbWriter.Write(coord.Z); } } if (Header.ShapeType == ShapeType.MultiPointM || Header.ShapeType == ShapeType.MultiPointZ) { if (f.Geometry.EnvelopeInternal == null) { bbWriter.Write(0.0); bbWriter.Write(0.0); } else { bbWriter.Write(f.Geometry.EnvelopeInternal.Minimum.M); bbWriter.Write(f.Geometry.EnvelopeInternal.Maximum.M); } foreach (Coordinate coord in points) { bbWriter.Write(coord.M); } } ProgressMeter.CurrentValue = fid; fid++; offset += 4; } ProgressMeter.Reset(); bbWriter.Close(); indexWriter.Close(); offset += contentLength; WriteFileLength(Filename, offset); UpdateAttributes(); SaveProjection(); }
/// <summary> /// Saves the file to a new location /// </summary> /// <param name="fileName">The fileName to save</param> /// <param name="overwrite">Boolean that specifies whether or not to overwrite the existing file</param> public override void SaveAs(string fileName, bool overwrite) { if (IndexMode) { SaveAsIndexed(fileName, overwrite); return; } string dir = Path.GetDirectoryName(fileName); if (dir != null && !Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (File.Exists(fileName)) { if (fileName != Filename && overwrite == false) throw new IOException("File exists."); File.Delete(fileName); string shx = Path.ChangeExtension(fileName, ".shx"); if (File.Exists(shx)) File.Delete(shx); } InvalidateEnvelope(); if (CoordinateType == CoordinateType.Regular) { Header.ShapeType = ShapeType.MultiPoint; } if (CoordinateType == CoordinateType.M) { Header.ShapeType = ShapeType.MultiPointM; } if (CoordinateType == CoordinateType.Z) { Header.ShapeType = ShapeType.MultiPointZ; } Header.SetExtent(MyExtent); Header.ShxLength = 50 + 4 * Features.Count; Header.SaveAs(fileName); BufferedBinaryWriter bbWriter = new BufferedBinaryWriter(fileName); BufferedBinaryWriter indexWriter = new BufferedBinaryWriter(Header.ShxFilename); int fid = 0; int offset = 50; // the shapefile header starts at 100 bytes, so the initial offset is 50 words int contentLength = 0; ProgressMeter = new ProgressMeter(ProgressHandler, "Saving (Not Indexed)...", Features.Count); foreach (IFeature f in Features) { offset += contentLength; // adding the previous content length from each loop calculates the word offset List<Coordinate> points = new List<Coordinate>(); contentLength = 20; for (int iPart = 0; iPart < f.NumGeometries; iPart++) { IList<Coordinate> coords = f.BasicGeometry.GetBasicGeometryN(iPart).Coordinates; foreach (Coordinate coord in coords) { points.Add(coord); } } if (Header.ShapeType == ShapeType.MultiPoint) { contentLength += points.Count * 8; } if (Header.ShapeType == ShapeType.MultiPointM) { contentLength += 8; // mmin, mmax contentLength += points.Count * 12; } if (Header.ShapeType == ShapeType.MultiPointZ) { contentLength += 16; // mmin, mmax, zmin, zmax contentLength += points.Count * 16; } // Index File // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- indexWriter.Write(offset, false); // Byte 0 Offset Integer 1 Big indexWriter.Write(contentLength, false); // Byte 4 Length Integer 1 Big // X Y Poly Lines // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- bbWriter.Write(fid + 1, false); // Byte 0 Record Integer 1 Big bbWriter.Write(contentLength, false); // Byte 4 Length Integer 1 Big bbWriter.Write((int)Header.ShapeType); // Byte 8 Shape Integer 1 Little if (Header.ShapeType == ShapeType.NullShape) { continue; } bbWriter.Write(f.Envelope.Minimum.X); // Byte 12 Xmin Double 1 Little bbWriter.Write(f.Envelope.Minimum.Y); // Byte 20 Ymin Double 1 Little bbWriter.Write(f.Envelope.Maximum.X); // Byte 28 Xmax Double 1 Little bbWriter.Write(f.Envelope.Maximum.Y); // Byte 36 Ymax Double 1 Little bbWriter.Write(points.Count); // Byte 44 #Points Integer 1 Little // Byte X Points Point #Points Little foreach (Coordinate coord in points) { bbWriter.Write(coord.X); bbWriter.Write(coord.Y); } if (Header.ShapeType == ShapeType.MultiPointZ) { bbWriter.Write(f.Envelope.Minimum.Z); bbWriter.Write(f.Envelope.Maximum.Z); foreach (Coordinate coord in points) { bbWriter.Write(coord.Z); } } if (Header.ShapeType == ShapeType.MultiPointM || Header.ShapeType == ShapeType.MultiPointZ) { if (f.Envelope == null) { bbWriter.Write(0.0); bbWriter.Write(0.0); } else { bbWriter.Write(f.Envelope.Minimum.M); bbWriter.Write(f.Envelope.Maximum.M); } foreach (Coordinate coord in points) { bbWriter.Write(coord.M); } } ProgressMeter.CurrentValue = fid; fid++; offset += 4; } ProgressMeter.Reset(); bbWriter.Close(); indexWriter.Close(); offset += contentLength; WriteFileLength(Filename, offset); UpdateAttributes(); SaveProjection(); }
/// <summary> /// Saves the file to a new location /// </summary> /// <param name="fileName">The fileName to save</param> /// <param name="overwrite">Boolean that specifies whether or not to overwrite the existing file</param> public override void SaveAs(string fileName, bool overwrite) { if (IndexMode) { SaveAsIndexed(fileName, overwrite); return; } Filename = fileName; string dir = Path.GetDirectoryName(Path.GetFullPath(fileName)); if (dir != null && !Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (File.Exists(fileName)) { if (fileName != Filename && overwrite == false) throw new IOException("File exists."); File.Delete(fileName); string shx = Path.ChangeExtension(fileName, ".shx"); if (File.Exists(shx)) File.Delete(shx); } InvalidateEnvelope(); if (CoordinateType == CoordinateType.Regular) { Header.ShapeType = ShapeType.Polygon; } if (CoordinateType == CoordinateType.M) { Header.ShapeType = ShapeType.PolygonM; } if (CoordinateType == CoordinateType.Z) { Header.ShapeType = ShapeType.PolygonZ; } // Set ShapeType before setting extent. Header.SetExtent(Extent); Header.ShxLength = Features.Count * 4 + 50; Header.SaveAs(fileName); BufferedBinaryWriter bbWriter = new BufferedBinaryWriter(fileName); BufferedBinaryWriter indexWriter = new BufferedBinaryWriter(Header.ShxFilename); int fid = 0; int offset = 50; // the shapefile header starts at 100 bytes, so the initial offset is 50 words int contentLength = 0; foreach (IFeature f in Features) { List<int> parts = new List<int>(); offset += contentLength; // adding the previous content length from each loop calculates the word offset List<Coordinate> points = new List<Coordinate>(); contentLength = 22; for (int iPart = 0; iPart < f.NumGeometries; iPart++) { parts.Add(points.Count); IBasicPolygon pg = f.GetBasicGeometryN(iPart) as IBasicPolygon; if (pg == null) continue; IBasicLineString bl = pg.Shell; IList<Coordinate> coords = bl.Coordinates; if (CgAlgorithms.IsCounterClockwise(coords)) { // Exterior rings need to be clockwise coords.Reverse(); } foreach (Coordinate coord in coords) { points.Add(coord); } foreach (IBasicLineString hole in pg.Holes) { parts.Add(points.Count); IList<Coordinate> holeCoords = hole.Coordinates; if (CgAlgorithms.IsCounterClockwise(holeCoords) == false) { // Interior rings need to be counter-clockwise holeCoords.Reverse(); } foreach (Coordinate coord in holeCoords) { points.Add(coord); } } } contentLength += 2 * parts.Count; if (Header.ShapeType == ShapeType.Polygon) { contentLength += points.Count * 8; } if (Header.ShapeType == ShapeType.PolygonM) { contentLength += 8; // mmin mmax contentLength += points.Count * 12; // x, y, m } if (Header.ShapeType == ShapeType.PolygonZ) { contentLength += 16; // mmin, mmax, zmin, zmax contentLength += points.Count * 16; // x, y, m, z } // Index File // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- indexWriter.Write(offset, false); // Byte 0 Offset Integer 1 Big indexWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big // X Y Poly Lines // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- bbWriter.Write(fid + 1, false); // Byte 0 Record Number Integer 1 Big bbWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big bbWriter.Write((int)Header.ShapeType); // Byte 8 Shape Type 3 Integer 1 Little if (Header.ShapeType == ShapeType.NullShape) { continue; } bbWriter.Write(f.Envelope.Minimum.X); // Byte 12 Xmin Double 1 Little bbWriter.Write(f.Envelope.Minimum.Y); // Byte 20 Ymin Double 1 Little bbWriter.Write(f.Envelope.Maximum.X); // Byte 28 Xmax Double 1 Little bbWriter.Write(f.Envelope.Maximum.Y); // Byte 36 Ymax Double 1 Little bbWriter.Write(parts.Count); // Byte 44 NumParts Integer 1 Little bbWriter.Write(points.Count); // Byte 48 NumPoints Integer 1 Little // Byte 52 Parts Integer NumParts Little foreach (int iPart in parts) { bbWriter.Write(iPart); } double[] xyVals = new double[points.Count * 2]; int i = 0; // Byte X Points Point NumPoints Little foreach (Coordinate coord in points) { xyVals[i * 2] = coord.X; xyVals[i * 2 + 1] = coord.Y; i++; } bbWriter.Write(xyVals); if (Header.ShapeType == ShapeType.PolygonZ) { bbWriter.Write(f.Envelope.Minimum.Z); bbWriter.Write(f.Envelope.Maximum.Z); double[] zVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; i++) { zVals[ipoint] = points[ipoint].Z; ipoint++; } bbWriter.Write(zVals); } if (Header.ShapeType == ShapeType.PolygonM || Header.ShapeType == ShapeType.PolygonZ) { if (f.Envelope == null) { bbWriter.Write(0.0); bbWriter.Write(0.0); } else { bbWriter.Write(f.Envelope.Minimum.M); bbWriter.Write(f.Envelope.Maximum.M); } double[] mVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; i++) { mVals[ipoint] = points[ipoint].M; ipoint++; } bbWriter.Write(mVals); } fid++; offset += 4; // header bytes } bbWriter.Close(); indexWriter.Close(); offset += contentLength; //offset += 4; WriteFileLength(fileName, offset); WriteFileLength(Header.ShxFilename, 50 + fid * 4); UpdateAttributes(); SaveProjection(); }
/// <summary> /// Saves the file to a new location /// </summary> /// <param name="fileName">The fileName to save</param> /// <param name="overwrite">Boolean that specifies whether or not to overwrite the existing file</param> public override void SaveAs(string fileName, bool overwrite) { if (IndexMode) { SaveAsIndexed(fileName, overwrite); return; } Filename = fileName; string dir = Path.GetDirectoryName(Path.GetFullPath(fileName)); if (dir != null && !Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (File.Exists(fileName)) { if (fileName != Filename && overwrite == false) { throw new IOException("File exists."); } File.Delete(fileName); string shx = Path.ChangeExtension(fileName, ".shx"); if (File.Exists(shx)) { File.Delete(shx); } } InvalidateEnvelope(); if (CoordinateType == CoordinateType.Regular) { Header.ShapeType = ShapeType.Polygon; } if (CoordinateType == CoordinateType.M) { Header.ShapeType = ShapeType.PolygonM; } if (CoordinateType == CoordinateType.Z) { Header.ShapeType = ShapeType.PolygonZ; } // Set ShapeType before setting extent. Header.SetExtent(Extent); Header.ShxLength = Features.Count * 4 + 50; Header.SaveAs(fileName); BufferedBinaryWriter bbWriter = new BufferedBinaryWriter(fileName); BufferedBinaryWriter indexWriter = new BufferedBinaryWriter(Header.ShxFilename); int fid = 0; int offset = 50; // the shapefile header starts at 100 bytes, so the initial offset is 50 words int contentLength = 0; foreach (IFeature f in Features) { List <int> parts = new List <int>(); offset += contentLength; // adding the previous content length from each loop calculates the word offset List <Coordinate> points = new List <Coordinate>(); contentLength = 22; for (int iPart = 0; iPart < f.NumGeometries; iPart++) { parts.Add(points.Count); IBasicPolygon pg = f.GetBasicGeometryN(iPart) as IBasicPolygon; if (pg == null) { continue; } IBasicLineString bl = pg.Shell; IList <Coordinate> coords = bl.Coordinates; if (CgAlgorithms.IsCounterClockwise(coords)) { // Exterior rings need to be clockwise coords.Reverse(); } foreach (Coordinate coord in coords) { points.Add(coord); } foreach (IBasicLineString hole in pg.Holes) { parts.Add(points.Count); IList <Coordinate> holeCoords = hole.Coordinates; if (CgAlgorithms.IsCounterClockwise(holeCoords) == false) { // Interior rings need to be counter-clockwise holeCoords.Reverse(); } foreach (Coordinate coord in holeCoords) { points.Add(coord); } } } contentLength += 2 * parts.Count; if (Header.ShapeType == ShapeType.Polygon) { contentLength += points.Count * 8; } if (Header.ShapeType == ShapeType.PolygonM) { contentLength += 8; // mmin mmax contentLength += points.Count * 12; // x, y, m } if (Header.ShapeType == ShapeType.PolygonZ) { contentLength += 16; // mmin, mmax, zmin, zmax contentLength += points.Count * 16; // x, y, m, z } // Index File // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- indexWriter.Write(offset, false); // Byte 0 Offset Integer 1 Big indexWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big // X Y Poly Lines // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- bbWriter.Write(fid + 1, false); // Byte 0 Record Number Integer 1 Big bbWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big bbWriter.Write((int)Header.ShapeType); // Byte 8 Shape Type 3 Integer 1 Little if (Header.ShapeType == ShapeType.NullShape) { continue; } bbWriter.Write(f.Envelope.Minimum.X); // Byte 12 Xmin Double 1 Little bbWriter.Write(f.Envelope.Minimum.Y); // Byte 20 Ymin Double 1 Little bbWriter.Write(f.Envelope.Maximum.X); // Byte 28 Xmax Double 1 Little bbWriter.Write(f.Envelope.Maximum.Y); // Byte 36 Ymax Double 1 Little bbWriter.Write(parts.Count); // Byte 44 NumParts Integer 1 Little bbWriter.Write(points.Count); // Byte 48 NumPoints Integer 1 Little // Byte 52 Parts Integer NumParts Little foreach (int iPart in parts) { bbWriter.Write(iPart); } double[] xyVals = new double[points.Count * 2]; int i = 0; // Byte X Points Point NumPoints Little foreach (Coordinate coord in points) { xyVals[i * 2] = coord.X; xyVals[i * 2 + 1] = coord.Y; i++; } bbWriter.Write(xyVals); if (Header.ShapeType == ShapeType.PolygonZ) { bbWriter.Write(f.Envelope.Minimum.Z); bbWriter.Write(f.Envelope.Maximum.Z); double[] zVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; i++) { zVals[ipoint] = points[ipoint].Z; ipoint++; } bbWriter.Write(zVals); } if (Header.ShapeType == ShapeType.PolygonM || Header.ShapeType == ShapeType.PolygonZ) { if (f.Envelope == null) { bbWriter.Write(0.0); bbWriter.Write(0.0); } else { bbWriter.Write(f.Envelope.Minimum.M); bbWriter.Write(f.Envelope.Maximum.M); } double[] mVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; i++) { mVals[ipoint] = points[ipoint].M; ipoint++; } bbWriter.Write(mVals); } fid++; offset += 4; // header bytes } bbWriter.Close(); indexWriter.Close(); offset += contentLength; //offset += 4; WriteFileLength(fileName, offset); WriteFileLength(Header.ShxFilename, 50 + fid * 4); UpdateAttributes(); SaveProjection(); }
/// <summary> /// Saves the file to a new location /// </summary> /// <param name="fileName">The fileName to save</param> /// <param name="overwrite">Boolean that specifies whether or not to overwrite the existing file</param> public override void SaveAs(string fileName, bool overwrite) { EnsureValidFileToSave(fileName, overwrite); Filename = fileName; // Set ShapeType before setting header. if (CoordinateType == CoordinateType.Regular) { Header.ShapeType = ShapeType.PolyLine; } if (CoordinateType == CoordinateType.M) { Header.ShapeType = ShapeType.PolyLineM; } if (CoordinateType == CoordinateType.Z) { Header.ShapeType = ShapeType.PolyLineZ; } HeaderSaveAs(fileName); if (IndexMode) { SaveAsIndexed(fileName); return; } var bbWriter = new BufferedBinaryWriter(fileName); var indexWriter = new BufferedBinaryWriter(Header.ShxFilename); int fid = 0; int offset = 50; // the shapefile header starts at 100 bytes, so the initial offset is 50 words int contentLength = 0; foreach (IFeature f in Features) { List <int> parts = new List <int>(); offset += contentLength; // adding the previous content length from each loop calculates the word offset List <Coordinate> points = new List <Coordinate>(); contentLength = 22; for (int iPart = 0; iPart < f.NumGeometries; iPart++) { parts.Add(points.Count); IBasicLineString bl = f.GetBasicGeometryN(iPart) as IBasicLineString; if (bl == null) { continue; } foreach (Coordinate coord in bl.Coordinates) { points.Add(coord); } } contentLength += 2 * parts.Count; if (Header.ShapeType == ShapeType.PolyLine) { contentLength += points.Count * 8; // x, y } if (Header.ShapeType == ShapeType.PolyLineM) { contentLength += 8; // mmin mmax contentLength += points.Count * 12; // x, y, m } if (Header.ShapeType == ShapeType.PolyLineZ) { contentLength += 16; // mmin, mmax, zmin, zmax contentLength += points.Count * 16; // x, y, z, m } // Index File // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- indexWriter.Write(offset, false); // Byte 0 Offset Integer 1 Big indexWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big // X Y Poly Lines // --------------------------------------------------------- // Position Value Type Number Byte Order // ------------------------------------------------------- bbWriter.Write(fid + 1, false); // Byte 0 Record Number Integer 1 Big bbWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big bbWriter.Write((int)Header.ShapeType); // Byte 8 Shape Type 3 Integer 1 Little if (Header.ShapeType == ShapeType.NullShape) { continue; } IEnvelope env = f.Envelope ?? new Envelope(); bbWriter.Write(env.Minimum.X); // Byte 12 Xmin Double 1 Little bbWriter.Write(env.Minimum.Y); // Byte 20 Ymin Double 1 Little bbWriter.Write(env.Maximum.X); // Byte 28 Xmax Double 1 Little bbWriter.Write(env.Maximum.Y); // Byte 36 Ymax Double 1 Little bbWriter.Write(parts.Count); // Byte 44 NumParts Integer 1 Little bbWriter.Write(points.Count); // Byte 48 NumPoints Integer 1 Little // Byte 52 Parts Integer NumParts Little foreach (int iPart in parts) { bbWriter.Write(iPart); } double[] xyVals = new double[points.Count * 2]; for (int ipoint = 0; ipoint < points.Count; ipoint++) { double[] c = points[ipoint].ToArray(); xyVals[ipoint * 2] = c[0]; xyVals[ipoint * 2 + 1] = c[1]; } bbWriter.Write(xyVals); if (Header.ShapeType == ShapeType.PolyLineZ) { if (f.Envelope != null) { bbWriter.Write(f.Envelope.Minimum.Z); bbWriter.Write(f.Envelope.Maximum.Z); } double[] zVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; ipoint++) { zVals[ipoint] = points[ipoint].Z; } bbWriter.Write(zVals); } if (Header.ShapeType == ShapeType.PolyLineM || Header.ShapeType == ShapeType.PolyLineZ) { if (f.Envelope == null) { bbWriter.Write(0.0); bbWriter.Write(0.0); } else { bbWriter.Write(f.Envelope.Minimum.M); bbWriter.Write(f.Envelope.Maximum.M); } double[] mVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; ipoint++) { mVals[ipoint] = points[ipoint].M; } bbWriter.Write(mVals); } fid++; offset += 4; // header bytes } bbWriter.Close(); indexWriter.Close(); offset += contentLength; //offset += 4; WriteFileLength(Filename, offset); WriteFileLength(Header.ShxFilename, 50 + fid * 4); UpdateAttributes(); SaveProjection(); }
/// <summary> /// Saves the file to a new location /// </summary> /// <param name="fileName">The fileName to save</param> /// <param name="overwrite">Boolean that specifies whether or not to overwrite the existing file</param> public override void SaveAs(string fileName, bool overwrite) { EnsureValidFileToSave(fileName, overwrite); Filename = fileName; // Set ShapeType before setting extent. if (CoordinateType == CoordinateType.Regular) { Header.ShapeType = ShapeType.Polygon; } if (CoordinateType == CoordinateType.M) { Header.ShapeType = ShapeType.PolygonM; } if (CoordinateType == CoordinateType.Z) { Header.ShapeType = ShapeType.PolygonZ; } HeaderSaveAs(fileName); if (IndexMode) { SaveAsIndexed(fileName); return; } var bbWriter = new BufferedBinaryWriter(fileName); var indexWriter = new BufferedBinaryWriter(Header.ShxFilename); int fid = 0; int offset = 50; // the shapefile header starts at 100 bytes, so the initial offset is 50 words int contentLength = 0; foreach (IFeature f in Features) { List <int> parts = new List <int>(); offset += contentLength; // adding the previous content length from each loop calculates the word offset List <Coordinate> points = new List <Coordinate>(); contentLength = 22; for (int iPart = 0; iPart < f.Geometry.NumGeometries; iPart++) { parts.Add(points.Count); IPolygon pg = f.Geometry.GetGeometryN(iPart) as IPolygon; if (pg == null) { continue; } ILineString bl = pg.Shell; IEnumerable <Coordinate> coords = bl.Coordinates; if (CGAlgorithms.IsCCW(bl.Coordinates)) { // Exterior rings need to be clockwise coords = coords.Reverse(); } foreach (Coordinate coord in coords) { points.Add(coord); } foreach (ILineString hole in pg.Holes) { parts.Add(points.Count); IEnumerable <Coordinate> holeCoords = hole.Coordinates; if (!CGAlgorithms.IsCCW(hole.Coordinates)) { // Interior rings need to be counter-clockwise holeCoords = holeCoords.Reverse(); } foreach (Coordinate coord in holeCoords) { points.Add(coord); } } } contentLength += 2 * parts.Count; if (Header.ShapeType == ShapeType.Polygon) { contentLength += points.Count * 8; } if (Header.ShapeType == ShapeType.PolygonM) { contentLength += 8; // mmin mmax contentLength += points.Count * 12; // x, y, m } if (Header.ShapeType == ShapeType.PolygonZ) { contentLength += 16; // mmin, mmax, zmin, zmax contentLength += points.Count * 16; // x, y, m, z } // Index File // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- indexWriter.Write(offset, false); // Byte 0 Offset Integer 1 Big indexWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big // X Y Poly Lines // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- bbWriter.Write(fid + 1, false); // Byte 0 Record Number Integer 1 Big bbWriter.Write(contentLength, false); // Byte 4 Content Length Integer 1 Big bbWriter.Write((int)Header.ShapeType); // Byte 8 Shape Type 3 Integer 1 Little if (Header.ShapeType == ShapeType.NullShape) { continue; } bbWriter.Write(f.Geometry.EnvelopeInternal.MinX); // Byte 12 Xmin Double 1 Little bbWriter.Write(f.Geometry.EnvelopeInternal.MinY); // Byte 20 Ymin Double 1 Little bbWriter.Write(f.Geometry.EnvelopeInternal.MaxX); // Byte 28 Xmax Double 1 Little bbWriter.Write(f.Geometry.EnvelopeInternal.MaxY); // Byte 36 Ymax Double 1 Little bbWriter.Write(parts.Count); // Byte 44 NumParts Integer 1 Little bbWriter.Write(points.Count); // Byte 48 NumPoints Integer 1 Little // Byte 52 Parts Integer NumParts Little foreach (int iPart in parts) { bbWriter.Write(iPart); } double[] xyVals = new double[points.Count * 2]; int i = 0; // Byte X Points Point NumPoints Little foreach (Coordinate coord in points) { xyVals[i * 2] = coord.X; xyVals[i * 2 + 1] = coord.Y; i++; } bbWriter.Write(xyVals); if (Header.ShapeType == ShapeType.PolygonZ) { bbWriter.Write(f.Geometry.EnvelopeInternal.Minimum.Z); bbWriter.Write(f.Geometry.EnvelopeInternal.Maximum.Z); double[] zVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; i++) { zVals[ipoint] = points[ipoint].Z; ipoint++; } bbWriter.Write(zVals); } if (Header.ShapeType == ShapeType.PolygonM || Header.ShapeType == ShapeType.PolygonZ) { if (f.Geometry.EnvelopeInternal == null) { bbWriter.Write(0.0); bbWriter.Write(0.0); } else { bbWriter.Write(f.Geometry.EnvelopeInternal.Minimum.M); bbWriter.Write(f.Geometry.EnvelopeInternal.Maximum.M); } double[] mVals = new double[points.Count]; for (int ipoint = 0; ipoint < points.Count; i++) { mVals[ipoint] = points[ipoint].M; ipoint++; } bbWriter.Write(mVals); } fid++; offset += 4; // header bytes } bbWriter.Close(); indexWriter.Close(); offset += contentLength; //offset += 4; WriteFileLength(fileName, offset); WriteFileLength(Header.ShxFilename, 50 + fid * 4); UpdateAttributes(); SaveProjection(); }
/// <summary> /// Saves the file to a new location /// </summary> /// <param name="fileName">The fileName to save</param> /// <param name="overwrite">Boolean that specifies whether or not to overwrite the existing file</param> public override void SaveAs(string fileName, bool overwrite) { if (IndexMode) { SaveAsIndexed(fileName, overwrite); return; } string dir = Path.GetDirectoryName(fileName); if (dir != null && !Directory.Exists(dir)) { Directory.CreateDirectory(dir); } if (File.Exists(fileName)) { if (fileName != Filename && overwrite == false) { throw new IOException("File exists."); } File.Delete(fileName); string shx = Path.ChangeExtension(fileName, ".shx"); if (File.Exists(shx)) { File.Delete(shx); } } InvalidateEnvelope(); if (CoordinateType == CoordinateType.Regular) { Header.ShapeType = ShapeType.MultiPoint; } if (CoordinateType == CoordinateType.M) { Header.ShapeType = ShapeType.MultiPointM; } if (CoordinateType == CoordinateType.Z) { Header.ShapeType = ShapeType.MultiPointZ; } Header.SetExtent(MyExtent); Header.ShxLength = 50 + 4 * Features.Count; Header.SaveAs(fileName); BufferedBinaryWriter bbWriter = new BufferedBinaryWriter(fileName); BufferedBinaryWriter indexWriter = new BufferedBinaryWriter(Header.ShxFilename); int fid = 0; int offset = 50; // the shapefile header starts at 100 bytes, so the initial offset is 50 words int contentLength = 0; ProgressMeter = new ProgressMeter(ProgressHandler, "Saving (Not Indexed)...", Features.Count); foreach (IFeature f in Features) { offset += contentLength; // adding the previous content length from each loop calculates the word offset List <Coordinate> points = new List <Coordinate>(); contentLength = 20; for (int iPart = 0; iPart < f.NumGeometries; iPart++) { IList <Coordinate> coords = f.BasicGeometry.GetBasicGeometryN(iPart).Coordinates; foreach (Coordinate coord in coords) { points.Add(coord); } } if (Header.ShapeType == ShapeType.MultiPoint) { contentLength += points.Count * 8; } if (Header.ShapeType == ShapeType.MultiPointM) { contentLength += 8; // mmin, mmax contentLength += points.Count * 12; } if (Header.ShapeType == ShapeType.MultiPointZ) { contentLength += 16; // mmin, mmax, zmin, zmax contentLength += points.Count * 16; } // Index File // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- indexWriter.Write(offset, false); // Byte 0 Offset Integer 1 Big indexWriter.Write(contentLength, false); // Byte 4 Length Integer 1 Big // X Y Poly Lines // --------------------------------------------------------- // Position Value Type Number Byte Order // --------------------------------------------------------- bbWriter.Write(fid + 1, false); // Byte 0 Record Integer 1 Big bbWriter.Write(contentLength, false); // Byte 4 Length Integer 1 Big bbWriter.Write((int)Header.ShapeType); // Byte 8 Shape Integer 1 Little if (Header.ShapeType == ShapeType.NullShape) { continue; } bbWriter.Write(f.Envelope.Minimum.X); // Byte 12 Xmin Double 1 Little bbWriter.Write(f.Envelope.Minimum.Y); // Byte 20 Ymin Double 1 Little bbWriter.Write(f.Envelope.Maximum.X); // Byte 28 Xmax Double 1 Little bbWriter.Write(f.Envelope.Maximum.Y); // Byte 36 Ymax Double 1 Little bbWriter.Write(points.Count); // Byte 44 #Points Integer 1 Little // Byte X Points Point #Points Little foreach (Coordinate coord in points) { bbWriter.Write(coord.X); bbWriter.Write(coord.Y); } if (Header.ShapeType == ShapeType.MultiPointZ) { bbWriter.Write(f.Envelope.Minimum.Z); bbWriter.Write(f.Envelope.Maximum.Z); foreach (Coordinate coord in points) { bbWriter.Write(coord.Z); } } if (Header.ShapeType == ShapeType.MultiPointM || Header.ShapeType == ShapeType.MultiPointZ) { if (f.Envelope == null) { bbWriter.Write(0.0); bbWriter.Write(0.0); } else { bbWriter.Write(f.Envelope.Minimum.M); bbWriter.Write(f.Envelope.Maximum.M); } foreach (Coordinate coord in points) { bbWriter.Write(coord.M); } } ProgressMeter.CurrentValue = fid; fid++; offset += 4; } ProgressMeter.Reset(); bbWriter.Close(); indexWriter.Close(); offset += contentLength; WriteFileLength(Filename, offset); UpdateAttributes(); SaveProjection(); }