package com.revolsys.record.io.format.vrt; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; import javax.xml.namespace.QName; import com.revolsys.datatype.DataType; import com.revolsys.datatype.DataTypes; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.record.io.format.xml.XmlWriter; import com.revolsys.record.schema.FieldDefinition; import com.revolsys.record.schema.RecordDefinition; public class OgrVrtWriter { public static void write(final File file, final RecordDefinition recordDefinition, final String dataSource) throws IOException { try ( XmlWriter writer = new XmlWriter(new FileWriter(file))) { writer.setIndent(true); writer.startDocument("UTF-8", "1.0"); writer.startTag("OGRVRTDataSource"); writer.startTag("OGRVRTLayer"); final String typeName = recordDefinition.getName(); writer.attribute("name", typeName); writer.startTag("SrcDataSource"); writer.attribute("relativeToVRT", "1"); writer.text(dataSource); writer.endTag("SrcDataSource"); writer.element(new QName("SrcLayer"), typeName); for (final FieldDefinition attribute : recordDefinition.getFields()) { final String fieldName = attribute.getName(); final DataType fieldType = attribute.getDataType(); final Class<?> typeClass = attribute.getTypeClass(); if (Geometry.class.isAssignableFrom(typeClass)) { final GeometryFactory geometryFactory = recordDefinition.getGeometryFactory(); writer.element("GeometryType", "wkb" + fieldType); if (geometryFactory != null) { writer.element("LayerSRS", "EPSG:" + geometryFactory.getCoordinateSystemId()); } writer.startTag("GeometryField"); writer.attribute("encoding", "WKT"); writer.attribute("field", fieldName); writer.attribute("name", fieldName); writer.attribute("reportSrcColumn", "FALSE"); writer.element("GeometryType", "wkb" + fieldType); if (geometryFactory != null) { writer.element("SRS", "EPSG:" + geometryFactory.getCoordinateSystemId()); } writer.endTag("GeometryField"); } else { writer.startTag("Field"); writer.attribute("name", fieldName); String type = "String"; if (Arrays.asList(DataTypes.BYTE, DataTypes.SHORT, DataTypes.INT, DataTypes.LONG, DataTypes.INTEGER).contains(fieldType)) { type = "Integer"; } else if (Arrays.asList(DataTypes.FLOAT, DataTypes.DOUBLE, DataTypes.DECIMAL) .contains(fieldType)) { type = "Real"; } else if (DataTypes.DATE.equals(type)) { type = "Date"; } else if (DataTypes.DATE_TIME.equals(type)) { type = "DateTime"; } else { type = "String"; } writer.attribute("type", type); final int length = attribute.getLength(); if (length > 0) { writer.attribute("width", length); } final int scale = attribute.getScale(); if (scale > 0) { writer.attribute("scale", scale); } writer.attribute("src", fieldName); writer.endTag("Field"); } } writer.endTag("OGRVRTLayer"); writer.endTag("OGRVRTDataSource"); writer.endDocument(); } } }