/// <summary>
        /// Reads a projection.
        /// </summary>
        private static IProjection ReadProjection(WktStreamTokenizer tokenizer)
        {
            tokenizer.ReadToken("PROJECTION");
            tokenizer.ReadToken("[");//[
            string projectionName = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken("]"); //]
            tokenizer.ReadToken(","); //,
            tokenizer.ReadToken("PARAMETER");
            List <ProjectionParameter> paramList = new List <ProjectionParameter>();

            while (tokenizer.GetStringValue() == "PARAMETER")
            {
                tokenizer.ReadToken("[");
                string paramName = tokenizer.ReadDoubleQuotedWord();
                tokenizer.ReadToken(",");
                tokenizer.NextToken();
                double paramValue = tokenizer.GetNumericValue();
                tokenizer.ReadToken("]");
                tokenizer.ReadToken(",");
                paramList.Add(new ProjectionParameter(paramName, paramValue));
                tokenizer.NextToken();
            }
            string      authority     = String.Empty;
            long        authorityCode = -1;
            IProjection projection    = new Projection(projectionName, paramList, projectionName, authority, authorityCode, String.Empty, String.Empty, string.Empty);

            return(projection);
        }
        /// <summary>
        /// Reads a horizontal datum.
        /// </summary>
        private static IHorizontalDatum ReadHorizontalDatum(WktStreamTokenizer tokenizer)
        {
            Wgs84ConversionInfo wgsInfo = null;
            string authority            = String.Empty;
            long   authorityCode        = -1;

            tokenizer.ReadToken("[");
            string name = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken(",");
            tokenizer.ReadToken("SPHEROID");
            IEllipsoid ellipsoid = ReadEllipsoid(tokenizer);

            tokenizer.NextToken();
            while (tokenizer.GetStringValue() == ",")
            {
                tokenizer.NextToken();
                if (tokenizer.GetStringValue() == "TOWGS84")
                {
                    wgsInfo = ReadWGS84ConversionInfo(tokenizer);
                    tokenizer.NextToken();
                }
                else if (tokenizer.GetStringValue() == "AUTHORITY")
                {
                    //tokenizer.ReadAuthority(ref authority, ref authorityCode);
                    ReadAuthority(tokenizer, ref authority, ref authorityCode);
                    tokenizer.ReadToken("]");
                }
            }

            IHorizontalDatum horizontalDatum = new HorizontalDatum(ellipsoid, wgsInfo, DatumType.HD_Geocentric, name, authority, authorityCode, String.Empty, String.Empty, String.Empty);

            return(horizontalDatum);
        }
        /*
         * /// <summary>
         * ///
         * /// </summary>
         * /// <param name="tokenizer"></param>
         * /// <returns></returns>
         * private static ICompoundCoordinateSystem ReadCompoundCoordinateSystem(WktStreamTokenizer tokenizer)
         * {
         *
         *  //COMPD_CS[
         *  //"OSGB36 / British National Grid + ODN",
         *  //PROJCS[]
         *  //VERT_CS[]
         *  //AUTHORITY["EPSG","7405"]
         *  //]
         *
         *  tokenizer.ReadToken("[");
         *  string name=tokenizer.ReadDoubleQuotedWord();
         *  tokenizer.ReadToken(",");
         *  tokenizer.NextToken();
         *  string headCSCode =  tokenizer.GetStringValue();
         *  ICoordinateSystem headCS = ReadCoordinateSystem(headCSCode,tokenizer);
         *  tokenizer.ReadToken(",");
         *  tokenizer.NextToken();
         *  string tailCSCode =  tokenizer.GetStringValue();
         *  ICoordinateSystem tailCS = ReadCoordinateSystem(tailCSCode,tokenizer);
         *  tokenizer.ReadToken(",");
         *  string authority=String.Empty;
         *  string authorityCode=String.Empty;
         *  tokenizer.ReadAuthority(ref authority, ref authorityCode);
         *  tokenizer.ReadToken("]");
         *  ICompoundCoordinateSystem compoundCS = new CompoundCoordinateSystem(headCS,tailCS,String.Empty,authority,authorityCode,name,String.Empty,String.Empty);
         *  return compoundCS;
         *
         * }*/

        /// <summary>
        /// Reads an ellipsiod.
        /// </summary>
        private static IEllipsoid ReadEllipsoid(WktStreamTokenizer tokenizer)
        {
            tokenizer.ReadToken("[");
            string name = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken(",");
            tokenizer.NextToken();
            double majorAxis = tokenizer.GetNumericValue();

            tokenizer.ReadToken(",");
            tokenizer.NextToken();
            double e = tokenizer.GetNumericValue();

            //tokenizer.ReadToken(",");
            tokenizer.NextToken();
            string authority     = String.Empty;
            long   authorityCode = -1;

            if (tokenizer.GetStringValue() == ",") //Read authority
            {
                //tokenizer.ReadAuthority(ref authority, ref authorityCode);
                ReadAuthority(tokenizer, ref authority, ref authorityCode);
                tokenizer.ReadToken("]");
            }
            IEllipsoid ellipsoid = new Ellipsoid(majorAxis, 0.0, e, true, LinearUnit.Metre, name, authority, authorityCode, String.Empty, string.Empty, string.Empty);

            return(ellipsoid);
        }
        /// <summary>
        /// Reads a geographic coordinate system.
        /// </summary>
        private static IGeographicCoordinateSystem ReadGeographicCoordinateSystem(WktStreamTokenizer tokenizer)
        {
            tokenizer.ReadToken("[");
            string name = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken(",");
            tokenizer.ReadToken("DATUM");
            IHorizontalDatum horizontalDatum = ReadHorizontalDatum(tokenizer);

            tokenizer.ReadToken(",");
            tokenizer.ReadToken("PRIMEM");
            IPrimeMeridian primeMeridian = ReadPrimeMeridian(tokenizer);

            tokenizer.ReadToken(",");
            tokenizer.ReadToken("UNIT");
            IAngularUnit angularUnit = ReadAngularUnit(tokenizer);

            string authority     = String.Empty;
            long   authorityCode = -1;

            tokenizer.NextToken();
            List <AxisInfo> info = new List <AxisInfo>(2);

            if (tokenizer.GetStringValue() == ",")
            {
                tokenizer.NextToken();
                while (tokenizer.GetStringValue() == "AXIS")
                {
                    info.Add(ReadAxis(tokenizer));
                    tokenizer.NextToken();
                    if (tokenizer.GetStringValue() == ",")
                    {
                        tokenizer.NextToken();
                    }
                }
                if (tokenizer.GetStringValue() == ",")
                {
                    tokenizer.NextToken();
                }
                if (tokenizer.GetStringValue() == "AUTHORITY")
                {
                    //tokenizer.ReadAuthority(ref authority, ref authorityCode);
                    ReadAuthority(tokenizer, ref authority, ref authorityCode);
                    tokenizer.ReadToken("]");
                }
            }

            // значения по умолчанию для осей
            if (info.Count == 0)
            {
                info.Add(new AxisInfo("Lon", AxisOrientationEnum.East));
                info.Add(new AxisInfo("Lat", AxisOrientationEnum.North));
            }
            IGeographicCoordinateSystem geographicCS = new GeographicCoordinateSystem(angularUnit, horizontalDatum,
                                                                                      primeMeridian, info, name, authority, authorityCode, String.Empty, String.Empty, String.Empty);

            return(geographicCS);
        }
