diff --git a/app/models/concerns/geojson_format_validator.rb b/app/models/concerns/geojson_format_validator.rb index 1614cc794..d3a7dc58d 100644 --- a/app/models/concerns/geojson_format_validator.rb +++ b/app/models/concerns/geojson_format_validator.rb @@ -79,8 +79,10 @@ class GeojsonFormatValidator < ActiveModel::EachValidator case geometry["type"] when "Point" valid_wgs84_coordinates?(coordinates) - when "LineString", "MultiPoint" - coordinates.all? { |coordinates| valid_wgs84_coordinates?(coordinates) } + when "LineString" + coordinates.many? && valid_coordinates_array?(coordinates) + when "MultiPoint" + valid_coordinates_array?(coordinates) when "Polygon", "MultiLineString" valid_polygon_coordinates?(coordinates) when "MultiPolygon" @@ -99,9 +101,13 @@ class GeojsonFormatValidator < ActiveModel::EachValidator (-180.0..180.0).include?(longitude) && (-90.0..90.0).include?(latitude) end + def valid_coordinates_array?(coordinates_array) + coordinates_array.all? { |coordinates| valid_wgs84_coordinates?(coordinates) } + end + def valid_polygon_coordinates?(polygon_coordinates) - polygon_coordinates.all? do |ring| - ring.all? { |coordinates| valid_wgs84_coordinates?(coordinates) } + polygon_coordinates.all? do |ring_coordinates| + valid_coordinates_array?(ring_coordinates) end end end diff --git a/spec/models/geojson_format_validator_spec.rb b/spec/models/geojson_format_validator_spec.rb index 1a3ebbf54..f05aa5b74 100644 --- a/spec/models/geojson_format_validator_spec.rb +++ b/spec/models/geojson_format_validator_spec.rb @@ -122,16 +122,6 @@ describe GeojsonFormatValidator do expect(record).not_to be_valid end - it "is valid with a two-dimensional array including only one point" do - record.geojson = '{ "type": "LineString", "coordinates": [[1.23, 4.56]] }' - - expect(record).to be_valid - - record.geojson = '{ "type": "MultiPoint", "coordinates": [[1.23, 4.56]] }' - - expect(record).to be_valid - end - it "is not valid when some coordinates are invalid" do record.geojson = '{ "type": "LineString", "coordinates": [[1.23, 4.56], [180.01, 4.56]] }' @@ -153,6 +143,22 @@ describe GeojsonFormatValidator do end end + context "LineString geometry" do + it "is not valid with only one point" do + record.geojson = '{ "type": "LineString", "coordinates": [[1.23, 4.56]] }' + + expect(record).not_to be_valid + end + end + + context "MultiPoint geometry" do + it "is valid with only one point" do + record.geojson = '{ "type": "MultiPoint", "coordinates": [[1.23, 4.56]] }' + + expect(record).to be_valid + end + end + context "GeometryCollection" do it "is not valid if it doesn't contain geometries" do record.geojson = '{ "type": "GeometryCollection" }'