/// <summary> /// Converts the multi line string to Well-known Text (WKT) representation. /// </summary> /// <param name="multiLineString">The multi line string.</param> /// <param name="dimension">The dimension of the geometry.</param> /// <returns>The converted multi line string.</returns> private static String ToWellKnownText(IMultiLineString multiLineString, Int32 dimension) { StringBuilder builder = new StringBuilder(20 + (dimension == 2 ? 20 : 30) * multiLineString.Sum(lineString => lineString.Count)); if (dimension == 3) { builder.Append("MULTILINESTRING Z ("); } else { builder.Append("MULTILINESTRING ("); } for (Int32 lineStringIndex = 0; lineStringIndex < multiLineString.Count; lineStringIndex++) { if (lineStringIndex > 0) { builder.Append(", "); } builder.Append("("); ConvertCoordinates(builder, multiLineString[lineStringIndex], dimension); builder.Append(")"); } builder.Append(")"); return(builder.ToString()); }
/// <summary> /// Computes the Well-known Binary (WKB) representation. /// </summary> /// <param name="geometry">The geometry.</param> /// <param name="byteOrder">The byte-order of the conversion.</param> /// <param name="geometryModel">The geometry model of the conversion.</param> /// <returns>The WKB representation of the <paramref name="geometry" />.</returns> private static Byte[] ComputeWellKnownBinary(IMultiLineString geometry, ByteOrder byteOrder, GeometryModel geometryModel) { Byte[] geometryBytes = new Byte[9 + 4 * geometry.Count + ((geometryModel == GeometryModel.Spatial3D) ? 24 : 16) * geometry.Sum(lineString => lineString.Count)]; if (byteOrder == ByteOrder.LittleEndian) { geometryBytes[0] = 1; } if (geometryModel == GeometryModel.Spatial3D) { EndianBitConverter.CopyBytes((Int32)WellKnownBinaryTypes.MultiLineStringZ, geometryBytes, 1, byteOrder); } else { EndianBitConverter.CopyBytes((Int32)WellKnownBinaryTypes.MultiLineString, geometryBytes, 1, byteOrder); } EndianBitConverter.CopyBytes(geometry.Count, geometryBytes, 5, byteOrder); // the number of line strings Int32 byteIndex = 9; for (Int32 i = 0; i < geometry.Count; i++) { ComputeCoordinateList(geometryBytes, ref byteIndex, byteOrder, geometry[i].Coordinates, geometryModel); } return(geometryBytes); }
/// <summary> /// Converts the multi line string to Well-known Binary (WKB) representation. /// </summary> /// <param name="geometry">The geometry.</param> /// <param name="byteOrder">The byte-order of the conversion.</param> /// <param name="dimension">The dimension of the geometry.</param> /// <returns>The WKB representation of the <paramref name="geometry" />.</returns> private static Byte[] ToWellKnownBinary(IMultiLineString geometry, ByteOrder byteOrder, Int32 dimension) { Byte[] geometryBytes = new Byte[9 + 4 * geometry.Count + ((dimension == 3) ? 24 : 16) * geometry.Sum(lineString => lineString.Count)]; if (byteOrder == ByteOrder.LittleEndian) { geometryBytes[0] = 1; } if (dimension == 3) { EndianBitConverter.CopyBytes((Int32)WellKnownBinaryTypes.MultiLineStringZ, geometryBytes, 1, byteOrder); } else { EndianBitConverter.CopyBytes((Int32)WellKnownBinaryTypes.MultiLineString, geometryBytes, 1, byteOrder); } // number of line strings EndianBitConverter.CopyBytes(geometry.Count, geometryBytes, 5, byteOrder); Int32 byteIndex = 9; for (Int32 geometryIndex = 0; geometryIndex < geometry.Count; geometryIndex++) { ConvertCoordinates(geometryBytes, ref byteIndex, byteOrder, geometry[geometryIndex], dimension); } return(geometryBytes); }