示例#5
0
        private static ICoordinate readPointCoords(WktStreamTokenizer tokenizer)
        {
            ICoordinate point = PlanimetryEnvironment.NewCoordinate(0, 0);

            tokenizer.NextToken();
            point.X = tokenizer.GetNumericValue();
            tokenizer.NextToken();
            point.Y = tokenizer.GetNumericValue();
            return(point);
        }
        /// <summary>
        /// Reads a projected coordinate system.
        /// </summary>
        private static IProjectedCoordinateSystem ReadProjectedCoordinateSystem(WktStreamTokenizer tokenizer)
        {
            tokenizer.ReadToken("[");
            string name = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken(",");
            tokenizer.ReadToken("GEOGCS");
            IGeographicCoordinateSystem geographicCS = ReadGeographicCoordinateSystem(tokenizer);

            tokenizer.ReadToken(",");
            IProjection projection = ReadProjection(tokenizer);
            IUnit       unit       = ReadLinearUnit(tokenizer);

            string authority     = String.Empty;
            long   authorityCode = -1;

            tokenizer.NextToken();
            List <AxisInfo> axes = new List <AxisInfo>(2);

            if (tokenizer.GetStringValue() == ",")
            {
                tokenizer.NextToken();
                while (tokenizer.GetStringValue() == "AXIS")
                {
                    axes.Add(ReadAxis(tokenizer));
                    tokenizer.NextToken();
                    if (tokenizer.GetStringValue() == ",")
                    {
                        tokenizer.NextToken();
                    }
                }
                if (tokenizer.GetStringValue() == ",")
                {
                    tokenizer.NextToken();
                }
                if (tokenizer.GetStringValue() == "AUTHORITY")
                {
                    //tokenizer.ReadAuthority(ref authority, ref authorityCode);
                    ReadAuthority(tokenizer, ref authority, ref authorityCode);
                    tokenizer.ReadToken("]");
                }
            }
            //This is default axis values if not specified.
            if (axes.Count == 0)
            {
                axes.Add(new AxisInfo("X", AxisOrientationEnum.East));
                axes.Add(new AxisInfo("Y", AxisOrientationEnum.North));
            }
            IProjectedCoordinateSystem projectedCS = new ProjectedCoordinateSystem(geographicCS.HorizontalDatum, geographicCS, unit as LinearUnit, projection, axes, name, authority, authorityCode, String.Empty, String.Empty, String.Empty);

            return(projectedCS);
        }
