package com.revolsys.record.io.format.pointz; import java.io.IOException; import com.revolsys.geometry.io.GeometryWriter; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.geometry.model.Point; import com.revolsys.io.AbstractWriter; import com.revolsys.io.channels.ChannelWriter; import com.revolsys.spring.resource.Resource; import com.revolsys.util.Exceptions; public class PointZGeometryWriter extends AbstractWriter<Geometry> implements GeometryWriter { private boolean initialized; private final Resource resource; private ChannelWriter writer; private double scaleXy; private double scaleZ; private GeometryFactory geometryFactory; public PointZGeometryWriter(final Resource resource) { this.resource = resource; setGeometryFactory(GeometryFactory.fixed(0, 1000.0, 1000.0, 1000.0)); } @Override public void close() { final ChannelWriter writer = this.writer; this.writer = null; if (writer != null) { writer.close(); } } private void initialize() throws IOException { if (!this.initialized) { this.initialized = true; this.writer = this.resource.newChannelWriter(); final int coordinateSystemId = this.geometryFactory.getCoordinateSystemId(); this.writer.putBytes(PointZIoFactory.FILE_TYPE_POINTZ_BYTES); // File type this.writer.putShort(PointZIoFactory.VERSION); // version this.writer.putInt(coordinateSystemId); this.writer.putDouble(this.scaleXy); this.writer.putDouble(this.scaleZ); } } @Override public void setGeometryFactory(final GeometryFactory geometryFactory) { this.geometryFactory = geometryFactory; this.scaleXy = geometryFactory.getScaleXY(); if (this.scaleXy <= 0) { this.scaleXy = 1000; } this.scaleZ = geometryFactory.getScaleZ(); if (this.scaleZ <= 0) { this.scaleZ = 1000; } } @Override public String toString() { if (this.resource == null) { return super.toString(); } else { return this.resource.toString(); } } public void write(final double x, final double y, final double z) { try { initialize(); final ChannelWriter writer = this.writer; final double scaleXy = this.scaleXy; final double scaleZ = this.scaleZ; if (Double.isFinite(x)) { final int intValue = (int)Math.round(x * scaleXy); writer.putInt(intValue); } else { writer.putInt(Integer.MIN_VALUE); } if (Double.isFinite(y)) { final int intValue = (int)Math.round(y * scaleXy); writer.putInt(intValue); } else { writer.putInt(Integer.MIN_VALUE); } if (Double.isFinite(z)) { final int intValue = (int)Math.round(z * scaleZ); writer.putInt(intValue); } else { writer.putInt(Integer.MIN_VALUE); } } catch (final IOException e) { throw Exceptions.wrap(e); } } @Override public void write(final Geometry geometry) { if (geometry instanceof Point) { final Point point = (Point)geometry; final double x = point.getX(); final double y = point.getY(); final double z = point.getZ(); write(x, y, z); } else { throw new IllegalArgumentException("Only points supported"); } } }