public void CreatePolygonFromNonClosedLineString() { LineString ls = new LineString(new GeographicPosition[] { new GeographicPosition(-10, 10), new GeographicPosition(-10, 5) }.Cast<IPosition>().ToList()); Polygon poly = new Polygon(new LineString[] { ls }.ToList()); poly.ToGml(); }
/// <summary> /// LineString from WKT. /// </summary> /// <returns>The LineString</returns> /// <param name="wkt">WKT.</param> public static LineString LineStringFromWKT(string wkt) { string[] terms = wkt.TrimStart('(').TrimEnd(')').Split(','); string[] values; List<IPosition> positions = new List<IPosition>(terms.Length); GeographicPosition prevgeopos = null; for (int i = 0; i < terms.Length; i++) { values = terms[i].Trim(' ').Split(' '); string z = (values.Length > 2 ? values[2] : null); GeographicPosition geopos = new GeographicPosition(values[1], values[0], z); try { if (prevgeopos != null && Enumerable.SequenceEqual(geopos.Coordinates, prevgeopos.Coordinates)) continue; } catch { } positions.Add(geopos); prevgeopos = geopos; } LineString test = new LineString(positions); return test; }
static string GeometryToWktString(LineString lineString) { return string.Format("({0})", string.Join(",", lineString.Positions.Select(GeometryToWktString))); }
public static LineString ToGeometry(this LinearRingType linearRing) { List<IPosition> positions; Type posType = linearRing.Items1ElementName.First().GetType(); positions = FromGMLData(linearRing.Items1, Array.ConvertAll<Items1ChoiceType2, string>(linearRing.Items1ElementName, i => i.ToString())); LineString linestring = new LineString(positions); if (linestring.Positions.Count < 4 || !linestring.IsClosed()) throw new InvalidFormatException("invalid GML representation: linearring is not a closed ring of minimum 4 positions"); return linestring; }
public static List<LineString> SplitWorldExtent(LineString lineString) { List<LineString> newLineStrings = new List<LineString>(); LineString currentLineString = new LineString(); newLineStrings.Add(currentLineString); GeographicPosition previous_position = (GeographicPosition)lineString.Positions[0]; currentLineString.Positions.Add(previous_position); int currentPosition = 0; int dayline = 0; for (int i = 1; i < lineString.Positions.Count; i++) { GeographicPosition current_position = (GeographicPosition)lineString.Positions[i]; if ((current_position.Longitude != 180 && previous_position.Longitude != 180) || (current_position.Longitude != -180 && previous_position.Longitude != -180)) { if ((current_position.Longitude - previous_position.Longitude < -90) || (current_position.Longitude - previous_position.Longitude > 90)) { LineString newLineString = currentLineString; if (current_position.Longitude - previous_position.Longitude > 90) { dayline--; if (currentPosition == 0) { newLineString = new LineString(); newLineStrings.Insert(0, newLineString); } else { newLineString = newLineStrings[--currentPosition]; } } if (current_position.Longitude - previous_position.Longitude < -90) { dayline++; if (newLineStrings.Count <= currentPosition + 1) { newLineString = new LineString(); newLineStrings.Add(newLineString); } else { newLineString = newLineStrings[currentPosition + 1]; } currentPosition++; } double new_longitude; double new_latitude; double? new_altitude; double new_longitude2; double new_latitude2; double? new_altitude2; if (previous_position.Longitude > 0) { new_longitude = 180; new_longitude2 = -180; } else { new_longitude = -180; new_longitude2 = 180; } // Calaculate the latitude to be linear with the next point if ((current_position.Longitude - previous_position.Longitude + 2 * new_longitude) == 0) { new_latitude = (current_position.Latitude - previous_position.Latitude) * (-1 * new_longitude - previous_position.Longitude + 2 * new_longitude) + previous_position.Latitude; } else { new_latitude = (current_position.Latitude - previous_position.Latitude) * (-1 * new_longitude - previous_position.Longitude + 2 * new_longitude) / (current_position.Longitude - previous_position.Longitude + 2 * new_longitude) + previous_position.Latitude; } new_latitude2 = new_latitude; new_altitude = new_altitude2 = current_position.Altitude; GeographicPosition new_position1 = new GeographicPosition(new_latitude, new_longitude, new_altitude); GeographicPosition new_position2 = new GeographicPosition(new_latitude2, new_longitude2, new_altitude2); newLineString.Positions.Add(new_position2); currentLineString.Positions.Add(new_position1); if (dayline == 0) currentLineString.Positions.Add(currentLineString.Positions[0]); currentLineString = newLineString; } } currentLineString.Positions.Add(current_position); previous_position = current_position; } return newLineStrings; }
private static Polygon FromGMLLinearRing(XmlElement gml) { List<IPosition> positions; positions = FromGMLData(gml.ChildNodes); if (positions.Count < 4 || IsClosed2D(positions)) throw new InvalidFormatException("invalid GML representation: linearring is not a closed ring of minimum 4 positions"); LineString linestring = new LineString(positions); List <LineString> linestrings = new List <LineString>(); linestrings.Add(linestring); return new Polygon(linestrings); }
/// <summary> /// LineString from WK. /// </summary> /// <returns>The LineString</returns> /// <param name="wkt">WKT.</param> public static LineString LineStringFromWKT(string wkt) { string[] terms = wkt.TrimStart('(').TrimEnd(')').Split(','); string[] values; List<IPosition> positions = new List<IPosition>(terms.Length); for (int i = 0; i < terms.Length; i++) { values = terms[i].Trim(' ').Split(' '); string z = (values.Length > 2 ? values[2] : null); GeographicPosition geopos = new GeographicPosition(values[1], values[0], z); positions.Add(geopos); } LineString test = new LineString(positions); return test; }
public static GeometryObject ToGeometry(this Terradue.GeoJson.GeoRss10.GeoRss10Polygon georssPolygon) { if (georssPolygon.Item == null) return null; Polygon polygon = new Polygon(); polygon.LineStrings = new System.Collections.Generic.List<LineString>(); LineString ls = new LineString(new DirectPositionListType(){ Text = georssPolygon.Item }.ToGeometry()); if (ls.Positions.Count < 4 || !ls.IsClosed()) throw new InvalidFormatException("invalid GML representation: linearring is not a closed ring of minimum 4 positions"); polygon.LineStrings.Add(ls); return polygon; }
static string GeometryToWktString(LineString lineString) { return(string.Format("({0})", string.Join(",", lineString.Positions.Select(GeometryToWktString)))); }
public static Terradue.GeoJson.Gml.LineStringType GeometryToGml(LineString lineString) { Terradue.GeoJson.Gml.LineStringType gmlLineString = new Terradue.GeoJson.Gml.LineStringType(); gmlLineString.ItemsElementName = new Terradue.GeoJson.Gml.ItemsChoiceType[1]; gmlLineString.ItemsElementName[0] = Terradue.GeoJson.Gml.ItemsChoiceType.posList; gmlLineString.Items = new object[1]; gmlLineString.Items[0] = GeometryToGml(lineString.Positions.ToArray()); return gmlLineString; }