Class: Georeference::VerbatimData
- Inherits:
-
Georeference
- Object
- ActiveRecord::Base
- ApplicationRecord
- 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 github.com/SpeciesFileGroup/taxonworks/issues/1770
Constant Summary collapse
- GEO_AREA_TOLERANCE =
Meters. Maximum allowed distance to consider geographic area valid.Exif
10000.0
Constants included from SoftValidation
SoftValidation::ANCESTORS_WITH_SOFT_VALIDATIONS
Instance Attribute Summary
Attributes inherited from Georeference
#api_request, #collecting_event_id, #day_georeferenced, #error_depth, #error_geographic_item_id, #error_radius, #geographic_item_id, #iframe_response, #is_median_z, #is_public, #is_undefined_z, #month_georeferenced, #no_cached, #position, #project_id, #type, #year_georeferenced
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 ‘distance` of collecting_event.geographic_area.
- #dwc_georeference_attributes ⇒ Object
-
#initialize(params = {}) ⇒ VerbatimData
constructor
A new instance of VerbatimData.
Methods inherited from Georeference
#add_err_geo_item_inside_err_radius, #add_error_depth, #add_error_geo_item_inside_area, #add_error_geo_item_intersects_area, #add_error_radius, #add_error_radius_inside_area, #add_obj_inside_err_geo_item, #add_obj_inside_err_radius, batch_create_from_georeference_matcher, #check_err_geo_item_inside_err_radius, #check_error_geo_item_inside_area, #check_error_geo_item_intersects_area, #check_error_radius_inside_area, #check_obj_inside_area, #check_obj_inside_err_geo_item, #check_obj_inside_err_radius, #dwc_occurrences, #error_box, #error_radius_buffer_polygon, filter_by, #geographic_item_present_if_error_radius_provided, #heading, #latitude, #longitude, #method_name, #otus, point_type, #radius_from_error_shape, #round_error_radius, #set_cached, #set_cached_collecting_event, #set_geographic_item, #to_geo_json_feature, #to_simple_json_feature, with_geographic_area, with_locality, with_locality_as, with_locality_like, within_radius_of_item
Methods included from Shared::IsData
#errors_excepting, #full_error_messages_excepting, #identical, #is_community?, #is_destroyable?, #is_editable?, #is_in_use?, #is_in_users_projects?, #metamorphosize, #similar
Methods included from Shared::Confidences
Methods included from Shared::DataAttributes
#import_attributes, #internal_attributes, #keyword_value_hash, #reject_data_attributes
Methods included from Shared::Citations
#cited?, #mark_citations_for_destruction, #nomenclature_date, #origin_citation_source_id, #reject_citations, #requires_citation?, #sources_by_topic_id
Methods included from Shared::ProtocolRelationships
#machine_output?, #protocolled?, #reject_protocols
Methods included from Shared::Tags
#reject_tags, #tag_with, #tagged?, #tagged_with?
Methods included from Shared::Notes
#concatenated_notes_string, #reject_notes
Methods included from SoftValidation
#clear_soft_validations, #fix_for, #fix_soft_validations, #soft_fixed?, #soft_valid?, #soft_validate, #soft_validated?, #soft_validations, #soft_validators
Methods included from Housekeeping
#has_polymorphic_relationship?
Methods inherited from ApplicationRecord
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 61 62 63 64 |
# File 'app/models/georeference/verbatim_data.rb', line 14 def initialize(params = {}) super self.is_median_z = false self.is_undefined_z = false # and delta_z is zero, or ignored 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 self.is_undefined_z = true 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) # and show calculated median self.is_median_z = true 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.points .where('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.
98 99 100 101 102 103 104 105 106 107 |
# File 'app/models/georeference/verbatim_data.rb', line 98 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.
84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'app/models/georeference/verbatim_data.rb', line 84 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
66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'app/models/georeference/verbatim_data.rb', line 66 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 |