public override IGeometry Read(Stream stream) { // MySQL stores geometry values using the first 4 bytes to indicate the SRID // followed by the WKB representation of the value; see: // https://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html#gis-wkb-format using (var reader1 = new BinaryReader(stream)) { int srid = -1; try { srid = reader1.ReadInt32(); } catch { // Ignored } if (srid == 0) { srid = -1; } using (var reader2 = new BiEndianBinaryReader(stream)) { var geometry = Read(reader2); geometry.SRID = srid; return(geometry); } } }
private static TGeometry ConvertFromProviderCore(MySqlGeometry v) { using var memoryStream = new MemoryStream(v.Value); // MySQL starts it's spatial data with a 4 byte SRID, that is unexpected by WKBReader. var biEndianBinaryReader = new BiEndianBinaryReader(memoryStream); var srid = biEndianBinaryReader.ReadUInt32(); var geometryServices = _geometryServiceses.GetOrAdd( srid, b => new NtsGeometryServices( NtsGeometryServices.Instance.DefaultCoordinateSequenceFactory, NtsGeometryServices.Instance.DefaultPrecisionModel, (int)b)); var reader = new WKBReader(geometryServices); var geometry = reader.Read(memoryStream); return((TGeometry)geometry); }