if (checkSrid(geom)) { result += 4; switch (getWKBType(geom)) { case org.postgis.Geometry.POINT: result += estimatePoint((Point) geom); break; case org.postgis.Geometry.LINESTRING: result += estimateLineString((LineString) geom); break; case org.postgis.Geometry.POLYGON: result += estimatePolygon((Polygon) geom); break; case org.postgis.Geometry.MULTIPOINT: result += estimateMultiPoint((MultiPoint) geom); break; case org.postgis.Geometry.MULTILINESTRING: result += estimateMultiLineString((MultiLineString) geom); break; case org.postgis.Geometry.MULTIPOLYGON: result += estimateMultiPolygon((MultiPolygon) geom); break; case org.postgis.Geometry.GEOMETRYCOLLECTION: result += estimateCollection((GeometryCollection) geom); break; default: throw new IllegalArgumentException("Unknown Geometry Type: " + getWKBType(geom));
private int estimateMultiPolygon(MultiPolygon geom) { // 4-byte count + subgeometries return 4 + estimateGeometryArray(geom); }
dimension = getCoordDim(geom); if (dimension < 2 || dimension > 4) { throw new IllegalArgumentException("Unsupported geometry dimensionality: " + dimension); final int plaintype = getWKBType(geom); int typeword = plaintype; if (dimension == 3 || dimension == 4) { final boolean haveSrid = checkSrid(geom); if (haveSrid) { typeword |= 0x20000000; writePoint((Point) geom, dest); break; case org.postgis.Geometry.LINESTRING: writeLineString((LineString) geom, dest); break; case org.postgis.Geometry.POLYGON: writePolygon((Polygon) geom, dest); break; case org.postgis.Geometry.MULTIPOINT: writeMultiPoint((MultiPoint) geom, dest); break; case org.postgis.Geometry.MULTILINESTRING: writeMultiLineString((MultiLineString) geom, dest); break; case org.postgis.Geometry.MULTIPOLYGON: writeMultiPolygon((MultiPolygon) geom, dest); break;
/** * Write a binary encoded geometry. * * Currently, geometries with more than 2 dimensions and measures are not * cleanly supported, but SRID is honored. * * @param geom The geometry to be written * @param REP The endianness representation to use for writing * @return byte array containing the encoded geometry */ public byte[] writeBinary(Geometry geom, byte REP) { int length = estimateBytes(geom); ByteSetter.BinaryByteSetter bytes = new ByteSetter.BinaryByteSetter(length); writeGeometry(geom, valueSetterForEndian(bytes, REP)); return bytes.result(); }
/** Write an Array of "full" Geometries */ private int estimateGeometryArray(Geometry container) { int result = 0; for (int i = 0; i < container.getNumGeometries(); i++) { result += estimateBytes(container.getGeometryN(i)); } return result; }
private int estimatePolygon(Polygon geom) { // int length int result = 4; result += estimateLineString(geom.getExteriorRing()); for (int i = 0; i < geom.getNumInteriorRing(); i++) { result += estimateLineString(geom.getInteriorRingN(i)); } return result; }
/** * Write a hex encoded geometry * * Currently, geometries with more than 2 dimensions and measures are not * cleanly supported, but SRID is honored. * * @param geom The geometry to be written * @param REP The endianness representation to use for writing * @return String containing the hex-encoded geometry */ public String writeHexed(Geometry geom, byte REP) { int length = estimateBytes(geom); ByteSetter.StringByteSetter bytes = new ByteSetter.StringByteSetter(length); writeGeometry(geom, valueSetterForEndian(bytes, REP)); return bytes.result(); }
/** Estimate an array of "fat" Points */ private int estimateMultiPoint(MultiPoint geom) { // int size int result = 4; if (geom.getNumGeometries() > 0) { // We can shortcut here, compared to estimateGeometryArray, as all // subgeoms have the same fixed size result += geom.getNumGeometries() * estimateBytes(geom.getGeometryN(0)); } return result; }
private int estimateMultiLineString(MultiLineString geom) { // 4-byte count + subgeometries return 4 + estimateGeometryArray(geom); }
private int estimateCollection(GeometryCollection geom) { // 4-byte count + subgeometries return 4 + estimateGeometryArray(geom); }