private FeatureCollection readGML( String fileName ) throws IOException, XMLStreamException, FactoryConfigurationError, XMLParsingException, UnknownCRSException, ReferenceResolvingException { File f = new File( fileName ); GMLStreamReader gmlReader = GMLInputFactory.createGMLStreamReader( GMLVersion.GML_31, f.toURI().toURL() ); gmlReader.setApplicationSchema( schema ); FeatureCollection fc = (FeatureCollection) gmlReader.readFeature(); gmlReader.getIdContext().resolveLocalRefs(); gmlReader.close(); return fc; }
/** * Creates a new {@link GMLStreamReader} instance. * * @param version * GML version of the input, must not be <code>null</code> * @param xmlStream * XML stream used to read the input, must not be <code>null</code> */ GMLStreamReader( GMLVersion version, XMLStreamReaderWrapper xmlStream ) { this.version = version; this.xmlStream = xmlStream; this.idContext = new GmlDocumentIdContext( version ); this.geomFac = new GeometryFactory(); }
FeatureReference refFeature = new FeatureReference( gmlStream.getIdContext(), href, null ); memberFeatures.add( refFeature ); gmlStream.getIdContext().addReference( refFeature ); } else { xmlStream.nextTag();
@Override public GMLObject getObject( String uri, String baseURL ) { if ( uri.startsWith( "#" ) ) { return idToObject.get( uri.substring( 1 ) ); } else if ( uri.startsWith( "urn:" ) ) { LOG.warn( "Unable to resolve external object reference: " + uri + ". Resolving of urn references is not implemented yet." ); } else if( !uriShouldBeSkipped( uri) ) { return fetchExternalGmlObject( uri, baseURL ); } else { LOG.info( "URL " + uri + " is configured to be skipped" ); } return null; }
idContext.addObject( def ); return def;
/** * Controls the application schema that is assumed when features or feature collections are parsed. * * @param schema * application schema, can be <code>null</code> (use xsi:schemaLocation attribute to build the * application schema) */ public void setApplicationSchema( AppSchema schema ) { this.schema = schema; idContext.setApplicationSchema( schema ); }
/** * Adds a {@link ReferencePatternMatcher} that checks if a url should be skipped or not. * * @param referencePatternMatcher the matcher to add, may be <code>null</code> (all urls are resolved) */ public void setReferencePatternMatcher( ReferencePatternMatcher referencePatternMatcher ) { idContext.setReferencePatternMatcher( referencePatternMatcher ); }
private Definition readDefinition() throws XMLStreamException { String id = xmlStream.getAttributeValue( gmlNs, "id" ); GMLStdProps standardProps = propsReader.read( xmlStream ); xmlStream.require( XMLStreamConstants.END_ELEMENT, gmlNs, "Definition" ); Definition def = new GenericDefinition( id, standardProps ); idContext.addObject( def ); return def; }
final TimeSlice timeSlice = new GenericTimeSlice( id, type, props ); if ( id != null && !"".equals( id ) ) { if ( idContext.getObject( id ) != null ) { String msg = Messages.getMessage( "ERROR_FEATURE_ID_NOT_UNIQUE", id ); throw new XMLParsingException( xmlStream, msg ); idContext.addObject( timeSlice );
private TimeInstant readTimeInstantPropertyType( final XMLStreamReader xmlStream ) throws XMLStreamException { final String href = xmlStream.getAttributeValue( XLNNS, "href" ); if ( href != null ) { final ReferenceResolver resolver = null; final TimeInstantReference reference = new TimeInstantReference( resolver, href, getSystemId() ); idContext.addReference( reference ); skipElement( xmlStream ); return reference; } nextElement( xmlStream ); requireStartElement( xmlStream, new QName( gmlNs, "TimeInstant" ) ); final GmlTimeInstantReader timeInstantReader = new GmlTimeInstantReader( gmlStreamReader ); final TimeInstant read = timeInstantReader.read( xmlStream ); nextElement( xmlStream ); return read; }
curve.setProperties( props ); idContext.addObject( curve ); xmlStream.require( END_ELEMENT, elName.getNamespaceURI(), elName.getLocalPart() ); return curve;
gmlStream.getIdContext().resolveLocalRefs();
xwriter.writeNamespace( "gml", "http://www.opengis.net/gml/3.2" ); GmlDocumentIdContext ctx = new GmlDocumentIdContext( GMLVersion.GML_32 );
private Geometry parseGeometryProperty( XMLStreamReaderWrapper xmlStream, ICRS crs ) throws XMLStreamException { Geometry geometry = null; String href = xmlStream.getAttributeValue( CommonNamespaces.XLNNS, "href" ); if ( href != null && href.length() > 0 ) { LOG.debug( "Found geometry reference (xlink): '" + href + "'" ); geometry = new GeometryReference<Geometry>( idContext, href, xmlStream.getSystemId() ); idContext.addReference( (GeometryReference<?>) geometry ); if ( xmlStream.nextTag() == XMLStreamConstants.START_ELEMENT ) { String msg = "Unexpected element '" + xmlStream.getName() + "'. Geometry value has already been specified using xlink."; throw new XMLParsingException( xmlStream, msg ); } } else if ( xmlStream.nextTag() == XMLStreamConstants.START_ELEMENT ) { geometry = parse( xmlStream, crs ); xmlStream.nextTag(); } else { String msg = "Error in geometry property element. Expected a 'gml:_Geometry' element or an 'xlink:href' attribute."; throw new XMLParsingException( xmlStream, msg ); } return geometry; }
idContext.addObject( envelope ); return envelope;
LOG.info( "Populating feature store with features from file '" + docURL + "'..." ); FeatureCollection fc = (FeatureCollection) gmlStream.readFeature(); gmlStream.getIdContext().resolveLocalRefs();
private Polygon parsePolygonProperty( XMLStreamReaderWrapper xmlStream, ICRS crs ) throws XMLStreamException { Polygon polygon = null; String href = xmlStream.getAttributeValue( CommonNamespaces.XLNNS, "href" ); if ( href != null && href.length() > 0 ) { LOG.debug( "Found geometry reference (xlink): '" + href + "'" ); polygon = new PolygonReference( idContext, href, xmlStream.getSystemId() ); idContext.addReference( (GeometryReference<?>) polygon ); if ( xmlStream.nextTag() == XMLStreamConstants.START_ELEMENT ) { String msg = "Unexpected element '" + xmlStream.getName() + "'. Polygon value has already been specified using xlink."; throw new XMLParsingException( xmlStream, msg ); } } else if ( xmlStream.nextTag() == XMLStreamConstants.START_ELEMENT ) { // must be a 'gml:Polygon' element if ( !xmlStream.getLocalName().equals( "Polygon" ) ) { String msg = "Error in polygon property element. Expected a 'gml:Polygon' element."; throw new XMLParsingException( xmlStream, msg ); } polygon = parsePolygon( xmlStream, crs ); xmlStream.nextTag(); } else { String msg = "Error in Polygon property element. Expected a 'gml:Polygon' element or an 'xlink:href' attribute."; throw new XMLParsingException( xmlStream, msg ); } return polygon; }
/** * @param xmlStream * @param defaultCRS * @return * @throws XMLStreamException */ public MultiLineString parseMultiLineString( XMLStreamReaderWrapper xmlStream, ICRS defaultCRS ) throws XMLStreamException { String gid = parseGeometryId( xmlStream ); ICRS crs = determineActiveCRS( xmlStream, defaultCRS ); xmlStream.nextTag(); List<LineString> members = new LinkedList<LineString>(); if ( xmlStream.isStartElement() ) { do { String localName = xmlStream.getLocalName(); if ( localName.equals( "lineStringMember" ) ) { members.add( parseLineStringProperty( xmlStream, crs ) ); xmlStream.require( END_ELEMENT, GML21NS, "lineStringMember" ); } else { String msg = "Invalid 'gml:MultiLineString' element: unexpected element '" + localName + "'. Expected 'lineStringMember'."; throw new XMLParsingException( xmlStream, msg ); } } while ( xmlStream.nextTag() == START_ELEMENT ); } xmlStream.require( END_ELEMENT, GML21NS, "MultiLineString" ); MultiLineString multiLineString = geomFac.createMultiLineString( gid, crs, members ); idContext.addObject( multiLineString ); return multiLineString; }