use of org.opengis.feature.simple.SimpleFeature in project GeoGig by boundlessgeo.
the class GeoGigFeatureSourceTest method testGetFeatures.
@Test
public void testGetFeatures() throws Exception {
SimpleFeatureCollection collection;
Set<List<Object>> actual;
Set<List<Object>> expected;
collection = pointsSource.getFeatures();
assertEquals(pointsType, collection.getSchema());
actual = Sets.newHashSet();
for (Feature f : toList(collection)) {
SimpleFeature sf = (SimpleFeature) f;
actual.add(sf.getAttributes());
}
expected = ImmutableSet.of(((SimpleFeature) points1).getAttributes(), ((SimpleFeature) points2).getAttributes(), ((SimpleFeature) points3).getAttributes());
assertEquals(expected, actual);
collection = linesSource.getFeatures();
assertEquals(linesType, collection.getSchema());
actual = Sets.newHashSet();
for (Feature f : toList(collection)) {
actual.add(((SimpleFeature) f).getAttributes());
}
expected = ImmutableSet.of(((SimpleFeature) lines1).getAttributes(), ((SimpleFeature) lines2).getAttributes(), ((SimpleFeature) lines3).getAttributes());
assertEquals(expected, actual);
}
use of org.opengis.feature.simple.SimpleFeature in project GeoGig by boundlessgeo.
the class OSMUnmapOpTest method testMappingAndUnmappingOfNodesWithDefaultFieds.
@Test
public void testMappingAndUnmappingOfNodesWithDefaultFieds() throws Exception {
// Import
String filename = OSMImportOp.class.getResource("nodes.xml").getFile();
File file = new File(filename);
geogig.command(OSMImportOp.class).setDataSource(file.getAbsolutePath()).call();
geogig.command(AddOp.class).call();
geogig.command(CommitOp.class).setMessage("msg").call();
// Map
Map<String, AttributeDefinition> fields = Maps.newHashMap();
Map<String, List<String>> mappings = Maps.newHashMap();
mappings.put("highway", Lists.newArrayList("bus_stop"));
fields.put("geom", new AttributeDefinition("geom", FieldType.POINT));
fields.put("name", new AttributeDefinition("name_alias", FieldType.STRING));
Map<String, List<String>> filterExclude = Maps.newHashMap();
ArrayList<DefaultField> defaultFields = Lists.newArrayList(DefaultField.tags, DefaultField.timestamp);
MappingRule mappingRule = new MappingRule("busstops", mappings, filterExclude, fields, defaultFields);
List<MappingRule> mappingRules = Lists.newArrayList();
mappingRules.add(mappingRule);
Mapping mapping = new Mapping(mappingRules);
geogig.command(OSMMapOp.class).setMapping(mapping).call();
Optional<RevFeature> revFeature = geogig.command(RevObjectParse.class).setRefSpec("HEAD:busstops/507464799").call(RevFeature.class);
assertTrue(revFeature.isPresent());
Optional<RevFeatureType> featureType = geogig.command(ResolveFeatureType.class).setRefSpec("HEAD:busstops/507464799").call();
assertTrue(featureType.isPresent());
ImmutableList<Optional<Object>> values = revFeature.get().getValues();
assertEquals(5, values.size());
String wkt = "POINT (7.1959361 50.739397)";
assertEquals(wkt, values.get(4).get().toString());
assertEquals(507464799l, values.get(0).get());
// Modify a node
GeometryFactory gf = new GeometryFactory();
SimpleFeatureBuilder fb = new SimpleFeatureBuilder((SimpleFeatureType) featureType.get().type());
fb.set("geom", gf.createPoint(new Coordinate(0, 1)));
fb.set("name_alias", "newname");
fb.set("id", 507464799l);
fb.set("tags", "VRS:gemeinde:BONN|VRS:ortsteil:Hoholz|VRS:ref:68566|bus:yes|highway:bus_stop|name:Gielgen|public_transport:platform");
fb.set("timestamp", 1355097351000l);
SimpleFeature newFeature = fb.buildFeature("507464799");
geogig.getRepository().workingTree().insert("busstops", newFeature);
// check that it was correctly inserted in the working tree
Optional<RevFeature> mapped = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:busstops/507464799").call(RevFeature.class);
assertTrue(mapped.isPresent());
values = mapped.get().getValues();
assertEquals("POINT (0 1)", values.get(4).get().toString());
assertEquals(507464799l, ((Long) values.get(0).get()).longValue());
assertEquals("newname", values.get(3).get().toString());
assertEquals("1355097351000", values.get(2).get().toString());
assertEquals("VRS:gemeinde:BONN|VRS:ortsteil:Hoholz|VRS:ref:68566|bus:yes|highway:bus_stop|name:Gielgen|public_transport:platform", values.get(1).get().toString());
// unmap
geogig.command(OSMUnmapOp.class).setPath("busstops").call();
WorkingTree workTree = geogig.getRepository().workingTree();
long unstaged = workTree.countUnstaged("node").featureCount();
assertEquals(1, unstaged);
// check that the unmapped node has the changes we introduced
Optional<RevFeature> unmapped = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:node/507464799").call(RevFeature.class);
assertTrue(unmapped.isPresent());
values = unmapped.get().getValues();
assertEquals("POINT (0 1)", values.get(6).get().toString());
assertEquals("bus:yes|public_transport:platform|highway:bus_stop|VRS:ortsteil:Hoholz|name:newname|VRS:ref:68566|VRS:gemeinde:BONN", values.get(3).get().toString());
// check that unchanged nodes keep their attributes
Optional<RevFeature> unchanged = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:node/1633594723").call(RevFeature.class);
values = unchanged.get().getValues();
assertEquals("14220478", values.get(4).get().toString());
assertEquals("1355097351000", values.get(2).get().toString());
assertEquals("2", values.get(1).get().toString());
}
use of org.opengis.feature.simple.SimpleFeature in project GeoGig by boundlessgeo.
the class OSMUnmapOpTest method testMappingAndUnmappingOfWays.
@Test
public void testMappingAndUnmappingOfWays() throws Exception {
// Import
String filename = OSMImportOp.class.getResource("ways.xml").getFile();
File file = new File(filename);
geogig.command(OSMImportOp.class).setDataSource(file.getAbsolutePath()).call();
WorkingTree workTree = geogig.getRepository().workingTree();
long unstaged = workTree.countUnstaged("node").count();
assertTrue(unstaged > 0);
unstaged = workTree.countUnstaged("way").count();
assertTrue(unstaged > 0);
geogig.command(AddOp.class).call();
geogig.command(CommitOp.class).setMessage("msg").call();
// map
Map<String, AttributeDefinition> fields = Maps.newHashMap();
Map<String, List<String>> mappings = Maps.newHashMap();
mappings.put("highway", Lists.newArrayList("residential"));
fields.put("geom", new AttributeDefinition("geom", FieldType.LINESTRING));
fields.put("name", new AttributeDefinition("name", FieldType.STRING));
Map<String, List<String>> filterExclude = Maps.newHashMap();
MappingRule mappingRule = new MappingRule("residential", mappings, filterExclude, fields, null);
List<MappingRule> mappingRules = Lists.newArrayList();
mappingRules.add(mappingRule);
Mapping mapping = new Mapping(mappingRules);
geogig.command(OSMMapOp.class).setMapping(mapping).call();
// check that mapping was correctly performed
Optional<RevFeature> revFeature = geogig.command(RevObjectParse.class).setRefSpec("HEAD:residential/31347480").call(RevFeature.class);
assertTrue(revFeature.isPresent());
Optional<RevFeatureType> featureType = geogig.command(ResolveFeatureType.class).setRefSpec("HEAD:residential/31347480").call();
assertTrue(featureType.isPresent());
ImmutableList<Optional<Object>> values = revFeature.get().getValues();
assertEquals(4, values.size());
// modify a mapped feature. We add a new coordinate to the geometry (0,1) and change the
// value of 'name' tag to "newvalue"
ArrayList<Coordinate> coords = Lists.newArrayList(((Geometry) values.get(2).get()).getCoordinates());
coords.add(new Coordinate(0, 1));
assertEquals(31347480l, values.get(0).get());
GeometryFactory gf = new GeometryFactory();
SimpleFeatureBuilder fb = new SimpleFeatureBuilder((SimpleFeatureType) featureType.get().type());
fb.set("geom", gf.createLineString(coords.toArray(new Coordinate[0])));
fb.set("name", "newname");
fb.set("id", 31347480l);
fb.set("nodes", values.get(3).get());
SimpleFeature newFeature = fb.buildFeature("31347480");
geogig.getRepository().workingTree().insert("residential", newFeature);
Optional<RevFeature> mapped = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:residential/31347480").call(RevFeature.class);
assertTrue(mapped.isPresent());
values = mapped.get().getValues();
assertEquals("LINESTRING (7.1960069 50.7399033, 7.195868 50.7399081, 7.1950788 50.739912, 7.1949262 50.7399053, " + "7.1942463 50.7398686, 7.1935778 50.7398262, 7.1931011 50.7398018, 7.1929987 50.7398009, 7.1925978 50.7397889, " + "7.1924199 50.7397781, 0 1)", values.get(2).get().toString());
assertEquals(31347480l, ((Long) values.get(0).get()).longValue());
assertEquals("newname", values.get(1).get().toString());
// unmap
geogig.command(OSMUnmapOp.class).setPath("residential").call();
// Check that raw OSM data was updated
// First, we check that the corresponding way has been modified
Optional<RevFeature> unmapped = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:way/31347480").call(RevFeature.class);
assertTrue(unmapped.isPresent());
values = unmapped.get().getValues();
assertEquals("LINESTRING (7.1960069 50.7399033, 7.195868 50.7399081, 7.1950788 50.739912, 7.1949262 50.7399053, " + "7.1942463 50.7398686, 7.1935778 50.7398262, 7.1931011 50.7398018, 7.1929987 50.7398009, 7.1925978 50.7397889, " + "7.1924199 50.7397781, 0 1)", values.get(7).get().toString());
assertEquals("lit:no|highway:residential|name:newname|oneway:yes", values.get(3).get().toString());
// now we get the 'nodes' field in the unmapped feature and check take the id of its last
// node, which refers to the node that we have added to the geometry
int WAY_NODES_FIELD = 6;
String nodes = values.get(WAY_NODES_FIELD).get().toString();
String[] nodeIds = nodes.split(";");
String newNodeId = nodeIds[nodeIds.length - 1];
// and we check that the node has been added to the 'node' tree and has the right
// coordinates.
Optional<RevFeature> newNode = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:node/" + newNodeId).call(RevFeature.class);
assertTrue(newNode.isPresent());
values = newNode.get().getValues();
int NODE_GEOM_FIELD = 6;
assertEquals("POINT (0 1)", values.get(NODE_GEOM_FIELD).get().toString());
}
use of org.opengis.feature.simple.SimpleFeature in project GeoGig by boundlessgeo.
the class OSMUnmapOpTest method testMappingAndUnmappingOfWaysWithAlias.
@Test
public void testMappingAndUnmappingOfWaysWithAlias() throws Exception {
// Import
String filename = OSMImportOp.class.getResource("ways.xml").getFile();
File file = new File(filename);
geogig.command(OSMImportOp.class).setDataSource(file.getAbsolutePath()).call();
geogig.command(AddOp.class).call();
geogig.command(CommitOp.class).setMessage("msg").call();
// map
Map<String, AttributeDefinition> fields = Maps.newHashMap();
Map<String, List<String>> mappings = Maps.newHashMap();
mappings.put("highway", Lists.newArrayList("residential"));
fields.put("geom", new AttributeDefinition("geom", FieldType.LINESTRING));
fields.put("name", new AttributeDefinition("name_alias", FieldType.STRING));
Map<String, List<String>> filterExclude = Maps.newHashMap();
MappingRule mappingRule = new MappingRule("residential", mappings, filterExclude, fields, null);
List<MappingRule> mappingRules = Lists.newArrayList();
mappingRules.add(mappingRule);
Mapping mapping = new Mapping(mappingRules);
geogig.command(OSMMapOp.class).setMapping(mapping).call();
// check that mapping was correctly performed
Optional<RevFeature> revFeature = geogig.command(RevObjectParse.class).setRefSpec("HEAD:residential/31347480").call(RevFeature.class);
assertTrue(revFeature.isPresent());
Optional<RevFeatureType> featureType = geogig.command(ResolveFeatureType.class).setRefSpec("WORK_HEAD:residential/31347480").call();
assertTrue(featureType.isPresent());
ImmutableList<Optional<Object>> values = revFeature.get().getValues();
assertEquals(4, values.size());
// unmap without having made any changes and check that the canonical folders are not
// modified
WorkingTree workTree = geogig.getRepository().workingTree();
geogig.command(OSMUnmapOp.class).setPath("residential").call();
long unstaged = workTree.countUnstaged("way").count();
assertEquals(0, unstaged);
unstaged = workTree.countUnstaged("node").count();
assertEquals(0, unstaged);
// modify a mapped feature. We change the value of 'name_alias' tag to "newvalue"
ArrayList<Coordinate> coords = Lists.newArrayList(((Geometry) values.get(2).get()).getCoordinates());
coords.add(new Coordinate(0, 1));
assertEquals(31347480l, values.get(0).get());
GeometryFactory gf = new GeometryFactory();
SimpleFeatureBuilder fb = new SimpleFeatureBuilder((SimpleFeatureType) featureType.get().type());
fb.set("geom", gf.createLineString(coords.toArray(new Coordinate[0])));
fb.set("name_alias", "newname");
fb.set("id", 31347480l);
fb.set("nodes", values.get(3).get());
SimpleFeature newFeature = fb.buildFeature("31347480");
geogig.getRepository().workingTree().insert("residential", newFeature);
Optional<RevFeature> mapped = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:residential/31347480").call(RevFeature.class);
assertTrue(mapped.isPresent());
values = mapped.get().getValues();
assertEquals("LINESTRING (7.1960069 50.7399033, 7.195868 50.7399081, 7.1950788 50.739912, 7.1949262 50.7399053, " + "7.1942463 50.7398686, 7.1935778 50.7398262, 7.1931011 50.7398018, 7.1929987 50.7398009, 7.1925978 50.7397889, " + "7.1924199 50.7397781, 0 1)", values.get(2).get().toString());
assertEquals(31347480l, ((Long) values.get(0).get()).longValue());
assertEquals("newname", values.get(1).get().toString());
// unmap
geogig.command(OSMUnmapOp.class).setPath("residential").call();
// Check that raw OSM data was updated
// First, we check that the corresponding way has been modified
Optional<RevFeature> unmapped = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:way/31347480").call(RevFeature.class);
assertTrue(unmapped.isPresent());
values = unmapped.get().getValues();
assertEquals("LINESTRING (7.1960069 50.7399033, 7.195868 50.7399081, 7.1950788 50.739912, 7.1949262 50.7399053, " + "7.1942463 50.7398686, 7.1935778 50.7398262, 7.1931011 50.7398018, 7.1929987 50.7398009, 7.1925978 50.7397889, " + "7.1924199 50.7397781, 0 1)", values.get(7).get().toString());
assertEquals("lit:no|highway:residential|name:newname|oneway:yes", values.get(3).get().toString());
// now we get the 'nodes' field in the unmapped feature and check the id of its last
// node, which refers to the node that we have added to the geometry
int WAY_NODES_FIELD = 6;
String nodes = values.get(WAY_NODES_FIELD).get().toString();
String[] nodeIds = nodes.split(";");
String newNodeId = nodeIds[nodeIds.length - 1];
// and we check that the node has been added to the 'node' tree and has the right
// coordinates.
Optional<RevFeature> newNode = geogig.command(RevObjectParse.class).setRefSpec("WORK_HEAD:node/" + newNodeId).call(RevFeature.class);
assertTrue(newNode.isPresent());
values = newNode.get().getValues();
int NODE_GEOM_FIELD = 6;
assertEquals("POINT (0 1)", values.get(NODE_GEOM_FIELD).get().toString());
}
use of org.opengis.feature.simple.SimpleFeature in project GeoGig by boundlessgeo.
the class ExportDiffOp method getFeatures.
private static Iterator<SimpleFeature> getFeatures(Iterator<DiffEntry> diffs, final boolean old, final ObjectDatabase database, final ObjectId metadataId, final ProgressListener progressListener) {
final SimpleFeatureType featureType = addFidAttribute(database.getFeatureType(metadataId));
final RevFeatureType revFeatureType = RevFeatureTypeImpl.build(featureType);
final SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType);
Function<DiffEntry, SimpleFeature> asFeature = new Function<DiffEntry, SimpleFeature>() {
@Override
@Nullable
public SimpleFeature apply(final DiffEntry input) {
NodeRef nodeRef = old ? input.getOldObject() : input.getNewObject();
if (nodeRef == null) {
return null;
}
final RevFeature revFeature = database.getFeature(nodeRef.objectId());
ImmutableList<Optional<Object>> values = revFeature.getValues();
for (int i = 0; i < values.size(); i++) {
String name = featureType.getDescriptor(i + 1).getLocalName();
Object value = values.get(i).orNull();
featureBuilder.set(name, value);
}
featureBuilder.set("geogig_fid", nodeRef.name());
Feature feature = featureBuilder.buildFeature(nodeRef.name());
feature.getUserData().put(Hints.USE_PROVIDED_FID, true);
feature.getUserData().put(RevFeature.class, revFeature);
feature.getUserData().put(RevFeatureType.class, revFeatureType);
if (feature instanceof SimpleFeature) {
return (SimpleFeature) feature;
}
return null;
}
};
Iterator<SimpleFeature> asFeatures = Iterators.transform(diffs, asFeature);
UnmodifiableIterator<SimpleFeature> filterNulls = Iterators.filter(asFeatures, Predicates.notNull());
return filterNulls;
}
Aggregations