package com.revolsys.record.io.format.saif.util; import java.io.IOException; import java.util.Map; import java.util.TreeMap; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.geometry.model.Point; import com.revolsys.record.io.format.saif.SaifConstants; import com.revolsys.util.Property; public class PointConverter implements OsnConverter { private String geometryClass = SaifConstants.POINT; private final GeometryFactory geometryFactory; public PointConverter(final GeometryFactory geometryFactory) { this.geometryFactory = geometryFactory; } public PointConverter(final GeometryFactory geometryFactory, final String geometryClass) { this.geometryFactory = geometryFactory; this.geometryClass = geometryClass; } public Point newPoint(final GeometryFactory geometryFactory, final double... coordinates) { return geometryFactory.point(coordinates); } @Override public Object read(final OsnIterator iterator) { final Map<String, Object> values = new TreeMap<>(); values.put("type", this.geometryClass); Point point = null; String fieldName = iterator.nextFieldName(); while (fieldName != null) { if (fieldName.equals("coords")) { final String coordTypeName = iterator.nextObjectName(); if (coordTypeName.equals("/Coord3D")) { final double x = iterator.nextDoubleAttribute("c1"); final double y = iterator.nextDoubleAttribute("c2"); double z = iterator.nextDoubleAttribute("c3"); if (z == 2147483648.0) { z = 0; } final GeometryFactory geometryFactory = this.geometryFactory.convertAxisCount(3); point = newPoint(geometryFactory, x, y, z); } else if (coordTypeName.equals("/Coord2D")) { final double x = iterator.nextDoubleAttribute("c1"); final double y = iterator.nextDoubleAttribute("c2"); final GeometryFactory geometryFactory = this.geometryFactory.convertAxisCount(3); point = newPoint(geometryFactory, x, y); } else { iterator.throwParseError("Expecting Coord2D or Coord3D"); } iterator.nextEndObject(); } else { readAttribute(iterator, fieldName, values); } fieldName = iterator.nextFieldName(); } Property.set(point, values); return point; } protected void readAttribute(final OsnIterator iterator, final String fieldName, final Map<String, Object> values) { iterator.next(); values.put(fieldName, iterator.getValue()); } @Override public void write(final OsnSerializer serializer, final Object object) throws IOException { if (object instanceof Point) { final Point point = (Point)object; final int axisCount = point.getAxisCount(); final double x = point.getX(); final double y = point.getY(); final double z = point.getZ(); serializer.startObject(this.geometryClass); serializer.fieldName("coords"); if (axisCount == 2) { serializer.startObject("/Coord2D"); serializer.attribute("c1", x, true); serializer.attribute("c2", y, false); } else { serializer.startObject("/Coord3D"); serializer.attribute("c1", x, true); serializer.attribute("c2", y, true); if (Double.isNaN(z)) { serializer.attribute("c3", 0, false); } else { serializer.attribute("c3", z, false); } } serializer.endObject(); serializer.endAttribute(); writeAttributes(serializer, point); serializer.endObject(); } } protected void writeAttributes(final OsnSerializer serializer, final Geometry geometry) throws IOException { writeAttributeEnum(serializer, geometry, "qualifier"); } }