public StLineString(byte[] bytes) { Bytes = bytes; // Is it a X/M Geometry ? bool hasZ, hasM; List <byte> header = StGeometryHelper.ExtractHeader(bytes); StGeometryHelper.GetGeometryDimension(header, out hasZ, out hasM); HasZ = hasZ; HasM = hasM; // Split bytes in encode values List <List <byte> > bytesList = StGeometryHelper.GetEncodedValues(StGeometryHelper.RemoveHeader(bytes)); // Checks if (!HasZ && !HasM && (bytesList.Count < 4 || (bytesList.Count % 2 != 0))) { throw new ArgumentException("Cannot create geometry from those bytes."); } if (HasZ && HasM && (bytesList.Count % 4 != 0)) { throw new ArgumentException("Cannot create geometry from those bytes."); } if ((HasZ || HasM) && (bytesList.Count % 3 != 0)) { throw new ArgumentException("Cannot create geometry from those bytes."); } // Set geometry values SetGeometry(bytesList); CalculateMinMaxAndLengthValues(); }
public override string ToString() { string prefix = "POINT "; if (HasZ) { prefix += "Z"; } if (HasM) { prefix += "M"; } string coordinatesWkt = StGeometryHelper.GetCoordinateWkt(this); return(prefix.TrimEnd(' ') + " (" + coordinatesWkt + ")"); }
public override string ToString() { string prefix = "LINESTRING "; if (HasZ) { prefix += "Z"; } if (HasM) { prefix += "M"; } var str = new StringBuilder(); foreach (StPoint point in Points) { str.Append(StGeometryHelper.GetCoordinateWkt(point)).Append(", "); } return(prefix.TrimEnd(' ') + " (" + str.ToString().TrimEnd(' ', ',') + ")"); }
private void CalculateBytes() { var bytes = new List <byte>(); // Coordinates bytes.AddRange(X.Bytes); bytes.AddRange(Y.Bytes); if (HasZ) { bytes.AddRange(Z.Bytes); } if (HasM) { bytes.AddRange(M.Bytes); } // Add reserved bytes List <byte> header = StGeometryHelper.GenerateHeader(this, bytes); bytes.InsertRange(0, header); Bytes = bytes.ToArray(); }
public StPoint(byte[] bytes) { Bytes = bytes; // Is it a X/M Geometry ? bool hasZ, hasM; List <byte> header = StGeometryHelper.ExtractHeader(bytes); StGeometryHelper.GetGeometryDimension(header, out hasZ, out hasM); HasZ = hasZ; HasM = HasM; // Split bytes in encode values List <List <byte> > bytesList = StGeometryHelper.GetEncodedValues(StGeometryHelper.RemoveHeader(bytes)); // Checks if (bytesList.Count < 2) { throw new ArgumentException("Cannot create geometry from those bytes."); } if ((HasZ || HasM) && bytesList.Count < 3) { throw new ArgumentException("Cannot create geometry from those bytes."); } if (HasZ && HasM && bytesList.Count < 4) { throw new ArgumentException("Cannot create geometry from those bytes."); } if (bytesList.Count > 4) { throw new ArgumentException("Cannot create geometry from those bytes."); } // Set geometry values SetGeometry(bytesList); }
private void CalculateBytes() { if (HasM) { throw new NotSupportedException("M not managed yet : Code is written, but not tested"); } var allBytes = new List <byte>(); var allZBytes = new List <byte>(); var allMBytes = new List <byte>(); // The first point will be set normaly List <List <byte> > previousBytesList = StGeometryHelper.GetEncodedValues(StGeometryHelper.RemoveHeader(Points[0].Bytes)); allBytes.AddRange(previousBytesList[0]); // X allBytes.AddRange(previousBytesList[1]); // Y if (HasZ) { allZBytes.AddRange(previousBytesList[2]); } if (HasM) { allMBytes.AddRange(previousBytesList[3]); } // The next point are set with the difference between the current coordinate and the previous one for (int i = 1; i < Points.Count; ++i) { List <List <byte> > bytesList = StGeometryHelper.GetEncodedValues(StGeometryHelper.RemoveHeader(Points[i].Bytes)); byte[] xBytes = StCoordinatesSystemHelper.GetDifferenceFromBytes(bytesList[0].ToArray(), previousBytesList[0].ToArray(), StParameters.CoordinatesSystem, StCoordType.X); allBytes.AddRange(xBytes); byte[] yBytes = StCoordinatesSystemHelper.GetDifferenceFromBytes(bytesList[1].ToArray(), previousBytesList[1].ToArray(), StParameters.CoordinatesSystem, StCoordType.Y); allBytes.AddRange(yBytes); if (HasZ && HasM) { byte[] zBytes = StCoordinatesSystemHelper.GetDifferenceFromBytes(bytesList[2].ToArray(), previousBytesList[2].ToArray(), StParameters.CoordinatesSystem, StCoordType.Z); allZBytes.AddRange(zBytes); byte[] mBytes = StCoordinatesSystemHelper.GetDifferenceFromBytes(bytesList[3].ToArray(), previousBytesList[3].ToArray(), StParameters.CoordinatesSystem, StCoordType.M); allMBytes.AddRange(mBytes); } else if (HasZ) { byte[] zBytes = StCoordinatesSystemHelper.GetDifferenceFromBytes(bytesList[2].ToArray(), previousBytesList[2].ToArray(), StParameters.CoordinatesSystem, StCoordType.Z); allZBytes.AddRange(zBytes); } else if (HasM) { byte[] mBytes = StCoordinatesSystemHelper.GetDifferenceFromBytes(bytesList[2].ToArray(), previousBytesList[3].ToArray(), StParameters.CoordinatesSystem, StCoordType.M); allMBytes.AddRange(mBytes); } previousBytesList = bytesList; } // Add Z et M Bytes to XY ones if (HasZ) { allBytes.AddRange(allZBytes); } if (HasM) { allBytes.AddRange(allMBytes); } // Add reserved bytes List <byte> header = StGeometryHelper.GenerateHeader(this, allBytes); allBytes.InsertRange(0, header); Bytes = allBytes.ToArray(); }