private static IRing BuildRing(WktToken token, WktText wkt, IObjectFactory objectFactory) { var ring = (IPointCollection)objectFactory.Create("esriGeometry.Ring"); //IPointCollection multiPoint = new RingClass(); foreach (var point in token.Tokens) { ring.AddPoint(BuildPoint(point, wkt, objectFactory)); } MakeZmAware((IGeometry)ring, wkt.HasZ, wkt.HasM); return((IRing)ring); }
private static IPath BuildPath(WktToken token, WktText wkt, IObjectFactory objectFactory) { var path = (IPointCollection)objectFactory.Create("esriGeometry.Path"); //IPointCollection multiPoint = new PathClass(); foreach (var point in token.Tokens) { path.AddPoint(BuildPoint(point, wkt, objectFactory)); } var geometry = path as IGeometry; MakeZmAware(geometry, wkt.HasZ, wkt.HasM); return((IPath)path); }
private static IPoint BuildPoint(WktToken token, WktText wkt, IObjectFactory objectFactory) { var coordinates = token.Coords.ToArray(); int partCount = coordinates.Length; if (!wkt.HasZ && !wkt.HasM && partCount != 2) { throw new ArgumentException("Mal-formed WKT, wrong number of elements, expecting x and y"); } if (wkt.HasZ && !wkt.HasM && partCount != 3) { throw new ArgumentException("Mal-formed WKT, wrong number of elements, expecting x y z"); } if (!wkt.HasZ && wkt.HasM && partCount != 3) { throw new ArgumentException("Mal-formed WKT, wrong number of elements, expecting x y m"); } if (wkt.HasZ && wkt.HasM && partCount != 4) { throw new ArgumentException("Mal-formed WKT, wrong number of elements, expecting x y z m"); } var point = (IPoint)objectFactory.Create("esriGeometry.Point"); //IPoint point = new PointClass(); point.PutCoords(coordinates[0], coordinates[1]); if (wkt.HasZ) { point.Z = coordinates[2]; } if (wkt.HasM && !wkt.HasZ) { point.M = coordinates[2]; } if (wkt.HasZ && wkt.HasM) { point.M = coordinates[3]; } MakeZmAware(point, wkt.HasZ, wkt.HasM); return(point); }
private void ParsePrefix(string s) { int startIndex = s.IndexOf('('); int endIndex = s.LastIndexOf(')'); string prefix = startIndex == -1 ? s : s.Substring(0, startIndex); HasZ = false; HasM = false; CoordinateCount = 2; prefix = prefix.Trim().ToLower(); if (prefix.EndsWith(" z")) { HasZ = true; CoordinateCount = 3; } if (prefix.EndsWith(" m")) { HasM = true; CoordinateCount = 3; } if (prefix.EndsWith(" zm")) { HasM = true; HasZ = true; CoordinateCount = 4; } Type = WktType.None; if (prefix.StartsWith("point")) { Type = WktType.Point; } if (prefix.StartsWith("linestring")) { Type = WktType.LineString; } if (prefix.StartsWith("polygon")) { Type = WktType.Polygon; } if (prefix.StartsWith("polyhedralsurface")) { Type = WktType.PolyhedralSurface; } if (prefix.StartsWith("triangle")) { Type = WktType.Triangle; } if (prefix.StartsWith("tin")) { Type = WktType.Tin; } if (prefix.StartsWith("multipoint")) { Type = WktType.MultiPoint; } if (prefix.StartsWith("multilinestring")) { Type = WktType.MultiLineString; } if (prefix.StartsWith("multipolygon")) { Type = WktType.MultiPolygon; } if (prefix.StartsWith("geometrycollection")) { Type = WktType.GeometryCollection; } Token = new WktToken(s, startIndex, endIndex); }