public static XamlShapes.Shape RenderMultiLineString(MultiLineString multiLineString, IStyle style, IViewport viewport) { if (!(style is VectorStyle)) throw new ArgumentException("Style is not of type VectorStyle"); var vectorStyle = style as VectorStyle; XamlShapes.Path path = CreateLineStringPath(vectorStyle); path.Data = multiLineString.ToXaml(); path.RenderTransform = new XamlMedia.MatrixTransform { Matrix = CreateTransformMatrix1(viewport) }; CounterScaleLineWidth(path, viewport.Resolution); return path; }
public static void Render(Graphics graphics, MultiLineString lines, Pen pen, IViewport viewport) { foreach (var lineString in lines.LineStrings) LineStringRenderer.Render(graphics, lineString, pen, viewport); }
/// <summary> /// Converts a MultiLineString to <MultiLineString Text> /// format, then Appends it to the writer. /// </summary> /// <param name="multiLineString">The MultiLineString to process.</param> /// <param name="writer">The output stream writer to Append to.</param> private static void AppendMultiLineStringText(MultiLineString multiLineString, StringWriter writer) { if (multiLineString == null || multiLineString.IsEmpty()) writer.Write("EMPTY"); else { writer.Write("("); for (int i = 0; i < multiLineString.LineStrings.Count; i++) { if (i > 0) writer.Write(", "); AppendLineStringText(multiLineString[i], writer); } writer.Write(")"); } }
/// <summary> /// Converts a MultiLineString to <MultiLineString Tagged /// Text> format, then Appends it to the writer. /// </summary> /// <param name="multiLineString">The MultiLineString to process</param> /// <param name="writer">The output stream writer to Append to.</param> private static void AppendMultiLineStringTaggedText(MultiLineString multiLineString, StringWriter writer) { writer.Write("MULTILINESTRING "); AppendMultiLineStringText(multiLineString, writer); }
/// <summary> /// Creates a <see cref="MultiLineString"/> 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 MultiLineString Text</param> /// <returns>a <see cref="MultiLineString"/> specified by the next token in the stream</returns> private static MultiLineString ReadMultiLineStringText(WktStreamTokenizer tokenizer) { var lines = new MultiLineString(); string nextToken = GetNextEmptyOrOpener(tokenizer); if (nextToken == "EMPTY") return lines; lines.LineStrings.Add(ReadLineStringText(tokenizer)); nextToken = GetNextCloserOrComma(tokenizer); while (nextToken == ",") { lines.LineStrings.Add(ReadLineStringText(tokenizer)); nextToken = GetNextCloserOrComma(tokenizer); } return lines; }
/// <summary> /// This method produces instances of type <see cref="Mapsui.Geometries.MultiLineString"/>. /// </summary> /// <returns>The created geometries</returns> internal override Collection<Geometry> CreateGeometries(Features features) { IPathNode multiLineStringNode = new PathNode(Gmlns, "MultiLineString", (NameTable) XmlReader.NameTable); IPathNode multiCurveNode = new PathNode(Gmlns, "MultiCurve", (NameTable) XmlReader.NameTable); IPathNode multiLineStringNodeAlt = new AlternativePathNodesCollection(multiLineStringNode, multiCurveNode); IPathNode lineStringMemberNode = new PathNode(Gmlns, "lineStringMember", (NameTable) XmlReader.NameTable); IPathNode curveMemberNode = new PathNode(Gmlns, "curveMember", (NameTable) XmlReader.NameTable); IPathNode lineStringMemberNodeAlt = new AlternativePathNodesCollection(lineStringMemberNode, curveMemberNode); var labelValue = new string[1]; bool geomFound = false; try { // Reading the entire feature's node makes it possible to collect label values that may appear before or after the geometry property while ((FeatureReader = GetSubReaderOf(XmlReader, null, FeatureNode)) != null) { while ( (GeomReader = GetSubReaderOf(FeatureReader, labelValue, multiLineStringNodeAlt, lineStringMemberNodeAlt)) != null) { var multiLineString = new MultiLineString(); GeometryFactory geomFactory = new LineStringFactory(GeomReader, FeatureTypeInfo); Collection<Geometry> lineStrings = geomFactory.CreateGeometries(features); foreach (LineString lineString in lineStrings) multiLineString.LineStrings.Add(lineString); Geoms.Add(multiLineString); geomFound = true; } if (geomFound) features.Add(CreateFeature(Geoms[Geoms.Count - 1], FeatureTypeInfo.LableField, labelValue[0])); geomFound = false; } } catch (Exception ex) { Trace.TraceError("An exception occured while parsing a multi-lineString geometry: " + ex.Message); throw; } return Geoms; }
/// <summary> /// Writes a multilinestring. /// </summary> /// <param name="mls">The multilinestring to be written.</param> /// <param name="bWriter">Stream to write to.</param> /// <param name="byteorder">Byte order</param> private static void WriteMultiLineString(MultiLineString mls, BinaryWriter bWriter, WkbByteOrder byteorder) { //Write the number of linestrings. WriteUInt32((uint) mls.LineStrings.Count, bWriter, byteorder); //Loop on the number of linestrings. foreach (LineString ls in mls.LineStrings) { //Write LineString Header bWriter.Write((byte) byteorder); WriteUInt32((uint) WKBGeometryType.WKBLineString, bWriter, byteorder); //Write each linestring. WriteLineString(ls, bWriter, byteorder); } }
/// <summary> /// Return a copy of this geometry /// </summary> /// <returns>Copy of Geometry</returns> public new MultiLineString Clone() { var geoms = new MultiLineString(); foreach (var lineString in LineStrings) { geoms.LineStrings.Add(lineString.Clone()); } return geoms; }
protected override List<IGeometry> GetGeometries() { List<IGeometry> res = new List<IGeometry>(); MultiLineString mult = new MultiLineString(); LineString line = new LineString(); int count = 1; foreach (var point in _points) { Point p = _currentProjection.Project(point.X, point.Y); if (p == null) { return null; } if (line.Vertices.Count == 0) { line.Vertices.Add(p); } else { var prev = _currentProjection.Inverse(line.Vertices.LastOrDefault().X, line.Vertices.LastOrDefault().Y); if (Math.Abs(line.Vertices.LastOrDefault().X - p.X) > 180) { double x1 = prev.X >= 0 ? 180 : -180; double x2 = -x1; double y = prev.Y + (point.Y - prev.Y) * Math.Abs(x1 - prev.X) / (Math.Abs(point.X - x2) + Math.Abs(x1 - prev.X)); var p1 = _currentProjection.Project(x1, y); if (p1 != null) { line.Vertices.Add(p1); } else { return null; } mult.LineStrings.Add(line); count++; line = new LineString(); var p2 = _currentProjection.Project(x2, y); if (p2 != null) { line.Vertices.Add(p2); } else { return null; } line.Vertices.Add(p); } else { line.Vertices.Add(p); } } } mult.LineStrings.Add(line); if (count == 1) { res.Add(line); } res.Add(mult); return res; }
private static MultiLineString CreateWKBMultiLineString(BinaryReader reader, WkbByteOrder byteOrder) { // Get the number of linestrings in this multilinestring. var numLineStrings = (int) ReadUInt32(reader, byteOrder); // Create a new array for the linestrings . var mline = new MultiLineString(); // Loop on the number of linestrings. for (int i = 0; i < numLineStrings; i++) { // Read linestring header reader.ReadByte(); ReadUInt32(reader, byteOrder); // Create the next linestring and add it to the array. mline.LineStrings.Add(CreateWKBLineString(reader, byteOrder)); } // Create and return the MultiLineString. return mline; }
/// <summary> /// Reads and parses the geometry with ID 'oid' from the ShapeFile /// </summary> /// <remarks><see cref="FilterDelegate">Filtering</see> is not applied to this method</remarks> /// <param name="oid">Object ID</param> /// <returns>geometry</returns> private Geometry ReadGeometry(uint oid) { brShapeFile.BaseStream.Seek(GetShapeIndex(oid) + 8, 0); //Skip record number and content length ShapeType type = (ShapeType) brShapeFile.ReadInt32(); //Shape type if (type == ShapeType.Null) return null; if (_ShapeType == ShapeType.Point || _ShapeType == ShapeType.PointM || _ShapeType == ShapeType.PointZ) { Point tempFeature = new Point(); return new Point(brShapeFile.ReadDouble(), brShapeFile.ReadDouble()); } else if (_ShapeType == ShapeType.Multipoint || _ShapeType == ShapeType.MultiPointM || _ShapeType == ShapeType.MultiPointZ) { brShapeFile.BaseStream.Seek(32 + brShapeFile.BaseStream.Position, 0); //skip min/max box MultiPoint feature = new MultiPoint(); int nPoints = brShapeFile.ReadInt32(); // get the number of points if (nPoints == 0) return null; for (int i = 0; i < nPoints; i++) feature.Points.Add(new Point(brShapeFile.ReadDouble(), brShapeFile.ReadDouble())); return feature; } else if (_ShapeType == ShapeType.PolyLine || _ShapeType == ShapeType.Polygon || _ShapeType == ShapeType.PolyLineM || _ShapeType == ShapeType.PolygonM || _ShapeType == ShapeType.PolyLineZ || _ShapeType == ShapeType.PolygonZ) { brShapeFile.BaseStream.Seek(32 + brShapeFile.BaseStream.Position, 0); //skip min/max box int nParts = brShapeFile.ReadInt32(); // get number of parts (segments) if (nParts == 0) return null; int nPoints = brShapeFile.ReadInt32(); // get number of points int[] segments = new int[nParts + 1]; //Read in the segment indexes for (int b = 0; b < nParts; b++) segments[b] = brShapeFile.ReadInt32(); //add end point segments[nParts] = nPoints; if ((int) _ShapeType%10 == 3) { MultiLineString mline = new MultiLineString(); for (int LineID = 0; LineID < nParts; LineID++) { LineString line = new LineString(); for (int i = segments[LineID]; i < segments[LineID + 1]; i++) line.Vertices.Add(new Point(brShapeFile.ReadDouble(), brShapeFile.ReadDouble())); mline.LineStrings.Add(line); } if (mline.LineStrings.Count == 1) return mline[0]; return mline; } else //(_ShapeType == ShapeType.Polygon etc...) { //First read all the rings List<LinearRing> rings = new List<LinearRing>(); for (int RingID = 0; RingID < nParts; RingID++) { LinearRing ring = new LinearRing(); for (int i = segments[RingID]; i < segments[RingID + 1]; i++) ring.Vertices.Add(new Point(brShapeFile.ReadDouble(), brShapeFile.ReadDouble())); rings.Add(ring); } bool[] IsCounterClockWise = new bool[rings.Count]; int PolygonCount = 0; for (int i = 0; i < rings.Count; i++) { IsCounterClockWise[i] = rings[i].IsCCW(); if (!IsCounterClockWise[i]) PolygonCount++; } if (PolygonCount == 1) //We only have one polygon { Polygon poly = new Polygon(); poly.ExteriorRing = rings[0]; if (rings.Count > 1) for (int i = 1; i < rings.Count; i++) poly.InteriorRings.Add(rings[i]); return poly; } else { MultiPolygon mpoly = new MultiPolygon(); Polygon poly = new Polygon(); poly.ExteriorRing = rings[0]; for (int i = 1; i < rings.Count; i++) { if (!IsCounterClockWise[i]) { mpoly.Polygons.Add(poly); poly = new Polygon(rings[i]); } else poly.InteriorRings.Add(rings[i]); } mpoly.Polygons.Add(poly); return mpoly; } } } else throw (new ApplicationException("Shapefile type " + _ShapeType.ToString() + " not supported")); }
public static void DrawMultiLineString(Graphics graphics, MultiLineString lines, Pen pen, IViewport viewport) { foreach (LineString t in lines.LineStrings) DrawLineString(graphics, t, pen, viewport); }
/// <summary> /// Reads and parses the geometry with ID 'oid' from the ShapeFile /// </summary> /// <remarks><see cref="FilterDelegate">Filtering</see> is not applied to this method</remarks> /// <param name="oid">Object ID</param> /// <returns>geometry</returns> // ReSharper disable once CyclomaticComplexity // Fix when changes need to be made here private Geometry ReadGeometry(uint oid) { _brShapeFile.BaseStream.Seek(GetShapeIndex(oid) + 8, 0); //Skip record number and content length var type = (ShapeType)_brShapeFile.ReadInt32(); //Shape type if (type == ShapeType.Null) return null; if (_shapeType == ShapeType.Point || _shapeType == ShapeType.PointM || _shapeType == ShapeType.PointZ) { return new Point(_brShapeFile.ReadDouble(), _brShapeFile.ReadDouble()); } if (_shapeType == ShapeType.Multipoint || _shapeType == ShapeType.MultiPointM || _shapeType == ShapeType.MultiPointZ) { _brShapeFile.BaseStream.Seek(32 + _brShapeFile.BaseStream.Position, 0); //skip min/max box var feature = new MultiPoint(); int nPoints = _brShapeFile.ReadInt32(); // get the number of points if (nPoints == 0) return null; for (int i = 0; i < nPoints; i++) feature.Points.Add(new Point(_brShapeFile.ReadDouble(), _brShapeFile.ReadDouble())); return feature; } if (_shapeType == ShapeType.PolyLine || _shapeType == ShapeType.Polygon || _shapeType == ShapeType.PolyLineM || _shapeType == ShapeType.PolygonM || _shapeType == ShapeType.PolyLineZ || _shapeType == ShapeType.PolygonZ) { _brShapeFile.BaseStream.Seek(32 + _brShapeFile.BaseStream.Position, 0); //skip min/max box int nParts = _brShapeFile.ReadInt32(); // get number of parts (segments) if (nParts == 0) return null; int nPoints = _brShapeFile.ReadInt32(); // get number of points var segments = new int[nParts + 1]; //Read in the segment indexes for (int b = 0; b < nParts; b++) segments[b] = _brShapeFile.ReadInt32(); //add end point segments[nParts] = nPoints; if ((int)_shapeType % 10 == 3) { var mline = new MultiLineString(); for (int lineId = 0; lineId < nParts; lineId++) { var line = new LineString(); for (int i = segments[lineId]; i < segments[lineId + 1]; i++) line.Vertices.Add(new Point(_brShapeFile.ReadDouble(), _brShapeFile.ReadDouble())); mline.LineStrings.Add(line); } if (mline.LineStrings.Count == 1) return mline[0]; return mline; } else //(_ShapeType == ShapeType.Polygon etc...) { //First read all the rings var rings = new List<LinearRing>(); for (int ringId = 0; ringId < nParts; ringId++) { var ring = new LinearRing(); for (int i = segments[ringId]; i < segments[ringId + 1]; i++) ring.Vertices.Add(new Point(_brShapeFile.ReadDouble(), _brShapeFile.ReadDouble())); rings.Add(ring); } var isCounterClockWise = new bool[rings.Count]; int polygonCount = 0; for (int i = 0; i < rings.Count; i++) { isCounterClockWise[i] = rings[i].IsCCW(); if (!isCounterClockWise[i]) polygonCount++; } if (polygonCount == 1) //We only have one polygon { var poly = new Polygon { ExteriorRing = rings[0] }; if (rings.Count > 1) for (int i = 1; i < rings.Count; i++) poly.InteriorRings.Add(rings[i]); return poly; } else { var mpoly = new MultiPolygon(); var poly = new Polygon { ExteriorRing = rings[0] }; for (var i = 1; i < rings.Count; i++) { if (!isCounterClockWise[i]) { mpoly.Polygons.Add(poly); poly = new Polygon(rings[i]); } else poly.InteriorRings.Add(rings[i]); } mpoly.Polygons.Add(poly); return mpoly; } } } throw (new ApplicationException("Shapefile type " + _shapeType.ToString() + " not supported")); }
/// <summary> /// Return a copy of this geometry /// </summary> /// <returns>Copy of Geometry</returns> public new MultiLineString Clone() { var geoms = new MultiLineString(); foreach (LineString lineString in lineStrings) geoms.LineStrings.Add(lineString.Clone()); return geoms; }