code: public static GeometryTypeInfo readGeometryType(ByteReader reader) {
  
  		// Read the single byte order byte
  		byte byteOrderValue = reader.readByte();
  		ByteOrder byteOrder = byteOrderValue == 0 ? ByteOrder.BIG_ENDIAN
  				: ByteOrder.LITTLE_ENDIAN;
  		reader.setByteOrder(byteOrder);
  
  		// Read the geometry type unsigned integer
  		long unsignedGeometryTypeCode = reader.readUnsignedInt();
  
  		// Check for 2.5D geometry types
  		boolean hasZ = false;
  		if (unsignedGeometryTypeCode > WKB25D) {
  			hasZ = true;
  			unsignedGeometryTypeCode -= WKB25D;
  		}
  
  		int geometryTypeCode = (int) unsignedGeometryTypeCode;
  
  		// Determine the geometry type
  		GeometryType geometryType = GeometryCodes
  				.getGeometryType(geometryTypeCode);
  
  		// Determine if the geometry has a z (3d) or m (linear referencing
  		// system) value
  		if (!hasZ) {
  			hasZ = GeometryCodes.hasZ(geometryTypeCode);
  		}
  		boolean hasM = GeometryCodes.hasM(geometryTypeCode);
  
  		GeometryTypeInfo geometryInfo = new GeometryTypeInfo(geometryTypeCode,
  				geometryType, hasZ, hasM);
  
  		return geometryInfo;
  	}
docs: Read the geometry type info
  
  @param reader
  byte reader
  @return geometry type info