static WknMultiPolygon ParseMultiPolygon(byte[] wkb, ref int pos) { if (wkb[pos] != 1) { throw new Exception("Sorry, only Little Endian format is supported"); } var type = BitConverter.ToUInt32(wkb, pos + 1); if (type != (uint)WknGeometryType.WknMultiPolygon) { throw new Exception("Invalid object type"); } var nbPolygons = BitConverter.ToUInt32(wkb, pos + 5); pos += 9; var polygons = new WknPolygon[nbPolygons]; for (var r = 0; r < nbPolygons; ++r) { polygons[r] = ParsePolygon(wkb, ref pos); } return(new WknMultiPolygon(polygons)); }
static void AppendPolygon(BinaryWriter wrt, WknPolygon polygon) { wrt.Write(LittleEndian); wrt.Write((uint)WknGeometryType.WknPolygon); wrt.Write((uint)polygon.Rings.Length); for (var i = 0; i < polygon.Rings.Length; ++i) { var ring = polygon.Rings[i]; wrt.Write((uint)ring.Points.Length); for (var j = 0; j < ring.Points.Length; ++j) { wrt.Write(ring.Points[j].X); wrt.Write(ring.Points[j].Y); } } }