kiwi-postgis  Version 0.1.0.0
TWKBWriter Class Reference
Collaboration diagram for TWKBWriter:

Classes

class  ExtendedPrecisionWriter
 
class  PrecisionWriter
 

Public Member Functions

 TWKBWriter ()
 
 TWKBWriter (final int maxPrecision)
 
byte [] write (final Geometry geom)
 
void write (final Geometry geom, final DataOutput output) throws IOException
 

Private Member Functions

void writePoint (final Point point, final PrecisionWriter precision, final DataOutput output) throws IOException
 
void writeLineString (final LineString line, final PrecisionWriter precision, final DataOutput output) throws IOException
 
void writePolygon (final Polygon polygon, final PrecisionWriter precision, final DataOutput output) throws IOException
 
void writeMultiPoint (final MultiPoint multiPoint, final PrecisionWriter precision, final DataOutput output) throws IOException
 
void writeMultiLineString (final MultiLineString multiLine, final PrecisionWriter precision, final DataOutput output) throws IOException
 
void writeMultiPolygon (final MultiPolygon multiPolygon, final PrecisionWriter precision, final DataOutput output) throws IOException
 
void writeGeometryCollection (final GeometryCollection geoms, final PrecisionWriter precision, final DataOutput output) throws IOException
 
byte getTypeAndPrecisionByte (final byte type, final int precision)
 
byte getType (final Geometry geom)
 

Private Attributes

final int maxPrecision
 

Constructor & Destructor Documentation

◆ TWKBWriter() [1/2]

References TWKBUtils.MAX_COORD_PRECISION.

30  {
31  this(TWKBUtils.MAX_COORD_PRECISION);
32  }

◆ TWKBWriter() [2/2]

TWKBWriter ( final int  maxPrecision)

References TWKBUtils.MAX_COORD_PRECISION.

34  {
35  this.maxPrecision = Math.min(TWKBUtils.MAX_COORD_PRECISION, maxPrecision);
36  }
final int maxPrecision
Definition: TWKBWriter.java:28

Member Function Documentation

◆ getType()

byte getType ( final Geometry  geom)
private

References TWKBUtils.GEOMETRYCOLLECTION_TYPE, TWKBUtils.LINESTRING_TYPE, TWKBUtils.MULTILINESTRING_TYPE, TWKBUtils.MULTIPOINT_TYPE, TWKBUtils.MULTIPOLYGON_TYPE, TWKBUtils.POINT_TYPE, and TWKBUtils.POLYGON_TYPE.

Referenced by TWKBWriter.write().

174  {
175  if (geom instanceof Point) {
176  return TWKBUtils.POINT_TYPE;
177  } else if (geom instanceof LineString) {
178  return TWKBUtils.LINESTRING_TYPE;
179  } else if (geom instanceof Polygon) {
180  return TWKBUtils.POLYGON_TYPE;
181  } else if (geom instanceof MultiPoint) {
182  return TWKBUtils.MULTIPOINT_TYPE;
183  } else if (geom instanceof MultiLineString) {
184  return TWKBUtils.MULTILINESTRING_TYPE;
185  } else if (geom instanceof MultiPolygon) {
186  return TWKBUtils.MULTIPOLYGON_TYPE;
187  }
188  return TWKBUtils.GEOMETRYCOLLECTION_TYPE;
189  }

◆ getTypeAndPrecisionByte()

byte getTypeAndPrecisionByte ( final byte  type,
final int  precision 
)
private

References TWKBUtils.zigZagEncode().

Referenced by TWKBWriter.write().

168  {
169  byte typeAndPrecision = type;
170  typeAndPrecision |= TWKBUtils.zigZagEncode(precision) << 4;
171  return typeAndPrecision;
172  }

◆ write() [1/2]

byte [] write ( final Geometry  geom)

Referenced by TWKBDatatype.unparse(), and TWKBWriter.writeGeometryCollection().

38  {
39  try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
40  try (final DataOutputStream output = new DataOutputStream(out)) {
41  write(geom, output);
42  return out.toByteArray();
43  }
44  } catch (final IOException e) {
45  throw new RuntimeException("Error writing TWKB geometry.", e);
46  }
47  }
byte [] write(final Geometry geom)
Definition: TWKBWriter.java:38

