/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2010, Geomatys
*
* 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.geotoolkit.data.osm.xml;
import com.vividsolutions.jts.geom.Point;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.stream.XMLStreamException;
import org.geotoolkit.data.osm.model.Api;
import org.geotoolkit.data.osm.model.MemberType;
import org.geotoolkit.data.osm.model.Transaction;
import org.geotoolkit.data.osm.model.TransactionType;
import org.apache.sis.referencing.CommonCRS;
import org.geotoolkit.temporal.object.TemporalUtilities;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opengis.geometry.Envelope;
import org.apache.sis.util.Utilities;
import static org.junit.Assert.*;
import org.opengis.feature.Feature;
/**
*
* @author Johann Sorel (Geomatys)
*/
public class OSMXMLReaderTest extends org.geotoolkit.test.TestBase {
private static final double DELTA = 0.000000001;
public OSMXMLReaderTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testReading() throws FileNotFoundException, XMLStreamException, IOException, ParseException {
File testFile = new File("src/test/resources/org/geotoolkit/test-data/osm/sampleOSM.osm");
OSMXMLReader reader = new OSMXMLReader();
reader.setInput(testFile);
//check that the bound is correctly read
Envelope env = reader.getEnvelope();
assertNotNull(env);
assertTrue(Utilities.equalsIgnoreMetadata(env.getCoordinateReferenceSystem(), CommonCRS.WGS84.normalizedGeographic()));
assertEquals(-0.108157396316528d, env.getMinimum(0),DELTA);
assertEquals(-0.107599496841431d, env.getMaximum(0),DELTA);
assertEquals(51.5073601795557d, env.getMinimum(1),DELTA);
assertEquals(51.5076406454029d, env.getMaximum(1),DELTA);
final List<Object> elements = new ArrayList<>();
while(reader.hasNext()){
elements.add(reader.next());
}
reader.dispose();
//while raise an error if the order is wrong or if types doesnt match
final Feature n1 = (Feature) elements.get(0);
final Feature n2 = (Feature) elements.get(1);
final Feature way = (Feature) elements.get(2);
final Feature rel = (Feature) elements.get(3);
//check first node
Feature user = (Feature) n1.getPropertyValue("user");
List<Feature> tags = (List) n1.getPropertyValue("tags");
assertEquals(319408586l, n1.getPropertyValue("id"));
assertEquals(440330, n1.getPropertyValue("changeset"));
assertEquals(1, n1.getPropertyValue("version"));
assertEquals(6871, user.getPropertyValue("uid"));
assertEquals("smsm1", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2008-12-17T01:18:42Z").getTime(), n1.getPropertyValue("timestamp"));
assertEquals(51.5074089d, ((Point)n1.getPropertyValue("point")).getCoordinate().y, DELTA);
assertEquals(-0.1080108d,((Point)n1.getPropertyValue("point")).getCoordinate().x, DELTA);
assertEquals(0, tags.size());
//check second node
user = (Feature) n2.getPropertyValue("user");
tags = (List) n2.getPropertyValue("tags");
assertEquals(275452090l, n2.getPropertyValue("id"));
assertEquals(2980587, n2.getPropertyValue("changeset"));
assertEquals(3, n2.getPropertyValue("version"));
assertEquals(1697, user.getPropertyValue("uid"));
assertEquals("nickb", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2009-10-29T12:14:35Z").getTime(), n2.getPropertyValue("timestamp"));
assertEquals(51.5075933d, ((Point)n2.getPropertyValue("point")).getCoordinate().y, DELTA);
assertEquals(-0.1076186d,((Point)n2.getPropertyValue("point")).getCoordinate().x, DELTA);
assertEquals(2, tags.size());
assertEquals("name",tags.get(0).getPropertyValue("k"));
assertEquals("Jam's Sandwich Bar",tags.get(0).getPropertyValue("v"));
assertEquals("amenity",tags.get(1).getPropertyValue("k"));
assertEquals("cafe",tags.get(1).getPropertyValue("v"));
//check the way
user = (Feature) way.getPropertyValue("user");
tags = (List) way.getPropertyValue("tags");
List<Long> nodes = (List) way.getPropertyValue("nd");
assertEquals(27776903l, way.getPropertyValue("id"));
assertEquals(1368552, way.getPropertyValue("changeset"));
assertEquals(3, way.getPropertyValue("version"));
assertEquals(70, user.getPropertyValue("uid"));
assertEquals("Matt", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2009-05-31T13:39:15Z").getTime(), way.getPropertyValue("timestamp"));
assertEquals(2, tags.size());
assertEquals("access",tags.get(0).getPropertyValue("k"));
assertEquals("private",tags.get(0).getPropertyValue("v"));
assertEquals("highway",tags.get(1).getPropertyValue("k"));
assertEquals("service",tags.get(1).getPropertyValue("v"));
assertEquals(2, nodes.size());
assertEquals(319408586, nodes.get(0).longValue());
assertEquals(275452090, nodes.get(1).longValue());
//check the relation
user = (Feature) rel.getPropertyValue("user");
tags = (List) rel.getPropertyValue("tags");
List<Feature> members = (List) rel.getPropertyValue("members");
assertEquals(33368911l, rel.getPropertyValue("id"));
assertEquals(152, rel.getPropertyValue("changeset"));
assertEquals(3, rel.getPropertyValue("version"));
assertEquals(77, user.getPropertyValue("uid"));
assertEquals("Georges", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2009-05-31T13:39:15Z").getTime(), rel.getPropertyValue("timestamp"));
assertEquals(1, tags.size());
assertEquals("space",tags.get(0).getPropertyValue("k"));
assertEquals("garden",tags.get(0).getPropertyValue("v"));
assertEquals(2, members.size());
assertEquals(27776903l, members.get(0).getPropertyValue("ref"));
assertEquals("border", members.get(0).getPropertyValue("role"));
assertEquals(MemberType.WAY, members.get(0).getPropertyValue("type"));
assertEquals(319408586l, members.get(1).getPropertyValue("ref"));
assertEquals("center", members.get(1).getPropertyValue("role"));
assertEquals(MemberType.NODE, members.get(1).getPropertyValue("type"));
}
@Test
public void testMoveTo() throws FileNotFoundException, XMLStreamException, IOException, ParseException {
File testFile = new File("src/test/resources/org/geotoolkit/test-data/osm/sampleOSM.osm");
OSMXMLReader reader = new OSMXMLReader();
reader.setInput(testFile);
//check that the bound is correctly read
Envelope env = reader.getEnvelope();
assertNotNull(env);
assertTrue(Utilities.equalsIgnoreMetadata(env.getCoordinateReferenceSystem(), CommonCRS.WGS84.normalizedGeographic()));
assertEquals(-0.108157396316528d, env.getMinimum(0),DELTA);
assertEquals(-0.107599496841431d, env.getMaximum(0),DELTA);
assertEquals(51.5073601795557d, env.getMinimum(1),DELTA);
assertEquals(51.5076406454029d, env.getMaximum(1),DELTA);
//move to the way node
reader.moveTo(27776903l);
final List<Object> elements = new ArrayList<>();
while(reader.hasNext()){
elements.add(reader.next());
}
reader.dispose();
//while raise an error if the order is wrong or if types doesnt match
final Feature way = (Feature) elements.get(0);
final Feature rel = (Feature) elements.get(1);
//check the way
Feature user = (Feature) way.getPropertyValue("user");
List<Feature> tags = (List) way.getPropertyValue("tags");
List<Long> nodes = (List) way.getPropertyValue("nd");
assertEquals(27776903l, way.getPropertyValue("id"));
assertEquals(1368552, way.getPropertyValue("changeset"));
assertEquals(3, way.getPropertyValue("version"));
assertEquals(70, user.getPropertyValue("uid"));
assertEquals("Matt", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2009-05-31T13:39:15Z").getTime(), way.getPropertyValue("timestamp"));
assertEquals(2, tags.size());
assertEquals("access",tags.get(0).getPropertyValue("k"));
assertEquals("private",tags.get(0).getPropertyValue("v"));
assertEquals("highway",tags.get(1).getPropertyValue("k"));
assertEquals("service",tags.get(1).getPropertyValue("v"));
assertEquals(2, nodes.size());
assertEquals(319408586, nodes.get(0).longValue());
assertEquals(275452090, nodes.get(1).longValue());
//check the relation
user = (Feature) rel.getPropertyValue("user");
tags = (List) rel.getPropertyValue("tags");
List<Feature> members = (List) rel.getPropertyValue("members");
assertEquals(33368911l, rel.getPropertyValue("id"));
assertEquals(152, rel.getPropertyValue("changeset"));
assertEquals(3, rel.getPropertyValue("version"));
assertEquals(77, user.getPropertyValue("uid"));
assertEquals("Georges", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2009-05-31T13:39:15Z").getTime(), rel.getPropertyValue("timestamp"));
assertEquals(1, tags.size());
assertEquals("space",tags.get(0).getPropertyValue("k"));
assertEquals("garden",tags.get(0).getPropertyValue("v"));
assertEquals(2, members.size());
assertEquals(27776903l, members.get(0).getPropertyValue("ref"));
assertEquals("border", members.get(0).getPropertyValue("role"));
assertEquals(MemberType.WAY, members.get(0).getPropertyValue("type"));
assertEquals(319408586l, members.get(1).getPropertyValue("ref"));
assertEquals("center", members.get(1).getPropertyValue("role"));
assertEquals(MemberType.NODE, members.get(1).getPropertyValue("type"));
}
@Test
public void testReadingDiff() throws FileNotFoundException, XMLStreamException, IOException, ParseException {
File testFile = new File("src/test/resources/org/geotoolkit/test-data/osm/diffOSM.osm");
OSMXMLReader reader = new OSMXMLReader();
reader.setInput(testFile);
//check that the bound is null
Envelope env = reader.getEnvelope();
assertNull(env);
final List<Object> elements = new ArrayList<>();
while(reader.hasNext()){
elements.add(reader.next());
}
reader.dispose();
//while raise an error if the order is wrong or if types doesnt match
final Transaction create = (Transaction) elements.get(0);
final Transaction modify = (Transaction) elements.get(1);
final Transaction delete = (Transaction) elements.get(2);
assertEquals("0.3", create.getVersion());
assertEquals("0.3", modify.getVersion());
assertEquals("0.3", delete.getVersion());
assertEquals("puzzle-gis", create.getGenerator());
assertEquals("puzzle-gis", modify.getGenerator());
assertEquals("puzzle-gis", delete.getGenerator());
assertEquals(TransactionType.CREATE, create.getType());
assertEquals(TransactionType.MODIFY, modify.getType());
assertEquals(TransactionType.DELETE, delete.getType());
assertEquals(2, create.getElements().size());
assertEquals(1, modify.getElements().size());
assertEquals(1, delete.getElements().size());
final Feature n1 = create.getElements().get(0);
final Feature n2 = create.getElements().get(1);
final Feature way = modify.getElements().get(0);
final Feature rel = delete.getElements().get(0);
//check first node
Feature user = (Feature) n1.getPropertyValue("user");
List<Feature> tags = (List) n1.getPropertyValue("tags");
assertEquals(319408586l, n1.getPropertyValue("id"));
assertEquals(440330, n1.getPropertyValue("changeset"));
assertEquals(1, n1.getPropertyValue("version"));
assertEquals(6871, user.getPropertyValue("uid"));
assertEquals("smsm1", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2008-12-17T01:18:42Z").getTime(), n1.getPropertyValue("timestamp"));
assertEquals(51.5074089d, ((Point)n1.getPropertyValue("point")).getCoordinate().y, DELTA);
assertEquals(-0.1080108d,((Point)n1.getPropertyValue("point")).getCoordinate().x, DELTA);
assertEquals(0, tags.size());
//check second node
user = (Feature) n2.getPropertyValue("user");
tags = (List) n2.getPropertyValue("tags");
assertEquals(275452090l, n2.getPropertyValue("id"));
assertEquals(2980587, n2.getPropertyValue("changeset"));
assertEquals(3, n2.getPropertyValue("version"));
assertEquals(1697, user.getPropertyValue("uid"));
assertEquals("nickb", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2009-10-29T12:14:35Z").getTime(), n2.getPropertyValue("timestamp"));
assertEquals(51.5075933d, ((Point)n2.getPropertyValue("point")).getCoordinate().y, DELTA);
assertEquals(-0.1076186d,((Point)n2.getPropertyValue("point")).getCoordinate().x, DELTA);
assertEquals(2, tags.size());
assertEquals("name",tags.get(0).getPropertyValue("k"));
assertEquals("Jam's Sandwich Bar",tags.get(0).getPropertyValue("v"));
assertEquals("amenity",tags.get(1).getPropertyValue("k"));
assertEquals("cafe",tags.get(1).getPropertyValue("v"));
//check the way
user = (Feature) way.getPropertyValue("user");
tags = (List) way.getPropertyValue("tags");
List<Long> nodes = (List) way.getPropertyValue("nd");
assertEquals(27776903l, way.getPropertyValue("id"));
assertEquals(1368552, way.getPropertyValue("changeset"));
assertEquals(3, way.getPropertyValue("version"));
assertEquals(70, user.getPropertyValue("uid"));
assertEquals("Matt", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2009-05-31T13:39:15Z").getTime(), way.getPropertyValue("timestamp"));
assertEquals(2,tags.size());
assertEquals("access",tags.get(0).getPropertyValue("k"));
assertEquals("private",tags.get(0).getPropertyValue("v"));
assertEquals("highway",tags.get(1).getPropertyValue("k"));
assertEquals("service",tags.get(1).getPropertyValue("v"));
assertEquals(2, nodes.size());
assertEquals(319408586, nodes.get(0).longValue());
assertEquals(275452090, nodes.get(1).longValue());
//check the relation
user = (Feature) rel.getPropertyValue("user");
tags = (List) rel.getPropertyValue("tags");
List<Feature> members = (List) rel.getPropertyValue("members");
assertEquals(33368911l, rel.getPropertyValue("id"));
assertEquals(152, rel.getPropertyValue("changeset"));
assertEquals(3, rel.getPropertyValue("version"));
assertEquals(77, user.getPropertyValue("uid"));
assertEquals("Georges", user.getPropertyValue("user"));
assertEquals(TemporalUtilities.parseDate("2009-05-31T13:39:15Z").getTime(), rel.getPropertyValue("timestamp"));
assertEquals(1, tags.size());
assertEquals("space",tags.get(0).getPropertyValue("k"));
assertEquals("garden",tags.get(0).getPropertyValue("v"));
assertEquals(2, members.size());
assertEquals(27776903l, members.get(0).getPropertyValue("ref"));
assertEquals("border", members.get(0).getPropertyValue("role"));
assertEquals(MemberType.WAY, members.get(0).getPropertyValue("type"));
assertEquals(319408586l, members.get(1).getPropertyValue("ref"));
assertEquals("center", members.get(1).getPropertyValue("role"));
assertEquals(MemberType.NODE, members.get(1).getPropertyValue("type"));
}
@Test
public void testReadingCapabilities() throws FileNotFoundException, XMLStreamException, IOException {
File testFile = new File("src/test/resources/org/geotoolkit/test-data/osm/capabilities.osm");
OSMXMLReader reader = new OSMXMLReader();
reader.setInput(testFile);
final List<Object> elements = new ArrayList<>();
while(reader.hasNext()){
elements.add(reader.next());
}
reader.dispose();
assertEquals(1, elements.size());
//while raise an error if type dont match
final Api a = (Api) elements.get(0);
assertEquals("0.3", a.getVersionMinimum());
assertEquals("0.6", a.getVersionMaximum());
assertEquals(0.25d, a.getAreaMaximum(),DELTA);
assertEquals(5000, a.getTracePointsPerPage());
assertEquals(2000, a.getWayNodeMaximum());
assertEquals(50000, a.getChangesetMaximum());
assertEquals(300, a.getTimeout());
}
}