private static Ellipsoid ReadEllipsoid(WktStreamTokenizer tokenizer, bool includeAuthority) { //SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]] tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); double majorAxis = tokenizer.GetNumericValue(); tokenizer.ReadToken(","); tokenizer.NextToken(); double e = tokenizer.GetNumericValue(); string authority = String.Empty; string authorityCode = String.Empty; if (includeAuthority) { tokenizer.ReadToken(","); tokenizer.ReadAuthority(ref authority, ref authorityCode); } tokenizer.ReadToken("]"); Ellipsoid ellipsoid = new Ellipsoid(majorAxis, 0.0, e, true, LinearUnit.Meters, String.Empty, authority, authorityCode, name, String.Empty, String.Empty); return(ellipsoid); }
private static VerticalCoordinateSystem ReadVerticalCoordinateSystem(WktStreamTokenizer tokenizer, bool includeAuthority) { //VERT_CS["Newlyn", //VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["EPSG","5101"]] //UNIT["metre",1,AUTHORITY["EPSG","9001"]] //AUTHORITY["EPSG","5701"] tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.ReadToken("VERT_DATUM"); VerticalDatum verticalDatum = ReadVerticalDatum(tokenizer, includeAuthority); tokenizer.ReadToken("UNIT"); Unit unit = ReadUnit(tokenizer, includeAuthority); string authority = String.Empty; string authorityCode = String.Empty; if (includeAuthority) { tokenizer.ReadAuthority(ref authority, ref authorityCode); } tokenizer.ReadToken("]"); VerticalCoordinateSystem verticalCS = new VerticalCoordinateSystem(name, verticalDatum, String.Empty, authority, authorityCode, String.Empty, String.Empty); return(verticalCS); }
internal static GeographicCoordinateSystem ReadGeographicCoordinateSystem(WktStreamTokenizer tokenizer, bool includeAuthority) { //GEOGCS["OSGB 1936", //DATUM["OSGB 1936",SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6277"]] //PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]] //UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]] //AXIS["Geodetic latitude","NORTH"] //AXIS["Geodetic longitude","EAST"] //AUTHORITY["EPSG","4277"] //] tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.ReadToken("DATUM"); HorizontalDatum horizontalDatum = ReadHorizontalDatum(tokenizer, includeAuthority); tokenizer.ReadToken(","); tokenizer.ReadToken("PRIMEM"); PrimeMeridian primeMeridian = ReadPrimeMeridian(tokenizer, includeAuthority); tokenizer.ReadToken(","); tokenizer.ReadToken("UNIT"); Unit angularUnit = ReadUnit(tokenizer, includeAuthority); AxisInfo axisInfo1 = null, axisInfo2 = null; if (tokenizer.TryReadToken(",")) { if (tokenizer.TryReadToken("AXIS")) { axisInfo1 = ReadAxisInfo(tokenizer); } if (tokenizer.TryReadToken(",")) { if (tokenizer.TryReadToken("AXIS")) { axisInfo2 = ReadAxisInfo(tokenizer); } } } string authority = String.Empty; string authorityCode = String.Empty; if (includeAuthority) { tokenizer.ReadToken(","); tokenizer.ReadAuthority(ref authority, ref authorityCode); } tokenizer.ReadToken("]"); GeographicCoordinateSystem geographicCS = new GeographicCoordinateSystem(angularUnit as AngularUnit, horizontalDatum, primeMeridian, axisInfo1, axisInfo2, String.Empty, authority, authorityCode, name, String.Empty, String.Empty); return(geographicCS); }
private static CompoundCoordinateSystem ReadCompoundCoordinateSystem(WktStreamTokenizer tokenizer, bool includeAuthority) { //COMPD_CS[ //"OSGB36 / British National Grid + ODN", //PROJCS[] //VERT_CS[] //AUTHORITY["EPSG","7405"] //] //TODO add a ReadCoordinateSystem - that determines the correct coordinate system to //read. Right now this hard coded for a projected and a vertical coord sys - so the UK //national grid works. tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); string headCSCode = tokenizer.GetStringValue(); CoordinateSystem headCS = ReadCoordinateSystem(headCSCode, tokenizer, includeAuthority); tokenizer.ReadToken(","); tokenizer.NextToken(); string tailCSCode = tokenizer.GetStringValue(); CoordinateSystem tailCS = ReadCoordinateSystem(tailCSCode, tokenizer, includeAuthority); string authority = String.Empty; string authorityCode = String.Empty; if (includeAuthority) { tokenizer.ReadToken(","); tokenizer.ReadAuthority(ref authority, ref authorityCode); } tokenizer.ReadToken("]"); CompoundCoordinateSystem compoundCS = new CompoundCoordinateSystem(headCS, tailCS, String.Empty, authority, authorityCode, name, String.Empty, String.Empty); return(compoundCS); }
private static HorizontalDatum ReadHorizontalDatum(WktStreamTokenizer tokenizer, bool includeAuthority) { //DATUM["OSGB 1936", // SPHEROID["Airy 1830",6377563.396,299.3249646,AUTHORITY["EPSG","7001"]], // TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6277"]] tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.ReadToken("SPHEROID"); Ellipsoid ellipsoid = ReadEllipsoid(tokenizer, includeAuthority); string authority = String.Empty; string authorityCode = String.Empty; WGS84ConversionInfo wgsInfo = new WGS84ConversionInfo(); wgsInfo.IsInUse = false; if (tokenizer.TryReadToken(",")) { if (tokenizer.TryReadToken("TOWGS84")) { wgsInfo = ReadWGS84ConversionInfo(tokenizer, includeAuthority); } if (includeAuthority) { tokenizer.ReadToken(","); tokenizer.ReadAuthority(ref authority, ref authorityCode); } } tokenizer.ReadToken("]"); // make an assumption about the datum type. DatumType datumType = DatumType.IHD_Geocentric; HorizontalDatum horizontalDatum = new HorizontalDatum(name, datumType, ellipsoid, wgsInfo, String.Empty, authority, authorityCode, String.Empty, String.Empty); return(horizontalDatum); }
private static VerticalDatum ReadVerticalDatum(WktStreamTokenizer tokenizer, bool includeAuthority) { //VERT_DATUM["Ordnance Datum Newlyn",2005,AUTHORITY["5101","EPSG"]] tokenizer.ReadToken("["); string datumName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); string datumTypeNumber = tokenizer.GetStringValue(); string authority = String.Empty; string authorityCode = String.Empty; if (includeAuthority) { tokenizer.ReadToken(","); tokenizer.ReadAuthority(ref authority, ref authorityCode); } DatumType datumType = (DatumType)Enum.Parse(typeof(DatumType), datumTypeNumber); VerticalDatum verticalDatum = new VerticalDatum(datumType, String.Empty, authorityCode, authority, datumName, String.Empty, String.Empty); tokenizer.ReadToken("]"); return(verticalDatum); }
private static PrimeMeridian ReadPrimeMeridian(WktStreamTokenizer tokenizer, bool includeAuthority) { //PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]] tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); double longitude = tokenizer.GetNumericValue(); string authority = String.Empty; string authorityCode = String.Empty; if (includeAuthority) { tokenizer.ReadToken(","); tokenizer.ReadAuthority(ref authority, ref authorityCode); } // make an assumption about the Angular units - degrees. PrimeMeridian primeMeridian = new PrimeMeridian(name, new AngularUnit(180 / Math.PI), longitude, String.Empty, authority, authorityCode, String.Empty, String.Empty); tokenizer.ReadToken("]"); return(primeMeridian); }
private static Unit ReadUnit(WktStreamTokenizer tokenizer, bool includeAuthority) { //UNIT["degree",0.01745329251994433,AUTHORITY["EPSG","9102"]] Unit unit = null; tokenizer.ReadToken("["); string unitName = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.NextToken(); double unitsPerUnit = tokenizer.GetNumericValue(); string authority = String.Empty; string authorityCode = String.Empty; if (includeAuthority) { tokenizer.ReadToken(","); tokenizer.ReadAuthority(ref authority, ref authorityCode); } tokenizer.ReadToken("]"); switch (unitName.ToUpper()) { // take into account the different spellings of the word meter/metre. case "METER": case "METRE": case "KILOMETRE": case "KILOMETER": unit = new LinearUnit(unitsPerUnit, String.Empty, authority, authorityCode, unitName, String.Empty, String.Empty); break; case "DEGREE": case "RADIAN": case "GRAD": unit = new AngularUnit(unitsPerUnit, String.Empty, authority, authorityCode, unitName, String.Empty, String.Empty); break; //case "CLARKE'S LINK": //case "GOLD COAST FOOT": //case "US SURVEY FOOT": //case "CLARKE'S FOOT": //case "FOOT": //case "LINK": //case "INDIAN YARD": //case "GERMAN LEGAL METRE": //case "BRITISH CHAIN (SEARS 1922)": //case "BRITISH FOOT (SEARS 1922)": //case "BRITISH CHAIN (SEARS 1922 TRUNCATED)": //case "BRITISH CHAIN (BENOIT 1922 TRUNCATED)": // unit = new LinearUnit(unitsPerUnit, String.Empty, authority, authorityCode, unitName, String.Empty, String.Empty); // break; default: string u = unitName.ToUpper(); if (u.Contains("YARD") || u.Contains("CHAIN") || u.Contains("FOOT") || u.Contains("LINK") || u.Contains("METRE") || u.Contains("METER") || u.Contains("KILOMETER") || u.Contains("KILOMETRE")) { unit = new LinearUnit(unitsPerUnit, String.Empty, authority, authorityCode, unitName, String.Empty, String.Empty); } else { throw new NotImplementedException(String.Format("{0} is not recognized a unit of measure.", unitName)); } break; } return(unit); }
private static ProjectedCoordinateSystem ReadProjectedCoordinateSystem(WktStreamTokenizer tokenizer, bool includeAuthority) { //PROJCS[ // "OSGB 1936 / British National Grid", // GEOGCS[ // "OSGB 1936", // DATUM[...] // PRIMEM[...] // AXIS["Geodetic latitude",NORTH] // AXIS["Geodetic longitude",EAST] // AUTHORITY["EPSG","4277"] // ], // PROJECTION["Transverse Mercator"], // PARAMETER["latitude_of_natural_origin",49], // PARAMETER["longitude_of_natural_origin",-2], // PARAMETER["scale_factor_at_natural_origin",0.999601272], // PARAMETER["false_easting",400000], // PARAMETER["false_northing",-100000], // AXIS["Easting",EAST], // AXIS["Northing",NORTH], // AUTHORITY["EPSG","27700"] //] tokenizer.ReadToken("["); string name = tokenizer.ReadDoubleQuotedWord(); tokenizer.ReadToken(","); tokenizer.ReadToken("GEOGCS"); GeographicCoordinateSystem geographicCS = ReadGeographicCoordinateSystem(tokenizer, includeAuthority); tokenizer.ReadToken(","); Projection projection = ReadProjection(tokenizer, includeAuthority); tokenizer.ReadToken("UNIT"); Unit unit = ReadUnit(tokenizer, includeAuthority); AxisInfo axisInfo1 = null, axisInfo2 = null; if (tokenizer.TryReadToken(",")) { if (tokenizer.TryReadToken("AXIS")) { axisInfo1 = ReadAxisInfo(tokenizer); } if (tokenizer.TryReadToken(",")) { if (tokenizer.TryReadToken("AXIS")) { axisInfo2 = ReadAxisInfo(tokenizer); } } } string authority = String.Empty; string authorityCode = String.Empty; if (includeAuthority) { tokenizer.ReadToken(","); tokenizer.ReadAuthority(ref authority, ref authorityCode); } tokenizer.ReadToken("]"); int axisInfoDim = 0; if (axisInfo1 != null) { axisInfoDim = 1; } if (axisInfo2 != null) { axisInfoDim = 2; } AxisInfo[] axisArray = new AxisInfo[axisInfoDim]; if (axisInfo1 != null) { axisArray[0] = axisInfo1; } if (axisInfo2 != null) { axisArray[1] = axisInfo2; } ProjectedCoordinateSystem projectedCS = new ProjectedCoordinateSystem(geographicCS.HorizontalDatum, axisArray, geographicCS, unit as LinearUnit, projection, String.Empty, authority, authorityCode, name, String.Empty, String.Empty); return(projectedCS); }