/** * Populate the geometry data from the bytes * * @param bytes */ public void fromBytes(byte[] bytes) { this.bytes = bytes; ByteReader reader = new ByteReader(bytes); // Get 2 bytes as the magic number and validate String magic = null; try { magic = reader.readString(2); } catch (UnsupportedEncodingException e) { throw new GeoPackageException( "Unexpected GeoPackage Geometry magic number character encoding: Expected: " + GeoPackageConstants.GEO_PACKAGE_GEOMETRY_MAGIC_NUMBER); } if (!magic.equals(GeoPackageConstants.GEO_PACKAGE_GEOMETRY_MAGIC_NUMBER)) { throw new GeoPackageException( "Unexpected GeoPackage Geometry magic number: " + magic + ", Expected: " + GeoPackageConstants.GEO_PACKAGE_GEOMETRY_MAGIC_NUMBER); } // Get a byte as the version and validate, value of 0 = version 1 byte version = reader.readByte(); if (version != GeoPackageConstants.GEO_PACKAGE_GEOMETRY_VERSION_1) { throw new GeoPackageException( "Unexpected GeoPackage Geometry version: " + version + ", Expected: " + GeoPackageConstants.GEO_PACKAGE_GEOMETRY_VERSION_1); } // Get a flags byte and then read the flag values byte flags = reader.readByte(); int envelopeIndicator = readFlags(flags); reader.setByteOrder(byteOrder); // Read the 5th - 8th bytes as the srs id srsId = reader.readInt(); // Read the envelope envelope = readEnvelope(envelopeIndicator, reader); // Save off where the WKB bytes start wkbGeometryIndex = reader.getNextByte(); // Read the Well-Known Binary Geometry if not marked as empty if (!empty) { geometry = WkbGeometryReader.readGeometry(reader); } }