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();
        }
Exemple #2
0
        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(' ', ',') + ")");
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        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();
        }