◆ write() [2/2]

void write ( final Geometry  geom,
final DataOutput  output 
) throws IOException

References TWKBWriter.PrecisionWriter.calculate(), TWKBWriter.ExtendedPrecisionWriter.calculate(), TWKBUtils.EMPTY_GEOMETRY, TWKBUtils.EXTENDED_DIMENSIONS, TWKBUtils.GEOMETRYCOLLECTION_TYPE, Coordinate.getM(), TWKBWriter.getType(), TWKBWriter.getTypeAndPrecisionByte(), Coordinate.getZ(), TWKBUtils.LINESTRING_TYPE, TWKBUtils.MULTILINESTRING_TYPE, TWKBUtils.MULTIPOINT_TYPE, TWKBUtils.MULTIPOLYGON_TYPE, TWKBUtils.POINT_TYPE, TWKBUtils.POLYGON_TYPE, TWKBWriter.PrecisionWriter.precision, TWKBWriter.PrecisionWriter.writeExtendedPrecision(), TWKBWriter.writeGeometryCollection(), TWKBWriter.writeLineString(), TWKBWriter.writeMultiLineString(), TWKBWriter.writeMultiPoint(), TWKBWriter.writeMultiPolygon(), TWKBWriter.writePoint(), and TWKBWriter.writePolygon().

49  {
50  final byte type = getType(geom);
51  if (geom.isEmpty()) {
52  output.writeByte(getTypeAndPrecisionByte(type, 0));
53  output.writeByte(TWKBUtils.EMPTY_GEOMETRY);
54  return;
55  }
56  byte metadata = 0;
57  final Coordinate[] coordinates = geom.getCoordinates();
58  PrecisionWriter precision;
59  if (Double.isNaN(coordinates[0].getZ()) || Double.isNaN(coordinates[0].getM())) {
60  metadata |= TWKBUtils.EXTENDED_DIMENSIONS;
61  precision = new ExtendedPrecisionWriter().calculate(coordinates, maxPrecision);
62  } else {
63  precision = new PrecisionWriter().calculate(coordinates, maxPrecision);
64  }
65  output.writeByte(getTypeAndPrecisionByte(type, precision.precision));
66  output.writeByte(metadata);
67  precision.writeExtendedPrecision(output);
68 
69  switch (type) {
70  case TWKBUtils.POINT_TYPE:
71  writePoint((Point) geom, precision, output);
72  break;
73  case TWKBUtils.LINESTRING_TYPE:
74  writeLineString((LineString) geom, precision, output);
75  break;
76  case TWKBUtils.POLYGON_TYPE:
77  writePolygon((Polygon) geom, precision, output);
78  break;
79  case TWKBUtils.MULTIPOINT_TYPE:
80  writeMultiPoint((MultiPoint) geom, precision, output);
81  break;
82  case TWKBUtils.MULTILINESTRING_TYPE:
83  writeMultiLineString((MultiLineString) geom, precision, output);
84  break;
85  case TWKBUtils.MULTIPOLYGON_TYPE:
86  writeMultiPolygon((MultiPolygon) geom, precision, output);
87  break;
88  case TWKBUtils.GEOMETRYCOLLECTION_TYPE:
89  writeGeometryCollection((GeometryCollection) geom, precision, output);
90  break;
91  default:
92  break;
93  }
94  }
void writeMultiLineString(final MultiLineString multiLine, final PrecisionWriter precision, final DataOutput output)
Definition: TWKBWriter.java:128
byte getType(final Geometry geom)
Definition: TWKBWriter.java:174
byte getTypeAndPrecisionByte(final byte type, final int precision)
Definition: TWKBWriter.java:168
final int maxPrecision
Definition: TWKBWriter.java:28
void writeMultiPoint(final MultiPoint multiPoint, final PrecisionWriter precision, final DataOutput output)
Definition: TWKBWriter.java:121
void writeMultiPolygon(final MultiPolygon multiPolygon, final PrecisionWriter precision, final DataOutput output)
Definition: TWKBWriter.java:138
void writeLineString(final LineString line, final PrecisionWriter precision, final DataOutput output)
Definition: TWKBWriter.java:103
void writePoint(final Point point, final PrecisionWriter precision, final DataOutput output)
Definition: TWKBWriter.java:96
void writeGeometryCollection(final GeometryCollection geoms, final PrecisionWriter precision, final DataOutput output)
Definition: TWKBWriter.java:157
void writePolygon(final Polygon polygon, final PrecisionWriter precision, final DataOutput output)
Definition: TWKBWriter.java:110

