Skip to content

Commit

Permalink
More Georeference error space processing.
Browse files Browse the repository at this point in the history
  • Loading branch information
TuckerJD committed Apr 10, 2014
1 parent 2846af2 commit 9cf35a6
Show file tree
Hide file tree
Showing 2 changed files with 170 additions and 22 deletions.
136 changes: 117 additions & 19 deletions app/models/georeference.rb
Expand Up @@ -62,6 +62,7 @@ class Georeference < ActiveRecord::Base
validates :type, presence: true

def error_box?
retval = nil
# start with a copy of the point of the reference
#retval = geographic_item.dup

Expand All @@ -76,32 +77,96 @@ def error_box?
#retval = error_geographic_item
end
else
# if this object is a point
case geographic_item.data_type?
when :point
p0 = self.geographic_item.geo_object
delta_x = error_radius / ONE_WEST
delta_y = error_radius / ONE_NORTH
# make a diamond 2 * radius tall and 2 * radius wide, with the reference point as center
retval = FACTORY.polygon(FACTORY.line_string([FACTORY.point(p0.x, p0.y + delta_y), # north
FACTORY.point(p0.x + delta_x, p0.y), # east
FACTORY.point(p0.x, p0.y - delta_y), # south
FACTORY.point(p0.x - delta_x, p0.y) # west
]))
when :polygon
retval = geographic_item
else
retval = nil
if geographic_item.nil?
retval = nil
else
# if this object is a point
case geographic_item.data_type?
when :point
p0 = self.geographic_item.geo_object
delta_x = error_radius / ONE_WEST
delta_y = error_radius / ONE_NORTH
# make a diamond 2 * radius tall and 2 * radius wide, with the reference point as center
retval = FACTORY.polygon(FACTORY.line_string([FACTORY.point(p0.x, p0.y + delta_y), # north
FACTORY.point(p0.x + delta_x, p0.y), # east
FACTORY.point(p0.x, p0.y - delta_y), # south
FACTORY.point(p0.x - delta_x, p0.y) # west
]))
when :polygon
retval = geographic_item
else
retval = nil
end
box = RGeo::Cartesian::BoundingBox.new(FACTORY)
box.add(retval)
retval = box.to_geometry
end
box = RGeo::Cartesian::BoundingBox.new(FACTORY)
box.add(retval)
retval = box.to_geometry
end
retval
end

protected

def chk_obj_inside_err_geo_item
# case 1
retval = true
if error_geographic_item.nil? == false && geographic_item.nil? == false
retval = self.error_geographic_item.contains?(self.geographic_item)
end
retval
end

def chk_obj_inside_err_radius
# case 2
retval = true
if error_radius.nil? == false && geographic_item.nil? == false
retval = self.error_box?.contains?(self.geographic_item.geo_object)
end
retval
end

def chk_err_geo_item_inside_err_radius
# case 3
retval = true
if error_radius.nil? == false && error_geographic_item.nil? == false
retval = self.error_box?.contains?(error_geographic_item.geo_object)
end
retval
end

def chk_error_radius_inside_area
# case 4
retval = true
unless collecting_event.nil?
if error_radius.nil? == false && collecting_event.geographic_area.nil? == false
retval = collecting_event.geographic_area.geo_object.contains?(error_box?)
end
end
retval
end

def chk_error_geo_item_inside_area
# case 5
retval = true
unless collecting_event.nil?
if error_geographic_item.nil? == false && collecting_event.geographic_area.nil? == false
retval = collecting_event.geographic_area.default_geographic_item.contains?(error_geographic_item)
end
end
retval
end

def chk_obj_inside_area
# case 6
retval = true
unless collecting_event.nil?
unless collecting_event.geographic_area.nil?
retval = collecting_event.geographic_area.geo_object.contains?(geographic_item.geo_object)
end
end
retval
end

def proper_data_is_provided
retval = true
#case
Expand All @@ -128,6 +193,39 @@ def proper_data_is_provided
#unless error_geographic_item.nil?
# errors.add(:error_geographic_item, 'error_geographic_item must contain geographic_item.') unless error_geographic_item.geo_object.contains?(geographic_item.geo_object)
#end
unless chk_obj_inside_err_geo_item
errors.add(:error_geographic_item, 'error_geographic_item must contain geographic_item.')
retval = false
end
unless chk_obj_inside_err_radius
errors.add(:error_radius, 'error_radius must contain geographic_item.')
retval = false
end
unless chk_err_geo_item_inside_err_radius
problem = 'error_radius must contain error_geographic_item.'
errors.add(:error_radius, problem)
errors.add(:error_geographic_item, problem)
retval = false
end
unless chk_error_radius_inside_area
problem = 'collecting_event area must contain error_radius bounding box.'
errors.add(:error_radius, problem)
errors.add(:collecting_event, problem)
retval = false
end
unless chk_error_geo_item_inside_area
problem = 'collecting_event area must contain error_geographic_item.'
errors.add(:error_geographic_item, problem)
errors.add(:collecting_event, problem)
retval = false
end
unless chk_obj_inside_area
problem = 'collecting_event area must contain geographic_item.'
errors.add(:geographic_item, problem)
errors.add(:collecting_event, problem)
retval = false
end

