Skip to content

Commit

Permalink
test for bug #471
Browse files Browse the repository at this point in the history
  • Loading branch information
rtroilo committed Nov 2, 2022
1 parent 945efb5 commit dbe4045
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.heigit.ohsome.oshdb.util.geometry;

import org.heigit.ohsome.oshdb.osm.OSM;
import org.heigit.ohsome.oshdb.osm.OSMMember;
import org.heigit.ohsome.oshdb.util.geometry.helpers.FakeTagInterpreterAreaMultipolygonAllOuters;
import org.heigit.ohsome.oshdb.util.geometry.helpers.TimestampParser;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.MultiPolygon;
import org.locationtech.jts.geom.Polygon;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;

import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.stream.Collectors;

import static org.heigit.ohsome.oshdb.util.geometry.OSHDBGeometryBuilderTest.checkAllMemberPermutations;
import static org.junit.jupiter.api.Assertions.*;

class OSHDBGeometryBuilderMultipolygonTest extends OSHDBGeometryTest {
private final WKTReader wkt = new WKTReader();

OSHDBGeometryBuilderMultipolygonTest(){
super("./src/test/resources/relations/polygonShareNode.osm");
}

/**
* expect Polygon with a hole
* - POLYGON((0 0,0 2,2 2,4 2,4 0,0 0),(2 2,1 1,3 1,2 2))
*
* 2 1 --- 2 --- 5
* | /\ |
* 1 | 3 -- 4 |
* | |
* 0 0 --------- 6
* 0 1 2 3 4
*
* @throws ParseException
*/
@Test
public void testPolygonShareNode() throws ParseException {
var expect = wkt.read("POLYGON ((0 0, 0 2, 2 2, 4 2, 4 0, 0 0), (2 2, 1 1, 3 1, 2 2))");
var members = testData.relations().get(0L).get(0).getMembers();
var counter = new AtomicInteger();
checkAllMemberPermutations(members.length, members, getMultipolygonSharedNodeCheck((permutation, geom) -> {
if (!(geom.isValid() && geom instanceof Polygon && expect.equals(geom))) {
System.out.printf("%2d - %s - %s%n", counter.getAndIncrement(), print(permutation), geom);
}
assertTrue(geom.isValid());
assertEquals("Polygon", geom.getGeometryType());
assertTrue(expect.equals(geom));
}));
}

public static Consumer<OSMMember[]> getMultipolygonSharedNodeCheck(BiConsumer<OSMMember[], Geometry> tester) {
var areaDecider = new FakeTagInterpreterAreaMultipolygonAllOuters();
var timestamp = TimestampParser.toOSHDBTimestamp("2001-01-01");
return relMembers -> {
var relation = OSM.relation(1, 1, timestamp.getEpochSecond(), 0, 0, null, relMembers);
var geom = OSHDBGeometryBuilder.getGeometry(relation, timestamp, areaDecider);
tester.accept(relMembers, geom);
};
}

private static String print(OSMMember[] mems) {
return Arrays.stream(mems).map(m -> "" + m.getId()).collect(Collectors.joining(""));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import org.heigit.ohsome.oshdb.util.geometry.helpers.TimestampParser;
import org.heigit.ohsome.oshdb.util.taginterpreter.TagInterpreter;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
Expand Down Expand Up @@ -292,7 +293,7 @@ public void testMultipolygonShellsShareNode() {
}));
}

private Consumer<OSMMember[]> getMultipolygonSharedNodeCheck(Consumer<Geometry> tester) {
public Consumer<OSMMember[]> getMultipolygonSharedNodeCheck(Consumer<Geometry> tester) {
var areaDecider = new FakeTagInterpreterAreaMultipolygonAllOuters();
var timestamp = TimestampParser.toOSHDBTimestamp("2001-01-01");
return relMembers -> {
Expand All @@ -303,7 +304,7 @@ private Consumer<OSMMember[]> getMultipolygonSharedNodeCheck(Consumer<Geometry>
};
}

private static <T> void checkAllMemberPermutations(int n, T[] elements, Consumer<T[]> consumer) {
public static <T> void checkAllMemberPermutations(int n, T[] elements, Consumer<T[]> consumer) {
if (n == 1) {
consumer.accept(elements);
} else {
Expand All @@ -324,4 +325,6 @@ private static <T> void swap(T[] elements, int a, int b) {
elements[a] = elements[b];
elements[b] = tmp;
}


}
36 changes: 36 additions & 0 deletions oshdb-util/src/test/resources/relations/polygonShareNode.osm
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<osm version="0.6">
<node id="0" lat="0" lon="0" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z" />
<node id="1" lat="2" lon="0" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z" />
<node id="2" lat="2" lon="2" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z" />
<node id="3" lat="1" lon="1" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z" />
<node id="4" lat="1" lon="3" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z" />
<node id="5" lat="2" lon="4" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z" />
<node id="6" lat="0" lon="4" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z" />

<way id="0" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z">
<nd ref="0" />
<nd ref="1" />
<nd ref="2" />
</way>
<way id="1" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z">
<nd ref="2" />
<nd ref="3" />
</way>
<way id="2" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z">
<nd ref="3" />
<nd ref="4" />
<nd ref="2" />
</way>
<way id="3" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z">
<nd ref="2" />
<nd ref="5" />
<nd ref="6" />
<nd ref="0" />
</way>
<relation id="0" visible="true" version="1" uid="0" user="a" changeset="1" timestamp="2000-01-01T00:00:00Z">
<member type="way" ref="0" role="outer" />
<member type="way" ref="1" role="outer" />
<member type="way" ref="2" role="outer" />
<member type="way" ref="3" role="outer" />
</relation>
</osm>

0 comments on commit dbe4045

Please sign in to comment.