parseGeometry method

Geometry parseGeometry(
  1. ValueGetter data
)

Parse a geometry starting at offset.

@param data ValueGetter with the data to be parsed @return the parsed geometry */

Implementation

Geometry parseGeometry(ValueGetter data) {
  int endian = data.getByte(); // skip and test endian flag
  if (endian != data.endian) {
    throw ArgumentError("Endian inconsistency!");
  }
  int typeword = data.getInt();

  int realtype = typeword & 0x1FFFFFFF; // cut off high flag bits
  EGeometryType geometryType = EGeometryType.fromGeometryTypeCode(realtype);

  bool haveZ = (typeword & 0x80000000) != 0;
  bool haveM = (typeword & 0x40000000) != 0;
  bool haveS = (typeword & 0x20000000) != 0;

  int srid = -1;

  if (haveS) {
    srid = data.getInt();
    if (srid < 0) {
      srid = UNKNOWN_SRID;
    }
  }
  Geometry result1;
  switch (geometryType) {
    case EGeometryType.POINT:
      result1 = gf.createPoint(parsePoint(data, haveZ, haveM));
      break;
    case EGeometryType.LINESTRING:
      result1 = parseLineString(data, haveZ, haveM);
      break;
    case EGeometryType.POLYGON:
      result1 = parsePolygon(data, haveZ, haveM);
      break;
    case EGeometryType.MULTIPOINT:
      result1 = parseMultiPoint(data);
      break;
    case EGeometryType.MULTILINESTRING:
      result1 = parseMultiLineString(data);
      break;
    case EGeometryType.MULTIPOLYGON:
      result1 = parseMultiPolygon(data);
      break;
    case EGeometryType.GEOMETRYCOLLECTION:
      result1 = parseCollection(data);
      break;
    default:
      throw ArgumentError("Unknown Geometry Type: $realtype");
  }

  Geometry result = result1;

  if (srid != UNKNOWN_SRID) {
    result.setSRID(srid);
  }
  return result;
}