retval
end

Expand Down
56 changes: 53 additions & 3 deletions spec/models/georeference_spec.rb
Expand Up @@ -49,6 +49,7 @@
@area_d = GeographicItem.new(polygon: BOX_4)
@g_a = GeographicArea.new(name: 'Box_4',
data_origin: 'Test Data',
neID: 'TD-000',
parent: FactoryGirl.build(:earth_geographic_area),
ne_geo_item: @area_d)

Expand All @@ -60,7 +61,7 @@
@point10n = GeographicItem.new(point: RSPEC_GEO_FACTORY.point(0, 10))
@c_e = CollectingEvent.new(geographic_area: @g_a,
verbatim_locality: 'Test Event',
minimum_elevation: 0.0,
minimum_elevation: 0.1,
verbatim_latitude: '0.1',
verbatim_longitude: '0.1')

Expand All @@ -77,6 +78,7 @@
specify '#error_radius is < some Earth-based limit' do
# 12,400 miles, 20,000 km
#pending 'setting error radius to some reasonable distance'
georeference.valid?
expect(georeference.save).to be_false # many other reasons
expect(georeference.errors.keys.include?(:error_radius)).to be_true

Expand All @@ -98,6 +100,51 @@

end

specify 'errors which result from badly formed error_geographic_item values' do
georeference = Georeference::VerbatimData.new(collecting_event: @c_e,
error_geographic_item: GeographicItem.new(polygon: POLY_E1))
georeference.save
expect(georeference.errors.keys.include?(:error_geographic_item)).to be_true
expect(georeference.errors.keys.include?(:collecting_event)).to be_true

end

specify 'errors which result from badly formed error_radius values' do
georeference = Georeference::VerbatimData.new(collecting_event: @c_e,
error_radius: 16000,
error_geographic_item: @e_g_i)
georeference.save
expect(georeference.errors.keys.include?(:error_geographic_item)).to be_true
expect(georeference.errors.keys.include?(:error_radius)).to be_true

end

specify 'errors which result from badly formed collecting_event area values and error_geographic_item' do
@area_d = GeographicItem.new(polygon: POLY_E1)
@g_a.ne_geo_item = @area_d
georeference = Georeference::VerbatimData.new(collecting_event: @c_e,
error_geographic_item: @e_g_i)
expect(@c_e.geographic_area.default_geographic_item.save).to be_true
georeference.save
expect(georeference.errors.keys.include?(:error_geographic_item)).to be_true
expect(georeference.errors.keys.include?(:geographic_item)).to be_true
expect(georeference.errors.keys.include?(:collecting_event)).to be_true

end

specify 'errors which result from badly formed collecting_event area values and error_radius' do
@area_d = GeographicItem.new(polygon: POLY_E1)
@g_a.ne_geo_item = @area_d
georeference = Georeference::VerbatimData.new(collecting_event: @c_e,
error_radius: 160000)
expect(@c_e.geographic_area.default_geographic_item.save).to be_true
georeference.save
expect(georeference.errors.keys.include?(:error_radius)).to be_true
expect(georeference.errors.keys.include?(:geographic_item)).to be_true
expect(georeference.errors.keys.include?(:collecting_event)).to be_true

end

specify 'error_geographic_item.geo_object, when provided, should contain geographic_item.geo_object' do
# case 1
# GeoRef A (POINT0)
Expand All @@ -112,15 +159,18 @@
expect(georeference.error_geographic_item.contains?(georeference.geographic_item)).to be_true
end

specify '.error_box with error_radius returns a square which can be searched for contained objects' do
specify '.error_box with error_radius returns a square' do
# case 2a - radius
georeference = Georeference::VerbatimData.new(collecting_event: @c_e,
error_radius: 160000)
# TODO: Figure out why the save of the georeference does not propagate down to the geographic_item which is part of the geographic_area.
# here, we make sure the geographic_item gets saved.
expect(@c_e.geographic_area.default_geographic_item.save).to be_true
georeference.save
expect(georeference.error_box?.to_s).to eq('POLYGON ((-1.337304454772868 -1.3469896879975283 0.0, 1.537304454772868 -1.3469896879975283 0.0, 1.537304454772868 1.5469896879975282 0.0, -1.337304454772868 1.5469896879975282 0.0, -1.337304454772868 -1.3469896879975283 0.0))')
end

specify '.error_box with error_geographic_item returns a shape which can be searched for contained objects' do
specify '.error_box with error_geographic_item returns a shape' do
# case 2a - error geo_item
@e_g_i.save
georeference = Georeference::VerbatimData.new(collecting_event: @c_e,
Expand Down

0 comments on commit 9cf35a6

Please sign in to comment.