parseGeometry method
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;
}