Skip to content
This repository has been archived by the owner on Aug 5, 2021. It is now read-only.

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

Conflicts:
	src/test/java/org/elasticsearch/common/geo/GeoJSONShapeParserTests.java
  • Loading branch information
Clément Tourrière committed Apr 2, 2015
1 parent f150c16 commit 23a1162
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 2 deletions.
Expand Up @@ -246,6 +246,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 @@ -255,7 +260,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 @@ -46,7 +46,7 @@


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

Expand Down Expand Up @@ -185,6 +185,33 @@ 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
String invalidPoint1 = XContentFactory.jsonBuilder().startObject().field("type", "point")
Expand Down

0 comments on commit 23a1162

Please sign in to comment.