Skip to content

Commit

Permalink
Coordinates can contain more than two elements (x,y) in GeoJSON parser.
Browse files Browse the repository at this point in the history
Closes elastic#9540

Conflicts:
	src/main/java/org/elasticsearch/common/geo/builders/ShapeBuilder.java
	src/test/java/org/elasticsearch/common/geo/GeoJSONShapeParserTests.java
  • Loading branch information
Clément Tourrière committed Mar 20, 2015
1 parent 90322e2 commit 88636e0
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 2 deletions.
Expand Up @@ -210,6 +210,11 @@ public String toString() {
* XContentParser
*/
private static CoordinateNode parseCoordinates(XContentParser parser) throws IOException {
/** http://geojson.org/geojson-spec.html#positions
* A position is represented by an array of numbers.
* There must be at least two elements, and may be more
*/

XContentParser.Token token = parser.nextToken();

// Base cases
Expand All @@ -219,7 +224,10 @@ private static CoordinateNode parseCoordinates(XContentParser parser) throws IOE
double lon = parser.doubleValue();
token = parser.nextToken();
double lat = parser.doubleValue();
token = parser.nextToken();
// Only lon and lat elements are parsed, others (if any) are skipped
while (token != XContentParser.Token.END_ARRAY) {
token = parser.nextToken();
}
return new CoordinateNode(new Coordinate(lon, lat));
} else if (token == XContentParser.Token.VALUE_NULL) {
throw new ElasticsearchIllegalArgumentException("coordinates cannot contain NULL values)");
Expand Down
Expand Up @@ -45,7 +45,7 @@


/**
* Tests for {@link GeoJSONShapeParser}
* Tests for {@link GeoJSONShapeParserTests}
*/
public class GeoJSONShapeParserTests extends ElasticsearchTestCase {

Expand Down Expand Up @@ -157,6 +157,32 @@ public void testParse_polygonNoHoles() throws IOException {
assertGeometryEquals(jtsGeom(expected), polygonGeoJson);
}

@Test
public void testParse_polygonWithCoordinateWithMoreThanTwoElements() throws IOException {
String polygonGeoJson = XContentFactory.jsonBuilder().startObject().field("type", "Polygon")
.startArray("coordinates")
.startArray()
.startArray().value(100.0).value(1.0).endArray()
.startArray().value(101.0).value(1.0).value(2.0).endArray()
.startArray().value(101.0).value(0.0).endArray()
.startArray().value(100.0).value(0.0).endArray()
.startArray().value(100.0).value(1.0).endArray()
.endArray()
.endArray()
.endObject().string();

List<Coordinate> shellCoordinates = new ArrayList<>();
shellCoordinates.add(new Coordinate(100, 0));
shellCoordinates.add(new Coordinate(101, 0));
shellCoordinates.add(new Coordinate(101, 1));
shellCoordinates.add(new Coordinate(100, 1));
shellCoordinates.add(new Coordinate(100, 0));

LinearRing shell = GEOMETRY_FACTORY.createLinearRing(shellCoordinates.toArray(new Coordinate[shellCoordinates.size()]));
Polygon expected = GEOMETRY_FACTORY.createPolygon(shell, null);
assertGeometryEquals(jtsGeom(expected), polygonGeoJson);
}

@Test
public void testParse_invalidPoint() throws IOException {
// test case 1: create an invalid point object with multipoint data format
Expand Down

0 comments on commit 88636e0

Please sign in to comment.