GeoJSONShapeParser parses JSON correctly and extracts coordinates even if 'crs' field is included.

Fixes #2763
This commit is contained in:
Alexander Reelsen 2013-03-13 09:32:43 +01:00 committed by Simon Willnauer
parent 365cde82d3
commit 125b33d3dc
2 changed files with 26 additions and 2 deletions

View File

@ -80,14 +80,17 @@ public class GeoJSONShapeParser {
String fieldName = parser.currentName();
if ("type".equals(fieldName)) {
token = parser.nextToken();
parser.nextToken();
shapeType = parser.text().toLowerCase(Locale.ENGLISH);
if (shapeType == null) {
throw new ElasticSearchParseException("Unknown Shape type [" + parser.text() + "]");
}
} else if ("coordinates".equals(fieldName)) {
token = parser.nextToken();
parser.nextToken();
node = parseCoordinates(parser);
} else {
parser.nextToken();
parser.skipChildren();
}
}
}

View File

@ -210,6 +210,27 @@ public class GeoJSONShapeParserTests {
assertGeometryEquals(new JtsGeometry(expected, GeoShapeConstants.SPATIAL_CONTEXT, false), multiPolygonGeoJson);
}
@Test
public void testThatParserExtractsCorrectTypeAndCoordinatesFromArbitraryJson() throws IOException {
String pointGeoJson = XContentFactory.jsonBuilder().startObject()
.startObject("crs")
.field("type", "name")
.startObject("properties")
.field("name", "urn:ogc:def:crs:OGC:1.3:CRS84")
.endObject()
.endObject()
.field("bbox", "foobar")
.field("type", "point")
.field("bubu", "foobar")
.startArray("coordinates").value(100.0).value(0.0).endArray()
.startObject("nested").startArray("coordinates").value(200.0).value(0.0).endArray().endObject()
.startObject("lala").field("type", "NotAPoint").endObject()
.endObject().string();
Point expected = GEOMETRY_FACTORY.createPoint(new Coordinate(100.0, 0.0));
assertGeometryEquals(new JtsPoint(expected, GeoShapeConstants.SPATIAL_CONTEXT), pointGeoJson);
}
private void assertGeometryEquals(Shape expected, String geoJson) throws IOException {
XContentParser parser = JsonXContent.jsonXContent.createParser(geoJson);
parser.nextToken();