Class: Georeference::VerbatimData

Inherits:
Georeference
  • Object
show all
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

Constructor Details

#initialize(params = {}) ⇒ VerbatimData

Returns a new instance of VerbatimData.

Parameters:

  • params (ActionController::Parameters) (defaults to: {})


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_areaBoolean

Returns true iff collecting_event contains georeference geographic_item.

Returns:

  • (Boolean)

    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.

Returns:

  • (Boolean)

    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_attributesObject



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