private <P extends Position, G extends Geometry<P>> int sizeOfGeometryCollection(GeometryCollection<P,G> collection) { int size = ByteBuffer.UINT_SIZE; for (G g : collection) { size += calculateSize(g, false); } return size; }
protected <P extends Position> int calculateSize(Geometry<P> geom, boolean includeSrid) { int size = 1 + ByteBuffer.UINT_SIZE; //size for order byte + type field if (geom.getSRID() > 0 && includeSrid) { size += 4; } //empty geoms have same representation as an empty GeometryCollection if (geom.isEmpty()) return size + sizeEmptyGeometry(geom); if (geom instanceof GeometryCollection) { size += sizeOfGeometryCollection((GeometryCollection<P, ?>) geom); } else if (geom instanceof Polygon) { size += getPolygonSize((Polygon<P>) geom); } else if (geom instanceof Point) { size += getPointByteSize(geom); } else { size += ByteBuffer.UINT_SIZE; //to hold number of points size += getPointByteSize(geom) * geom.getNumPositions(); } return size; }
/** * Encodes a <code>Geometry</code> into a WKB representation using the specified byte-order. * * @param geometry The <code>Geometry</code> to be encoded as WKB. * @param byteOrder The WKB byte order, either {@link org.geolatte.geom.ByteOrder#XDR XDR} or {@link org.geolatte.geom.ByteOrder#NDR NDR} * @return A buffer of bytes that contains the WKB-encoded <code>Geometry</code>. */ @Override public <P extends Position> ByteBuffer encode(Geometry<P> geometry, ByteOrder byteOrder) { ByteBuffer output = ByteBuffer.allocate(calculateSize(geometry, true)); if (byteOrder != null) { output.setByteOrder(byteOrder); } writeGeometry(geometry, output); output.rewind(); return output; }
protected <P extends Position> void writeGeometry(Geometry<P> geom, ByteBuffer output) { geom.accept(newWkbVisitor(output, geom)); }
private <P extends Position> int getPolygonSize(Polygon<P> geom) { //to hold the number of linear rings int size = ByteBuffer.UINT_SIZE; //for each linear ring, a UINT holds the number of points size += geom.isEmpty() ? 0 : ByteBuffer.UINT_SIZE * (geom.getNumInteriorRing() + 1); size += getPointByteSize(geom) * geom.getNumPositions(); return size; }