示例#7
0
        private static Polygon readMultiPolygon(WktStreamTokenizer tokenizer)
        {
            tokenizer.ReadToken("(");
            Polygon polygon = new Polygon();
            bool    comma   = true;

            while (comma)
            {
                tokenizer.ReadToken("(");
                List <List <ICoordinate> > lists = readPointsCoordLists(tokenizer);
                if (tokenizer.GetStringValue() == ")")
                {
                    foreach (List <ICoordinate> list in lists)
                    {
                        Contour contour = new Contour();
                        list.RemoveAt(list.Count - 1);
                        contour.Vertices = list;
                        polygon.Contours.Add(contour);
                    }
                }
                else
                {
                    throwMissingCloseBracket(tokenizer);
                }
                tokenizer.NextToken();
                comma = tokenizer.GetStringValue() == ",";
            }
            if (tokenizer.GetStringValue() != ")")
            {
                throwMissingCloseBracket(tokenizer);
            }

            return(polygon);
        }
示例#8
0
        private static MultiPoint readMultiPoint(WktStreamTokenizer tokenizer)
        {
            tokenizer.ReadToken("(");
            List <ICoordinate> points = new List <ICoordinate>();

            while (true)
            {
                points.Add(readPoint(tokenizer).Coordinate);
                tokenizer.NextToken(true);
                if (tokenizer.GetStringValue() == ",")
                {
                    continue;
                }

                if (tokenizer.GetStringValue() == ")")
                {
                    break;
                }
            }

            if (tokenizer.GetStringValue() == ")")
            {
                MultiPoint multiPoint = new MultiPoint(points);
                return(multiPoint);
            }
            else
            {
                throwMissingCloseBracket(tokenizer);
            }
            return(null);
        }
        /// <summary>
        /// Reads an axis info.
        /// </summary>
        private static AxisInfo ReadAxis(WktStreamTokenizer tokenizer)
        {
            if (tokenizer.GetStringValue() != "AXIS")
            {
                tokenizer.ReadToken("AXIS");
            }
            tokenizer.ReadToken("[");
            string axisName = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken(",");
            tokenizer.NextToken();
            string unitname = tokenizer.GetStringValue();

            tokenizer.ReadToken("]");
            switch (unitname.ToUpper(CultureInfo.InvariantCulture))
            {
            case "DOWN": return(new AxisInfo(axisName, AxisOrientationEnum.Down));

            case "EAST": return(new AxisInfo(axisName, AxisOrientationEnum.East));

            case "NORTH": return(new AxisInfo(axisName, AxisOrientationEnum.North));

            case "OTHER": return(new AxisInfo(axisName, AxisOrientationEnum.Other));

            case "SOUTH": return(new AxisInfo(axisName, AxisOrientationEnum.South));

            case "UP": return(new AxisInfo(axisName, AxisOrientationEnum.Up));

            case "WEST": return(new AxisInfo(axisName, AxisOrientationEnum.West));

            default:
                throw new ArgumentException("Invalid axis name '" + unitname + "' in WKT");
            }
        }
        /// <summary>
        /// Reads an anglular unit.
        /// </summary>
        private static IAngularUnit ReadAngularUnit(WktStreamTokenizer tokenizer)
        {
            tokenizer.ReadToken("[");
            string unitName = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken(",");
            tokenizer.NextToken();
            double unitsPerUnit  = tokenizer.GetNumericValue();
            string authority     = String.Empty;
            long   authorityCode = -1;

            tokenizer.NextToken();
            if (tokenizer.GetStringValue() == ",")
            {
                //tokenizer.ReadAuthority(ref authority, ref authorityCode);
                ReadAuthority(tokenizer, ref authority, ref authorityCode);
                tokenizer.ReadToken("]");
            }
            return(new AngularUnit(unitsPerUnit, unitName, authority, authorityCode, String.Empty, String.Empty, String.Empty));
        }
        /// <summary>
        /// Reads a WGS84 conversion info.
        /// </summary>
        private static Wgs84ConversionInfo ReadWGS84ConversionInfo(WktStreamTokenizer tokenizer)
        {
            //TOWGS84[0,0,0,0,0,0,0]
            tokenizer.ReadToken("[");
            Wgs84ConversionInfo info = new Wgs84ConversionInfo();

            tokenizer.NextToken();
            info.Dx = tokenizer.GetNumericValue();
            tokenizer.ReadToken(",");

            tokenizer.NextToken();
            info.Dy = tokenizer.GetNumericValue();
            tokenizer.ReadToken(",");

            tokenizer.NextToken();
            info.Dz = tokenizer.GetNumericValue();
            tokenizer.NextToken();
            if (tokenizer.GetStringValue() == ",")
            {
                tokenizer.NextToken();
                info.Ex = tokenizer.GetNumericValue();

                tokenizer.ReadToken(",");
                tokenizer.NextToken();
                info.Ey = tokenizer.GetNumericValue();

                tokenizer.ReadToken(",");
                tokenizer.NextToken();
                info.Ez = tokenizer.GetNumericValue();

                tokenizer.NextToken();
                if (tokenizer.GetStringValue() == ",")
                {
                    tokenizer.NextToken();
                    info.Ppm = tokenizer.GetNumericValue();
                }
            }
            if (tokenizer.GetStringValue() != "]")
            {
                tokenizer.ReadToken("]");
            }
            return(info);
        }