◆ writeGeometryCollection()

void writeGeometryCollection ( final GeometryCollection  geoms,
final PrecisionWriter  precision,
final DataOutput  output 
) throws IOException
private

References TWKBWriter.write().

Referenced by TWKBWriter.write().

160  {
161  Varint.writeUnsignedVarInt(geoms.getNumGeometries(), output);
162  for (int i = 0; i < geoms.getNumGeometries(); i++) {
163  final Geometry geom = geoms.getGeometryN(i);
164  write(geom, output);
165  }
166  }
byte [] write(final Geometry geom)
Definition: TWKBWriter.java:38

◆ writeLineString()

void writeLineString ( final LineString  line,
final PrecisionWriter  precision,
final DataOutput  output 
) throws IOException
private

Referenced by TWKBWriter.write().

106  {
107  precision.writePointArray(line.getCoordinates(), output);
108  }

◆ writeMultiLineString()

void writeMultiLineString ( final MultiLineString  multiLine,
final PrecisionWriter  precision,
final DataOutput  output 
) throws IOException
private

Referenced by TWKBWriter.write().

131  {
132  Varint.writeUnsignedVarInt(multiLine.getNumGeometries(), output);
133  for (int i = 0; i < multiLine.getNumGeometries(); i++) {
134  precision.writePointArray(multiLine.getGeometryN(i).getCoordinates(), output);
135  }
136  }

◆ writeMultiPoint()

void writeMultiPoint ( final MultiPoint  multiPoint,
final PrecisionWriter  precision,
final DataOutput  output 
) throws IOException
private

Referenced by TWKBWriter.write().

124  {
125  precision.writePointArray(multiPoint.getCoordinates(), output);
126  }

◆ writeMultiPolygon()

void writeMultiPolygon ( final MultiPolygon  multiPolygon,
final PrecisionWriter  precision,
final DataOutput  output 
) throws IOException
private

Referenced by TWKBWriter.write().

141  {
142  Varint.writeUnsignedVarInt(multiPolygon.getNumGeometries(), output);
143  for (int i = 0; i < multiPolygon.getNumGeometries(); i++) {
144  final Polygon polygon = (Polygon) multiPolygon.getGeometryN(i);
145  if (polygon.isEmpty()) {
146  Varint.writeUnsignedVarInt(0, output);
147  continue;
148  }
149  Varint.writeUnsignedVarInt(polygon.getNumInteriorRing() + 1, output);
150  precision.writePointArray(polygon.getExteriorRing().getCoordinates(), output);
151  for (int j = 0; j < polygon.getNumInteriorRing(); j++) {
152  precision.writePointArray(polygon.getInteriorRingN(j).getCoordinates(), output);
153  }
154  }
155  }

◆ writePoint()

void writePoint ( final Point  point,
final PrecisionWriter  precision,
final DataOutput  output 
) throws IOException
private

Referenced by TWKBWriter.write().

99  {
100  precision.writePoint(point.getCoordinate(), output);
101  }

◆ writePolygon()

void writePolygon ( final Polygon  polygon,
final PrecisionWriter  precision,
final DataOutput  output 
) throws IOException
private

Referenced by TWKBWriter.write().

113  {
114  Varint.writeUnsignedVarInt(polygon.getNumInteriorRing() + 1, output);
115  precision.writePointArray(polygon.getExteriorRing().getCoordinates(), output);
116  for (int i = 0; i < polygon.getNumInteriorRing(); i++) {
117  precision.writePointArray(polygon.getInteriorRingN(i).getCoordinates(), output);
118  }
119  }

Member Data Documentation

◆ maxPrecision

final int maxPrecision
private