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);
                }
            }
        }
示例#2
0
        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);
        }