示例#12
0
        private static List <ICoordinate> readPointCoordsList(WktStreamTokenizer tokenizer)
        {
            List <ICoordinate> points = new List <ICoordinate>();
            bool comma = true;

            while (comma)
            {
                points.Add(readPointCoords(tokenizer));
                tokenizer.NextToken();
                comma = tokenizer.GetStringValue() == ",";
            }

            return(points);
        }
        /// <summary>
        /// Reads a prime meridian.
        /// </summary>
        private static IPrimeMeridian ReadPrimeMeridian(WktStreamTokenizer tokenizer)
        {
            tokenizer.ReadToken("[");
            string name = tokenizer.ReadDoubleQuotedWord();

            tokenizer.ReadToken(",");
            tokenizer.NextToken();
            double longitude = tokenizer.GetNumericValue();

            tokenizer.NextToken();
            string authority     = String.Empty;
            long   authorityCode = -1;

            if (tokenizer.GetStringValue() == ",")
            {
                ReadAuthority(tokenizer, ref authority, ref authorityCode);
                tokenizer.ReadToken("]");
            }

            IPrimeMeridian primeMeridian = new PrimeMeridian(longitude, AngularUnit.Degrees, name, authority, authorityCode, String.Empty, String.Empty, String.Empty);

            return(primeMeridian);
        }
        /// <summary>
        /// Constructs a coordinate system object from well-known text.
        /// </summary>
        /// <param name="wkt">Well-known text representation of object</param>
        /// <returns>An object constructed from well-known text</returns>
        /// <exception cref="System.ArgumentException">Raises when parsing of string fails.</exception>
        public static IInfo Parse(string wkt)
        {
            IInfo              returnObject = null;
            StringReader       reader       = new StringReader(wkt);
            WktStreamTokenizer tokenizer    = new WktStreamTokenizer(reader);

            tokenizer.NextToken();
            string objectName = tokenizer.GetStringValue();

            switch (objectName)
            {
            case "UNIT":
                returnObject = ReadUnit(tokenizer);
                break;

            //case "VERT_DATUM":
            //    IVerticalDatum verticalDatum = ReadVerticalDatum(tokenizer);
            //    returnObject = verticalDatum;
            //    break;
            case "SPHEROID":
                returnObject = ReadEllipsoid(tokenizer);
                break;

            case "DATUM":
                returnObject = ReadHorizontalDatum(tokenizer);;
                break;

            case "PRIMEM":
                returnObject = ReadPrimeMeridian(tokenizer);
                break;

            case "VERT_CS":
            case "GEOGCS":
            case "PROJCS":
            case "COMPD_CS":
            case "GEOCCS":
            case "FITTED_CS":
            case "LOCAL_CS":
                returnObject = ReadCoordinateSystem(wkt, tokenizer);
                break;

            default:
                throw new ArgumentException(String.Format("'{0}' is not recognized.", objectName));
            }
            reader.Close();
            return(returnObject);
        }
