Class: Georeference::VerbatimData
- Inherits:
-
Georeference
- Object
- Georeference
- Georeference::VerbatimData
- Defined in:
- app/models/georeference/verbatim_data.rb
Overview
The Georeference that is derived exclusively from verbatim_latitude/longitude and fields in a CollectingEvent.
While it might be concievable that verbatim data are WKT shapes not points, we assume they are for now.
!! TODO: presently does not include verbatim_geolocation_uncertainty translation into radius !! See https://github.com/SpeciesFileGroup/taxonworks/issues/1770
Constant Summary collapse
- GEO_AREA_TOLERANCE =
Meters. Maximum allowed distance to consider geographic area valid.Exif
10000.0
Instance Method Summary collapse
-
#add_obj_inside_area ⇒ Boolean
True iff collecting_event contains georeference geographic_item.
-
#check_obj_within_distance_from_area(distance) ⇒ Boolean
True if geographic_item.geo_object is within
distanceof collecting_event.geographic_area. - #dwc_georeference_attributes ⇒ Object
-
#initialize(params = {}) ⇒ VerbatimData
constructor
A new instance of VerbatimData.
Constructor Details
#initialize(params = {}) ⇒ VerbatimData
Returns a new instance of VerbatimData.
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'app/models/georeference/verbatim_data.rb', line 14 def initialize(params = {}) super unless collecting_event.nil? || geographic_item # value from collecting_event is normalised to meters z1 = collecting_event.minimum_elevation z2 = collecting_event.maximum_elevation if z1.blank? # no valid elevation provided delta_z = 0.0 else # we have at least half of the range data # delta_z = z1 if z2.blank? # we have *only* half of the range data delta_z = z1 else # we have full range data, so elevation is (top - bottom) / 2 delta_z = z1 + ((z2 - z1) * 0.5) end end point = collecting_event.verbatim_map_center(delta_z) # hmm attributes = {geography: point} attributes[:by] = self.by if self.by if point.nil? test_grs = [] else test_grs = GeographicItem # && is a fast indexed-bounding-box comparison .where('geography && ST_GeographyFromText(:wkt) AND ' \ 'geography = ST_GeographyFromText(:wkt)', wkt: "POINT(#{point.x} #{point.y} #{point.z})" ) end if test_grs.empty? test_grs = [GeographicItem.new(attributes)] end self.error_radius = collecting_event.geolocate_uncertainty_in_meters self.geographic_item = test_grs.first end end |
Instance Method Details
#add_obj_inside_area ⇒ Boolean
Returns true iff collecting_event contains georeference geographic_item.
94 95 96 97 98 99 100 101 102 103 |
# File 'app/models/georeference/verbatim_data.rb', line 94 def add_obj_inside_area unless check_obj_within_distance_from_area(GEO_AREA_TOLERANCE) errors.add( :geographic_item, 'for georeference is not contained in the geographic area bound to the collecting event') errors.add( :collecting_event, 'is assigned a geographic area which does not contain the supplied georeference/geographic item') end end |
#check_obj_within_distance_from_area(distance) ⇒ Boolean
Returns true if geographic_item.geo_object is within distance of
collecting_event.geographic_area.
80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'app/models/georeference/verbatim_data.rb', line 80 def check_obj_within_distance_from_area(distance) # case 6 retval = true if collecting_event.present? if geographic_item.present? && collecting_event.geographic_area.present? if geographic_item.geo_object && collecting_event.geographic_area.default_geographic_item.present? retval = geographic_item.st_distance_to_geographic_item(collecting_event.geographic_area.default_geographic_item) <= distance end end end retval end |
#dwc_georeference_attributes ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'app/models/georeference/verbatim_data.rb', line 62 def dwc_georeference_attributes h = {} super(h) h.merge!( verbatimLatitude: collecting_event.verbatim_latitude, verbatimLongitude: collecting_event.verbatim_longitude, coordinateUncertaintyInMeters: error_radius, georeferenceSources: 'Transcribed from verbatim label, field note, or published data.', georeferenceRemarks: "Derived from a instance of TaxonWorks' Georeference::VerbatimData.", geodeticDatum: nil # TODO: check ) h[:georeferenceProtocol] = 'A geospatial point translated from verbatim values recorded on human-readable media (e.g. paper specimen label, field notebook).' if h[:georeferenceProtocol].blank? h end |