/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2012, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.gml3.v3_2; import com.vividsolutions.jts.geom.MultiPolygon; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.StringReader; import java.net.URL; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import junit.framework.TestCase; import org.apache.commons.io.FileUtils; import org.eclipse.xsd.XSDSchema; import org.geotools.data.DataUtilities; import org.geotools.feature.FeatureCollection; import org.geotools.feature.FeatureIterator; import org.geotools.referencing.CRS; import org.geotools.xml.Parser; import org.opengis.feature.simple.SimpleFeature; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.w3c.dom.Document; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; import org.xml.sax.SAXException; /** * * * @source $URL$ */ public class GMLParsingTest extends TestCase { public void testGML() throws Exception { XSDSchema gml = GML.getInstance().getSchema(); assertFalse( gml.getTypeDefinitions().isEmpty() ); } public void testParseFeatureCollection() throws Exception { File schema = File.createTempFile("test", "xsd"); schema.deleteOnExit(); FileUtils.copyURLToFile(getClass().getResource("test.xsd"), schema); Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse( getClass().getResourceAsStream( "test.xml" ) ); URL schemaURL = DataUtilities.fileToURL( schema.getAbsoluteFile() ); dom.getDocumentElement().setAttribute( "xsi:schemaLocation", "http://www.geotools.org/test " + schemaURL.getFile() ); ByteArrayOutputStream out = new ByteArrayOutputStream(); TransformerFactory.newInstance().newTransformer().transform( new DOMSource( dom ), new StreamResult( out ) ); GMLConfiguration config = new GMLConfiguration(); Parser p = new Parser( config ); Object o = p.parse( new ByteArrayInputStream( out.toByteArray() ) ); assertTrue( o instanceof FeatureCollection ); FeatureCollection features = (FeatureCollection) o; assertEquals( 3, features.size() ); FeatureIterator fi = features.features(); try { for ( int i = 0; i < 3; i++ ) { assertTrue( fi.hasNext() ); SimpleFeature f = (SimpleFeature) fi.next(); assertTrue( f.getDefaultGeometry() instanceof Point ); Point point = (Point) f.getDefaultGeometry(); assertEquals( i/1d, point.getX(), 0.1 ); assertEquals( i/1d, point.getX(), 0.1 ); assertEquals( i, f.getAttribute( "count" ) ); } } finally { fi.close(); } } /** * Parse an srsName from a gml:Point. * * @param srsName the srsName attribute on the gml:Point * @return the parsed CoordinateReferenceSystem */ private static CoordinateReferenceSystem parsePointSrsname(String srsName) { Parser parser = new Parser(new GMLConfiguration()); String text = "<gml:Point " // + "xmlns:gml=\"http://www.opengis.net/gml/3.2\" " // + "srsName=\"" + srsName + "\">" // + "<gml:pos>1 2</gml:pos>" // + "</gml:Point>"; try { Point point = (Point) parser.parse(new StringReader(text)); return (CoordinateReferenceSystem) point.getUserData(); } catch (Exception e) { throw new RuntimeException(e); } } /** * Test parsing of an srsName in EPSG code format. */ public void testParseEpsgSrsname() throws Exception { assertEquals(CRS.decode("EPSG:4326"), parsePointSrsname("EPSG:4326")); } /** * Test parsing of an srsName in OGC HTTP URL format. */ public void testParseOgcHttpUrlSrsname() throws Exception { assertEquals(CRS.decode("EPSG:4326"), parsePointSrsname("http://www.opengis.net/gml/srs/epsg.xml#4326")); } /** * Test parsing of an srsName in OGC URN Experimental format. */ public void testParseOgcUrnExperimentalSrsname() throws Exception { assertEquals(CRS.decode("EPSG:4326"), parsePointSrsname("urn:x-ogc:def:crs:EPSG::4326")); } /** * Test parsing of an srsName in OGC URN format. */ public void testParseOgcUrnSrsname() throws Exception { assertEquals(CRS.decode("EPSG:4326"), parsePointSrsname("urn:ogc:def:crs:EPSG::4326")); } /** * Test parsing of an srsName in OGC HTTP URI format. */ public void testParseOgcHttpUriSrsname() throws Exception { assertEquals(CRS.decode("EPSG:4326"), parsePointSrsname("http://www.opengis.net/def/crs/EPSG/0/4326")); } public void testCoordinateList() throws IOException, SAXException, ParserConfigurationException{ GMLConfiguration gml = new GMLConfiguration(true); Parser p = new Parser(gml); Object multiSurface = p.parse(getClass().getResourceAsStream("surfacePatches.xml")); assertFalse(multiSurface instanceof String); assertTrue("wrong element type", multiSurface instanceof MultiPolygon); MultiPolygon geom = (MultiPolygon) multiSurface; assertFalse(geom.isEmpty()); } public void testSurfacememberPatches() throws IOException, SAXException, ParserConfigurationException{ GMLConfiguration gml = new GMLConfiguration(true); Parser p = new Parser(gml); Object multiSurface = p.parse(getClass().getResourceAsStream("surfacememberPatches.xml")); assertFalse(multiSurface instanceof String); assertTrue("wrong element type", multiSurface instanceof MultiPolygon); MultiPolygon geom = (MultiPolygon) multiSurface; assertFalse(geom.isEmpty()); } public void testNestedInteriors() throws IOException, SAXException, ParserConfigurationException{ GMLConfiguration gml = new GMLConfiguration(true); Parser p = new Parser(gml); Object multiSurface = p.parse(getClass().getResourceAsStream("nestedInteriors.xml")); assertFalse(multiSurface instanceof String); assertTrue("wrong element type", multiSurface instanceof MultiPolygon); MultiPolygon geom = (MultiPolygon) multiSurface; assertFalse(geom.isEmpty()); } }