示例#15
0
        private static List <List <ICoordinate> > readPointsCoordLists(WktStreamTokenizer tokenizer)
        {
            List <List <ICoordinate> > result = new List <List <ICoordinate> >();
            bool comma = true;

            while (comma)
            {
                tokenizer.ReadToken("(");
                result.Add(readPointCoordsList(tokenizer));
                if (tokenizer.GetStringValue() == ")")
                {
                    tokenizer.NextToken();
                    comma = tokenizer.GetStringValue() == ",";
                }
                else
                {
                    throwMissingCloseBracket(tokenizer);
                }
            }
            return(result);
        }
示例#16
0
        /// <summary>
        /// Constructs a geometry from its well-known text representation.
        /// </summary>
        /// <returns>A constructed geometry</returns>
        public static IGeometry GeometryFromWKT(string wkt)
        {
            StringReader       sr        = new StringReader(wkt);
            WktStreamTokenizer tokenizer = new WktStreamTokenizer(sr);

            tokenizer.NextToken();
            switch (tokenizer.GetStringValue().ToUpper())
            {
            case "POINT": return(readPoint(tokenizer));

            case "LINESTRING": return(readLineString(tokenizer));

            case "MULTILINESTRING": return(readMultiLineString(tokenizer));

            case "POLYGON": return(readPolygon(tokenizer));

            case "MULTIPOLYGON": return(readMultiPolygon(tokenizer));

            case "MULTIPOINT": return(readMultiPoint(tokenizer));
            }

            throw new ArgumentException(string.Format("Unknown geometry \"{0}\"", tokenizer.GetStringValue()));
        }
