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

Public Member Functions

PrecisionWriter calculate (final Coordinate[] coordinates, final int maxPrecision)
 
void writeExtendedPrecision (final DataOutput output) throws IOException
 
void writePoint (final Coordinate coordinate, final DataOutput output) throws IOException
 
void writePointArray (final Coordinate[] coordinates, final DataOutput output) throws IOException
 

Protected Member Functions

void checkCoordinate (final Coordinate c)
 
void finalize (final int maxPrecision)
 

Protected Attributes

double precisionMultiplier = 0
 

Private Attributes

boolean hasZ = false
 
int zPrecision = TWKBUtils.MIN_EXTENDED_PRECISION
 
double zPrecisionMultiplier = 0
 
boolean hasM = false
 
int mPrecision = TWKBUtils.MIN_EXTENDED_PRECISION
 
double mPrecisionMultiplier = 0
 

Member Function Documentation

◆ calculate()

PrecisionWriter calculate ( final Coordinate []  coordinates,
final int  maxPrecision 
)

References TWKBWriter.PrecisionWriter.calculate().

Referenced by TWKBWriter.write().

250  {
251  hasZ = !Double.isNaN(coordinates[0].getZ());
252  hasM = !Double.isNaN(coordinates[0].getM());
253  super.calculate(coordinates, maxPrecision);
254  return this;
255  }
final int maxPrecision
Definition: TWKBWriter.java:28

◆ checkCoordinate()

void checkCoordinate ( final Coordinate  c)
protected

References Coordinate.getM(), and Coordinate.getZ().

258  {
259  super.checkCoordinate(c);
260  if (hasZ) {
261  final BigDecimal zCoord = new BigDecimal(Double.toString(c.getZ())).stripTrailingZeros();
262  zPrecision = Math.max(zCoord.scale(), zPrecision);
263  }
264  if (hasM) {
265  final BigDecimal mCoord = new BigDecimal(Double.toString(c.getM())).stripTrailingZeros();
266  mPrecision = Math.max(mCoord.scale(), mPrecision);
267  }
268  }

◆ finalize()

void finalize ( final int  maxPrecision)
protected

References TWKBUtils.MAX_EXTENDED_PRECISION.

271  {
272  super.finalize(maxPrecision);
273  if (hasZ) {
274  zPrecision = Math.min(TWKBUtils.MAX_EXTENDED_PRECISION, zPrecision);
275  zPrecisionMultiplier = Math.pow(10, zPrecision);
276  }
277  if (hasM) {
278  mPrecision = Math.min(TWKBUtils.MAX_EXTENDED_PRECISION, mPrecision);
279  mPrecisionMultiplier = Math.pow(10, mPrecision);
280  }
281  }
final int maxPrecision
Definition: TWKBWriter.java:28

◆ writeExtendedPrecision()

void writeExtendedPrecision ( final DataOutput  output) throws IOException

References TWKBUtils.zigZagEncode().

284  {
285  byte extendedDimensions = 0;
286  if (hasZ) {
287  extendedDimensions |= 0x1;
288  extendedDimensions |= TWKBUtils.zigZagEncode(zPrecision) << 2;
289  }
290  if (hasM) {
291  extendedDimensions |= 0x2;
292  extendedDimensions |= TWKBUtils.zigZagEncode(mPrecision) << 5;
293  }
294  output.writeByte(extendedDimensions);
295  }

◆ writePoint()

void writePoint ( final Coordinate  coordinate,
final DataOutput  output 
) throws IOException
299  {
300  super.writePoint(coordinate, output);
301  if (hasZ) {
302  Varint.writeSignedVarLong(Math.round(coordinate.getZ() * zPrecisionMultiplier), output);
303  }
304  if (hasM) {
305  Varint.writeSignedVarLong(Math.round(coordinate.getM() * mPrecisionMultiplier), output);
306  }
307  }

◆ writePointArray()

void writePointArray ( final Coordinate []  coordinates,
final DataOutput  output 
) throws IOException

References TWKBWriter.PrecisionWriter.precisionMultiplier.

311  {
312  long lastX = 0;
313  long lastY = 0;
314  long lastZ = 0;
315  long lastM = 0;
316  Varint.writeUnsignedVarInt(coordinates.length, output);
317  for (final Coordinate c : coordinates) {
318  final long x = Math.round(c.getX() * precisionMultiplier);
319  final long y = Math.round(c.getY() * precisionMultiplier);
320  Varint.writeSignedVarLong(x - lastX, output);
321  Varint.writeSignedVarLong(y - lastY, output);
322  lastX = x;
323  lastY = y;
324  if (hasZ) {
325  final long z = Math.round(c.getZ() * zPrecisionMultiplier);
326  Varint.writeSignedVarLong(z - lastZ, output);
327  lastZ = z;
328  }
329  if (hasM) {
330  final long m = Math.round(c.getZ() * mPrecisionMultiplier);
331  Varint.writeSignedVarLong(m - lastM, output);
332  lastM = m;
333  }
334  }
335  }

Member Data Documentation

◆ hasM

boolean hasM = false
private

◆ hasZ

boolean hasZ = false
private

◆ mPrecision

int mPrecision = TWKBUtils.MIN_EXTENDED_PRECISION
private

◆ mPrecisionMultiplier

double mPrecisionMultiplier = 0
private

◆ precisionMultiplier

◆ zPrecision

int zPrecision = TWKBUtils.MIN_EXTENDED_PRECISION
private

◆ zPrecisionMultiplier

double zPrecisionMultiplier = 0
private