package com.revolsys.record.io.format.gml; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; import javax.xml.namespace.QName; import com.revolsys.geometry.io.GeometryReader; import com.revolsys.io.FileUtil; import com.revolsys.record.io.GeometryRecordReaderFactory; import com.revolsys.record.io.RecordWriter; import com.revolsys.record.io.RecordWriterFactory; import com.revolsys.record.schema.RecordDefinition; import com.revolsys.spring.resource.Resource; public class Gml extends GeometryRecordReaderFactory implements RecordWriterFactory { public static final String _NS_PREFIX = "gml"; public static final String _NS_URI = "http://www.opengis.net/gml"; public static final QName BOUNDED_BY = new QName(_NS_URI, "boundedBy", _NS_PREFIX); public static final QName BOX = new QName(_NS_URI, "Box", _NS_PREFIX); public static final QName COORDINATES = new QName(_NS_URI, "coordinates", _NS_PREFIX); public static final QName DIMENSION = new QName("dimension"); public static final QName ENVELOPE = new QName(_NS_URI, "Envelope", _NS_PREFIX); public static final QName FEATURE_COLLECTION = new QName(_NS_URI, "FeatureCollection", _NS_PREFIX); public static final QName FEATURE_MEMBER = new QName(_NS_URI, "featureMember", _NS_PREFIX); public static final QName GEOMETRY_MEMBER = new QName(_NS_URI, "geometryMember", _NS_PREFIX); public static final QName INNER_BOUNDARY_IS = new QName(_NS_URI, "innerBoundaryIs", _NS_PREFIX); public static final QName LINE_STRING = new QName(_NS_URI, "LineString", _NS_PREFIX); public static final QName LINE_STRING_MEMBER = new QName(_NS_URI, "lineStringMember", _NS_PREFIX); public static final QName LINEAR_RING = new QName(_NS_URI, "LinearRing", _NS_PREFIX); public static final QName LOWER_CORNER = new QName(_NS_URI, "lowerCorner", _NS_PREFIX); public static final QName MULTI_GEOMETRY = new QName(_NS_URI, "MultiGeometry", _NS_PREFIX); public static final QName MULTI_LINE_STRING = new QName(_NS_URI, "MultiLineString", _NS_PREFIX); public static final QName MULTI_POINT = new QName(_NS_URI, "MultiPoint", _NS_PREFIX); public static final QName MULTI_POLYGON = new QName(_NS_URI, "MultiPolygon", _NS_PREFIX); public static final QName OUTER_BOUNDARY_IS = new QName(_NS_URI, "outerBoundaryIs", _NS_PREFIX); public static final QName POINT = new QName(_NS_URI, "Point", _NS_PREFIX); public static final QName POINT_MEMBER = new QName(_NS_URI, "pointMember", _NS_PREFIX); public static final QName POLYGON = new QName(_NS_URI, "Polygon", _NS_PREFIX); public static final QName POLYGON_MEMBER = new QName(_NS_URI, "polygonMember", _NS_PREFIX); public static final QName POS = new QName(_NS_URI, "pos", _NS_PREFIX); public static final QName POS_LIST = new QName(_NS_URI, "posList", _NS_PREFIX); public static final QName SRS_NAME = new QName("srsName"); public static final QName UPPER_CORNER = new QName(_NS_URI, "upperCorner", _NS_PREFIX); public static final String VERSION_PROPERTY = "java:" + Gml.class.getName() + ".version"; public static final Set<QName> ENVELOPE_AND_GEOMETRY_TYPE_NAMES = new LinkedHashSet<>( Arrays.asList(ENVELOPE, POINT, LINE_STRING, POLYGON, MULTI_POINT, MULTI_LINE_STRING, MULTI_POLYGON, MULTI_GEOMETRY)); public static final Set<QName> GEOMETRY_TYPE_NAMES = new LinkedHashSet<>(Arrays.asList(POINT, LINE_STRING, POLYGON, MULTI_POINT, MULTI_LINE_STRING, MULTI_POLYGON, MULTI_GEOMETRY)); public Gml() { super("Geography Markup Language"); addMediaTypeAndFileExtension("application/gml+xml", "gml"); } @Override public boolean isReadFromZipFileSupported() { return true; } @Override public GeometryReader newGeometryReader(final Resource resource) { final GmlGeometryReader iterator = new GmlGeometryReader(resource); return iterator; } @Override public RecordWriter newRecordWriter(final String baseName, final RecordDefinition recordDefinition, final OutputStream outputStream, final Charset charset) { final OutputStreamWriter writer = FileUtil.newUtf8Writer(outputStream); return new GmlRecordWriter(recordDefinition, writer); } }