示例#17
0
        /// <summary>
        /// Creates a Geometry using the next token in the stream.
        /// </summary>
        /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text
        /// format. The next tokens must form a &lt;Geometry Tagged Text&gt;.</param>
        /// <returns>Returns a Geometry specified by the next token in the stream.</returns>
        /// <remarks>
        /// Exception is thrown if the coordinates used to create a Polygon
        /// shell and holes do not form closed linestrings, or if an unexpected
        /// token is encountered.
        /// </remarks>
        private static IGeometry ReadGeometryTaggedText(WktStreamTokenizer tokenizer)
        {
            tokenizer.NextToken();
            var type = tokenizer.GetStringValue().ToUpper();
            IGeometry geometry;
            IGeometryFactory factory = new GeometryFactory();

            switch (type)
            {
                case "POINT":
                    geometry = ReadPointText(tokenizer, factory);
                    break;
                case "LINESTRING":
                    geometry = ReadLineStringText(tokenizer, factory);
                    break;
                case "MULTIPOINT":
                    geometry = ReadMultiPointText(tokenizer, factory);
                    break;
                case "MULTILINESTRING":
                    geometry = ReadMultiLineStringText(tokenizer, factory);
                    break;
                case "POLYGON":
                    geometry = ReadPolygonText(tokenizer, factory);
                    break;
                case "MULTIPOLYGON":
                    geometry = ReadMultiPolygonText(tokenizer, factory);
                    break;
                case "GEOMETRYCOLLECTION":
                    geometry = ReadGeometryCollectionText(tokenizer, factory);
                    break;
                default:
                    throw new Exception(String.Format(Map.NumberFormatEnUs, "Geometrytype '{0}' is not supported.",
                                                      type));
            }
            return geometry;
        }
示例#18
0
        /// <summary>
        /// Returns the next word in the stream as uppercase text.
        /// </summary>
        /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text
        /// format. The next token must be a word.</param>
        /// <returns>Returns the next word in the stream as uppercase text.</returns>
        /// <remarks>
        /// Exception is thrown if the next token is not a word.
        /// </remarks>
        private static string GetNextWord(WktStreamTokenizer tokenizer)
        {
            TokenType type = tokenizer.NextToken();
            string token = tokenizer.GetStringValue();
            if (type == TokenType.Number)
                throw new Exception("Expected a number but got " + token);
            if (type == TokenType.Word)
                return token.ToUpper();
            if (token == "(")
                return "(";
            if (token == ")")
                return ")";
            if (token == ",")
                return ",";

            throw new Exception("Not a valid symbol in WKT format.");
        }
示例#19
0
        /// <summary>
        /// Returns the next "EMPTY" or "(" in the stream as uppercase text.
        /// </summary>
        /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text
        /// format. The next token must be "EMPTY" or "(".</param>
        /// <returns>the next "EMPTY" or "(" in the stream as uppercase
        /// text.</returns>
        /// <remarks>
        /// ParseException is thrown if the next token is not "EMPTY" or "(".
        /// </remarks>
        private static string GetNextEmptyOrOpener(WktStreamTokenizer tokenizer)
        {
            tokenizer.NextToken();
            string nextWord = tokenizer.GetStringValue();
            if (nextWord == "EMPTY" || nextWord == "(")
                return nextWord;

            throw new Exception("Expected 'EMPTY' or '(' but encountered '" + nextWord + "'");
        }
示例#20
0
 /// <summary>
 /// Returns the next ")" or "," in the stream.
 /// </summary>
 /// <param name="tokenizer">tokenizer over a stream of text in Well-known Text
 /// format. The next token must be ")" or ",".</param>
 /// <returns>Returns the next ")" or "," in the stream.</returns>
 /// <remarks>
 /// ParseException is thrown if the next token is not ")" or ",".
 /// </remarks>
 private static string GetNextCloserOrComma(WktStreamTokenizer tokenizer)
 {
     tokenizer.NextToken();
     string nextWord = tokenizer.GetStringValue();
     if (nextWord == "," || nextWord == ")")
     {
         return nextWord;
     }
     throw new Exception("Expected ')' or ',' but encountered '" + nextWord + "'");
 }
示例#21
0
 /// <summary>
 /// Returns the next number in the stream.
 /// </summary>
 /// <param name="tokenizer">Tokenizer over a stream of text in Well-known text format.  The next token
 /// must be a number.</param>
 /// <returns>Returns the next number in the stream.</returns>
 /// <remarks>
 /// ParseException is thrown if the next token is not a number.
 /// </remarks>
 private static double GetNextNumber(WktStreamTokenizer tokenizer)
 {
     tokenizer.NextToken();
     return tokenizer.GetNumericValue();
 }