Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
 static string GeometryToWktString(LineString lineString)
 {
     return string.Format("({0})", string.Join(",", lineString.Positions.Select(GeometryToWktString)));
 }
Ejemplo n.º 4
0
        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;
        }
Ejemplo n.º 5
0
        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;
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        /// <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;
        }
Ejemplo n.º 8
0
        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;
        }
Ejemplo n.º 9
0
 static string GeometryToWktString(LineString lineString)
 {
     return(string.Format("({0})", string.Join(",", lineString.Positions.Select(GeometryToWktString))));
 }
Ejemplo n.º 10
0
 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;
 }