nasturtium 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/main.yml +19 -0
- data/.gitignore +10 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +53 -0
- data/LICENSE.txt +13 -0
- data/README.md +534 -0
- data/Rakefile +14 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/nasturtium/error.rb +24 -0
- data/lib/nasturtium/faraday.rb +75 -0
- data/lib/nasturtium/helpers/configuration.rb +26 -0
- data/lib/nasturtium/request.rb +329 -0
- data/lib/nasturtium/utils.rb +38 -0
- data/lib/nasturtium/version.rb +5 -0
- data/lib/nasturtium.rb +843 -0
- data/nasturtium.gemspec +56 -0
- metadata +215 -0
data/lib/nasturtium.rb
ADDED
@@ -0,0 +1,843 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "erb"
|
4
|
+
#require 'nokogiri'
|
5
|
+
require 'open-uri'
|
6
|
+
require_relative "nasturtium/error"
|
7
|
+
require_relative "nasturtium/version"
|
8
|
+
require_relative "nasturtium/request"
|
9
|
+
require "nasturtium/helpers/configuration"
|
10
|
+
require 'cgi'
|
11
|
+
|
12
|
+
module Nasturtium
|
13
|
+
extend Configuration
|
14
|
+
|
15
|
+
define_setting :base_url, "https://api.inaturalist.org/v1/"
|
16
|
+
define_setting :mailto, ENV["NASTURTIUM_API_EMAIL"]
|
17
|
+
|
18
|
+
# Get API token
|
19
|
+
# @param user [String]
|
20
|
+
# @param password [String]
|
21
|
+
# def self.api_token(user, password, verbose: false)
|
22
|
+
# doc = Nokogiri::HTML(URI.open('https://www.inaturalist.org/users/api_token'))
|
23
|
+
# csrf_token = CGI.escape(doc.at('meta[name="csrf-token"]')['content'])
|
24
|
+
|
25
|
+
# puts csrf_token
|
26
|
+
# # https://www.inaturalist.org/users/api_token
|
27
|
+
# body = "utf8=%E2%9C%93&authenticity_token=#{csrf_token}&user%5Bemail%5D=#{user}&user%5Bpassword%5D=#{password}&user%5Bremember_me%5D=0"
|
28
|
+
# endpoint = 'users/api_token'
|
29
|
+
# res = Request.new(method: 'POST', base_url: 'https://www.inaturalist.org/', endpoint: endpoint, body: body, verbose: verbose).perform
|
30
|
+
# puts res
|
31
|
+
# end
|
32
|
+
|
33
|
+
# Get controlled vocabulary terms
|
34
|
+
# @param taxon_id [String, nil] If set returns controlled terms for the taxon
|
35
|
+
#
|
36
|
+
# @param page [Integer, nil] The results page number
|
37
|
+
# @param per_page [Integer, nil] The results limit
|
38
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
39
|
+
#
|
40
|
+
# @return [Hash, Boolean] A hash of controlled terms results
|
41
|
+
def self.controlled_terms(taxon_id: nil, page: nil, per_page: nil, verbose: false)
|
42
|
+
if taxon_id.nil?
|
43
|
+
endpoint = 'controlled_terms'
|
44
|
+
else
|
45
|
+
endpoint = 'controlled_terms/for_taxon'
|
46
|
+
end
|
47
|
+
Request.new(endpoint: endpoint, taxon_id: taxon_id, page: page, per_page: per_page, verbose: verbose).perform
|
48
|
+
end
|
49
|
+
|
50
|
+
# Get identifications
|
51
|
+
# @param id [String, Integer, nil] An array of identification IDs
|
52
|
+
# @param current_taxon [Boolean, nil] The identification taxon is the same as its observation's taxon
|
53
|
+
# @param own_observation [Boolean, nil] The identification was added by th observer
|
54
|
+
# @param is_change [Boolean, nil] The identification was created as a result of a taxon change
|
55
|
+
# @param taxon_active [Boolean nil] The identification's taxon is currently an active taxon
|
56
|
+
# @param observation_taxon_active [Boolean, nil] The observation's taxon is currently an active taxon
|
57
|
+
# @param rank [String, nil] Filter by a comma-separated list of taxonomic ranks on the identification
|
58
|
+
# @param observation_rank [String, nil] Filter by a comma-separated list of taxonomic ranks on the observation
|
59
|
+
# @param user_id [String, Integer, nil] Filter by a comma-separated list of user IDs
|
60
|
+
# @param user_login [String, nil] Filter by a comma-separated list of user logins
|
61
|
+
# @param current [Boolean, nil] The most recent identification on an observation by a user
|
62
|
+
# @param category [String, nil] The type of identification (improving, supporting, leading)
|
63
|
+
# @param place_id [String, Integer, nil] Filter by a comma-separated list of place IDs
|
64
|
+
# @param quality_grade [String, nil] Filter by a comma-separated list of quality grades (casual, needs_id, research)
|
65
|
+
# @param taxon_id [String, Integer, nil] Filter by a comma-separated list of taxon IDs on the identification
|
66
|
+
# @param observation_taxon_id [String, Integer, nil] Filter by a comma-separated list of taxon IDs on the observation
|
67
|
+
# @param iconic_taxon_id [String, Integer, nil] Filter by a comma-separated list of iconic taxon IDs on the identification
|
68
|
+
# @param observation_iconic_taxon_id [String, Integer, nil] Filter by a comma-separated list of iconic taxon IDs on the observation
|
69
|
+
# @param rank_lowest [String, nil] The identification's taxon must have this rank or higher
|
70
|
+
# @param rank_highest [String, nil] The identification's taxon must have this rank or lower
|
71
|
+
# @param observation_rank_lowest [String, nil] The observation's taxon must have this rank or higher
|
72
|
+
# @param observation_rank_highest [String, nil] The observation's taxon must have this rank or lower
|
73
|
+
# @param without_taxon_id [String, Integer, nil] Exclude this comma-separated list of identification taxon IDs and their descendants
|
74
|
+
# @param without_observation_taxon_id [String, Integer, nil] Exclude this comma-separated list of observation taxon IDs and their descendants
|
75
|
+
# @param before [String, nil] Identified before this time (d2)
|
76
|
+
# @param after [String, nil] Identified after this time (d1)
|
77
|
+
# @param observation_created_before [String, nil] Observation record was created before this time (observation_created_d2)
|
78
|
+
# @param observation_created_after [String, nil] Observation record was created after this time (observation_created_d1)
|
79
|
+
# @param observed_before [String, nil] Observed before this time (observed_d2)
|
80
|
+
# @param observed_after [String, nil] Observed after this time (observed_d1)
|
81
|
+
# @param id_below [String, Integer, nil] The identification ID must be below the provided value
|
82
|
+
# @param id_above [String, Integer, nil] The identification ID must be above the provided value
|
83
|
+
# @param only_id [Boolean, nil] Only return record IDs
|
84
|
+
#
|
85
|
+
# @param order [String, nil] Ascending or descending sort order (asc, desc)
|
86
|
+
# @param order_by [String, nil] The parameter to sort by (created_at, id)
|
87
|
+
# @param page [Integer, nil] The results page number
|
88
|
+
# @param per_page [Integer, nil] The results limit
|
89
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
90
|
+
#
|
91
|
+
# @return [Hash, Boolean] A hash of identification results
|
92
|
+
def self.identifications(id: nil, current_taxon: nil, own_observation: nil, is_change: nil,
|
93
|
+
taxon_active: nil, observation_taxon_active: nil, rank: nil, observation_rank: nil,
|
94
|
+
user_id: nil, user_login: nil, current: nil, category: nil, place_id: nil,
|
95
|
+
quality_grade: nil, taxon_id: nil, observation_taxon_id: nil, iconic_taxon_id: nil,
|
96
|
+
observation_iconic_taxon_id: nil, rank_lowest: nil, rank_highest: nil,
|
97
|
+
observation_rank_lowest: nil, observation_rank_highest: nil, without_taxon_id: nil,
|
98
|
+
without_observation_taxon_id: nil, before: nil, after: nil,
|
99
|
+
observation_created_before: nil, observation_created_after: nil, observed_before: nil,
|
100
|
+
observed_after: nil, id_below: nil, id_above: nil, only_id: nil, order: nil, order_by: nil,
|
101
|
+
page: nil, per_page: nil, verbose: false)
|
102
|
+
endpoint = 'identifications'
|
103
|
+
Request.new(endpoint: endpoint,
|
104
|
+
id: id,
|
105
|
+
current_taxon: current_taxon,
|
106
|
+
own_observation: own_observation,
|
107
|
+
is_change: is_change,
|
108
|
+
taxon_active: taxon_active,
|
109
|
+
observation_taxon_active: observation_taxon_active,
|
110
|
+
rank: rank,
|
111
|
+
observation_rank: observation_rank,
|
112
|
+
user_id: user_id,
|
113
|
+
user_login: user_login,
|
114
|
+
current: current,
|
115
|
+
category: category,
|
116
|
+
place_id: place_id,
|
117
|
+
quality_grade: quality_grade,
|
118
|
+
taxon_id: taxon_id,
|
119
|
+
observation_taxon_id: observation_taxon_id,
|
120
|
+
iconic_taxon_id: iconic_taxon_id,
|
121
|
+
observation_iconic_taxon_id: observation_iconic_taxon_id,
|
122
|
+
rank_lowest: rank_lowest,
|
123
|
+
rank_highest: rank_highest,
|
124
|
+
observation_rank_lowest: observation_rank_lowest,
|
125
|
+
observation_rank_highest: observation_rank_highest,
|
126
|
+
without_taxon_id: without_taxon_id,
|
127
|
+
without_observation_taxon_id: without_observation_taxon_id,
|
128
|
+
before: before,
|
129
|
+
after: after,
|
130
|
+
observation_created_before: observation_created_before,
|
131
|
+
observation_created_after: observation_created_after,
|
132
|
+
observed_before: observed_before,
|
133
|
+
observed_after: observed_after,
|
134
|
+
id_below: id_below,
|
135
|
+
id_above: id_above,
|
136
|
+
only_id: only_id,
|
137
|
+
order: order,
|
138
|
+
order_by: order_by,
|
139
|
+
page: page,
|
140
|
+
per_page: per_page,
|
141
|
+
verbose: verbose).perform
|
142
|
+
end
|
143
|
+
|
144
|
+
# Get map tiling assets for observations
|
145
|
+
#
|
146
|
+
# Mapping-specific parameters:
|
147
|
+
# @param asset_type [String] The type of asset to return [colored_heatmap, grid, heatmap, points, places, taxon_places, taxon_ranges]
|
148
|
+
# @param return_json [Boolean] Whether to return UTFGRid (only use with asset_types: colored_heatmap, grid, heatmap, points)
|
149
|
+
# @param color [String, nil] A color to use in map creation (e.g., blue, #0000ff)
|
150
|
+
# @param style [String, nil] The map tile style (geotilegrid, possibly others)
|
151
|
+
# @param tile_size [Integer, nil] The map tile size in pixels
|
152
|
+
#
|
153
|
+
# All of the parameters for filtering observations are also available:
|
154
|
+
# @param q [String, nil] An observation properties search query
|
155
|
+
# @param search_on [String, nil] Observation properties to search on (names, tags, description, place)
|
156
|
+
# @param id [String, Integer, nil] A comma-separated list of observation IDs
|
157
|
+
# @param not_id [String, Integer, nil] A comma-separated list of observation IDs that must not be included
|
158
|
+
# @param acc [Boolean, nil] Filter by whether the positional accuracy/coordinate uncertainty was specified
|
159
|
+
# @param captive [Boolean, nil] Filter on whether it was captive/cultivated observations
|
160
|
+
# @param endemic [Boolean, nil] Filter on whether observations were of taxa endemic to their location
|
161
|
+
# @param geo [Boolean, nil] Filter to only georeferenced observations
|
162
|
+
# @param identified [Boolean, nil] Filter to only observations with community identifications
|
163
|
+
# @param introduced [Boolean, nil] Filter to observations of taxa that were introduced to their location
|
164
|
+
# @param mappable [Boolean, nil] Filter to only observations that show on map tiles
|
165
|
+
# @param native [Boolean, nil] Filter to only observations of taxa native tot heir location
|
166
|
+
# @param out_of_range [Boolean, nil] Filter to only observations made in locations outside the taxon's known ranges
|
167
|
+
# @param pcid [Boolean, nil] Filter to observations identified by a curator of a project
|
168
|
+
# @param photos [Boolean, nil] Filter to observations with photos
|
169
|
+
# @param popular [Boolean, nil] Filter to only observations that have been favorited by at least 1 user
|
170
|
+
# @param sounds [Boolean, nil] Filter to observations with sounds
|
171
|
+
# @param taxon_is_active [Boolean, nil] Filter to observations of active taxon concepts
|
172
|
+
# @param threatened [Boolean, nil] Filter to observations of taxa that are threatened at their location
|
173
|
+
# @param verifiable [Boolean, nil] Filter by observations with a quality_grade=needs_id,research
|
174
|
+
# @param licensed [Boolean, nil] Filter by observations with a license
|
175
|
+
# @param photo_licensed [Boolean, nil] License attribute of at least one photo in an observation must not be nil
|
176
|
+
# @param license [String, nil] Filter by a comma-separated list of licenses (cc-by,cc-by-nc,cc-by-nd,cc-by-sa,cc-by-nc-nd,cc-by-nc-sa,cc0)
|
177
|
+
# @param photo_license [String, nil] Filter by a comma-separated list of photo licenses (cc-by,cc-by-nc,cc-by-nd,cc-by-sa,cc-by-nc-nd,cc-by-nc-sa,cc0)
|
178
|
+
# @param sound_license [String, nil] Filter by a comma-separated list of sound licenses (cc-by,cc-by-nc,cc-by-nd,cc-by-sa,cc-by-nc-nd,cc-by-nc-sa,cc0)
|
179
|
+
# @param ofv_datatype [String, nil] Filter by a comma-separated list of datatypes that the observation must include # TODO: does it take arrays?
|
180
|
+
# @param place_id [String, Integer, nil] Filter by a comma-separated list of place_ids
|
181
|
+
# @param project_id [String, Integer, nil] Filter by a comma-separated list of project_ids
|
182
|
+
# @param rank [String, nil] Filter by an array of taxon ranks
|
183
|
+
# @param site_id [String, Integer, nil] Filter by a comma-separated list of site_ids
|
184
|
+
# @param taxon_id [String, Integer, nil] Filter by a comma-separated list of taxon_ids and their descendants
|
185
|
+
# @param without_taxon_id [String, Integer, nil] Exclude a comma-separated list of taxon_ids and their descendants
|
186
|
+
# @param taxon_name [String, Integer, nil] Filter by a comma-separated list of scientific or common names
|
187
|
+
# @param user_id [String, Integer nil] Filter by observations made by a comma-separated list of user_ids
|
188
|
+
# @param user_login [String, nil] Filter by a comma-separated list of user_logins
|
189
|
+
# @param ident_user_id [String, Integer, nil] Filter by observations identified by a particular user_id
|
190
|
+
# @param day [String, Integer, nil] Filter on a comma-separated list of days
|
191
|
+
# @param month [String, Integer, nil] Filter on a comma-separated list of months
|
192
|
+
# @param year [String, Integer, nil] Filter on a comma-separated list of years
|
193
|
+
# @param term_id [String, Integer, nil] Filter on a comma-separated list of term_ids
|
194
|
+
# @param without_term_id String, Integer, nil] Exclude on a comma-separated list of term_ids
|
195
|
+
# @param term_value_id [String, Integer, nil] Filter on annotations made with this controlled value ID; must be used with term_id
|
196
|
+
# @param without_term_value_id [String, Integer, nil] Exclude on annotations made with this controlled value ID
|
197
|
+
# @param acc_above [String, nil] Positional accuracy must be above value
|
198
|
+
# @param acc_below [String, nil] Positional accuracy must be below value
|
199
|
+
# @param acc_below_or_unknown [String, nil] Positional accuracy must be below value or unknown
|
200
|
+
# @param before [String, nil] Must have been observed on or before this date (d2)
|
201
|
+
# @param after [String, nil] Must have been observed on or after this date (d1)
|
202
|
+
# @param observed_on [String, nil] Must have been observed on this date
|
203
|
+
# @param created_before [String, nil] Must have been created on or before this date (created_d2)
|
204
|
+
# @param created_on [String, nil] Must have been created on this date
|
205
|
+
# @param created_after [String, nil] Must have been created on or before this date (created_d1)
|
206
|
+
# @param unobserved_by_user_id [String, nil] Taxon must be unobserved by the provided user_id
|
207
|
+
# @param apply_project_rules_for [String, nil] Must match rules of the provided project_id
|
208
|
+
# @param conservation_status [String, nil] Taxon must have this conservation status (cs) code, use with place_id to make location-specific
|
209
|
+
# @param conservation_status_authority [String, nil] Taxon must have the conservation status from the provided authority (csa), use with place_id to make location-specific
|
210
|
+
# @param conservation_status_iucn [String, nil] Taxon must have the provided conservation status from the IUCN, use with place_id to make location-specific
|
211
|
+
# @param geoprivacy [String, nil] Filter by a comma-separated list of geoprivacy settings (obscured, obscured_private, open)
|
212
|
+
# @param taxon_geoprivacy [String, nil] Filter by a comma-separated list of geoprivacy settings (obscured, obscured_private, open) of the most conservative geoprivacy associated with one of the taxa proposed in the current identifications
|
213
|
+
# @param rank_lowest [String, nil] Taxon rank must be less than or equal to provided rank
|
214
|
+
# @param rank_highest [String, nil] Taxon rank must be greater than or equal to provided rank
|
215
|
+
# @param iconic_taxa [String, nil] Filter by taxa with the provided iconic taxon (Actinopterygii, Animalia, Amphibia, Arachnida, Aves, Chromista, Fungi, Insecta, Mammalia, Mollusca, Repitilia, Plantae, Protozoa, unknown)
|
216
|
+
# @param id_below [String, Integer, nil] Most have an observation ID below the provided value
|
217
|
+
# @param id_above [String, Integer, nil] Most have an observation ID above the provided value
|
218
|
+
# @param identifications [String, nil] Filter by identifications status (most_agree, some_agree, most_disagree)
|
219
|
+
# @param latitude [Double, nil] Filter by observations within a {radius} kilometer circle around the provided latitude coordinate (lat)
|
220
|
+
# @param longitude [Double, nil] Filter by observations within a {radius} kilometer circle around the provided longitude coordinate (lng)
|
221
|
+
# @param radius [String, Integer, Double] Filter by observations within the provided radius in kilometers
|
222
|
+
# @param ne_latitude [Double, nil] Filter by observations within provided (nelat) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
223
|
+
# @param ne_longitude [Double, nil] Filter by observations within provided (nelng) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
224
|
+
# @param sw_latitude [Double, nil] Filter by observations within provided (swlat) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
225
|
+
# @param sw_longitude [Double, nil] Filter by observations within provided (swlng) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
226
|
+
# @param list_id [Integer, nil] Taxon must bin the list with the provided ID
|
227
|
+
# @param not_in_project [String, nil] Observation must not be in the provided project_id or slug
|
228
|
+
# @param not_matching_project_rules_for [String, nil] Must not match the rules of the provided project_id or slug
|
229
|
+
# @param quality_grade [String, nil] Filter by observation quality grade (casual, needs_id, research)
|
230
|
+
# @param updated_since [String, nil] Filter by observations updated since the provided time
|
231
|
+
# @param reviewed [Boolean, nil] Observations have been reviewed by viewer_id
|
232
|
+
# @param viewer_id [String, nil] Use with reviewed boolean to filter by observations reviewed by the provided viewer_id
|
233
|
+
# @param locale [String, nil] Locale preference for taxon common names (e.g., en-US)
|
234
|
+
# @param preferred_place_id [Integer, nil] Place of preference for regional taxon common names
|
235
|
+
# @param ttl [String, Integer, nil] Set the Cache-Control HTTP header with a max-age value to cache the request on iNaturalist serers and within the client
|
236
|
+
# @param only_id [Boolean, nil] Only return record IDs
|
237
|
+
#
|
238
|
+
# @return [Binary, Hash] Returns binary png images of map tiles unless return_json is true
|
239
|
+
def self.mapping(asset_type, zoom_level, x, y, return_json: false, color: nil, style: nil, tile_size: nil,
|
240
|
+
q: nil, search_on: nil, id: nil, not_id: nil, acc: nil, captive: nil,
|
241
|
+
endemic: nil, geo: nil, identified: nil, introduced: nil, mappable: nil, native: nil,
|
242
|
+
out_of_range: nil, pcid: nil, photos: nil, popular: nil, sounds: nil, taxon_is_active: nil,
|
243
|
+
threatened: nil, verifiable: nil, licensed: nil, photo_licensed: nil,
|
244
|
+
photo_license: nil, sound_license: nil, ofv_datatype: nil, place_id: nil, project_id: nil,
|
245
|
+
rank: nil, site_id: nil, taxon_id: nil, without_taxon_id: nil, taxon_name: nil, user_id: nil,
|
246
|
+
user_login: nil, ident_user_id: nil, day: nil, month: nil, year: nil, term_id: nil,
|
247
|
+
without_term_id: nil, term_value_id: nil, without_term_value_id: nil, acc_below: nil,
|
248
|
+
acc_below_or_unknown: nil, acc_above: nil, before: nil, observed_on: nil,
|
249
|
+
after: nil, created_before: nil, created_on: nil, created_after: nil,
|
250
|
+
unobserved_by_user_id: nil, apply_project_rules_for: nil, conservation_status: nil,
|
251
|
+
conservation_status_authority: nil, conservation_status_iucn: nil, geoprivacy: nil,
|
252
|
+
taxon_geoprivacy: nil, rank_lowest: nil, rank_highest: nil, iconic_taxa: nil,
|
253
|
+
id_below: nil, id_above: nil, identifications: nil, latitude: nil, longitude: nil,
|
254
|
+
radius: nil, ne_latitude: nil, ne_longitude: nil, sw_latitude: nil, sw_longitude: nil,
|
255
|
+
list_id: nil, not_in_project: nil, not_matching_project_rules_for: nil, quality_grade: nil,
|
256
|
+
updated_since: nil, viewer_id: nil, reviewed: nil, locale: nil, preferred_place_id: nil,
|
257
|
+
only_id: nil, ttl: nil, order: nil, order_by: nil, page: nil, per_page: nil, headers: false,
|
258
|
+
verbose: false)
|
259
|
+
|
260
|
+
if !color.nil? and color.include? '#'
|
261
|
+
color = color.gsub('#', '%23')
|
262
|
+
end
|
263
|
+
|
264
|
+
endpoint = ''
|
265
|
+
if ['colored_heatmap', 'grid', 'heatmap', 'points'].include? asset_type
|
266
|
+
if return_json
|
267
|
+
endpoint = "#{asset_type}/#{zoom_level}/#{x}/#{y}.grid.json"
|
268
|
+
else
|
269
|
+
endpoint = "#{asset_type}/#{zoom_level}/#{x}/#{y}.png"
|
270
|
+
end
|
271
|
+
elsif asset_type == 'places'
|
272
|
+
endpoint = "places/#{place_id}/#{zoom_level}/#{x}/#{y}.png"
|
273
|
+
if place_id.nil?
|
274
|
+
raise "place_id must be provided"
|
275
|
+
end
|
276
|
+
elsif asset_type == 'taxon_places'
|
277
|
+
endpoint = "taxon_places/#{taxon_id}/#{zoom_level}/#{x}/#{y}.png"
|
278
|
+
if taxon_id.nil?
|
279
|
+
raise "taxon_id must be provided"
|
280
|
+
end
|
281
|
+
elsif asset_type == 'taxon_ranges'
|
282
|
+
endpoint = "taxon_ranges/#{taxon_id}/#{zoom_level}/#{x}/#{y}.png"
|
283
|
+
if taxon_id.nil?
|
284
|
+
raise "taxon_id must be provided"
|
285
|
+
end
|
286
|
+
else
|
287
|
+
raise "Invalid asset_type: #{asset_type} (must be one of: colored_heatmap, grid, heatmap, points, places, taxon_places, taxon_ranges)"
|
288
|
+
end
|
289
|
+
|
290
|
+
Request.new(endpoint: endpoint,
|
291
|
+
color: color,
|
292
|
+
style: style,
|
293
|
+
tile_size: tile_size,
|
294
|
+
q: q,
|
295
|
+
search_on: search_on,
|
296
|
+
id: id,
|
297
|
+
not_id: not_id,
|
298
|
+
acc: acc,
|
299
|
+
captive: captive,
|
300
|
+
endemic: endemic,
|
301
|
+
geo: geo,
|
302
|
+
identified: identified,
|
303
|
+
introduced: introduced,
|
304
|
+
mappable: mappable,
|
305
|
+
native: native,
|
306
|
+
out_of_range: out_of_range,
|
307
|
+
pcid: pcid,
|
308
|
+
photos: photos,
|
309
|
+
popular: popular,
|
310
|
+
sounds: sounds,
|
311
|
+
taxon_is_active: taxon_is_active,
|
312
|
+
threatened: threatened,
|
313
|
+
verifiable: verifiable,
|
314
|
+
licensed: licensed,
|
315
|
+
photo_licensed: photo_licensed,
|
316
|
+
photo_license: photo_license,
|
317
|
+
sound_license: sound_license,
|
318
|
+
ofv_datatype: ofv_datatype,
|
319
|
+
place_id: place_id,
|
320
|
+
project_id: project_id,
|
321
|
+
rank: rank,
|
322
|
+
site_id: site_id,
|
323
|
+
taxon_id: taxon_id,
|
324
|
+
without_taxon_id: without_taxon_id,
|
325
|
+
taxon_name: taxon_name,
|
326
|
+
user_id: user_id,
|
327
|
+
user_login: user_login,
|
328
|
+
ident_user_id: ident_user_id,
|
329
|
+
day: day,
|
330
|
+
month: month,
|
331
|
+
year: year,
|
332
|
+
term_id: term_id,
|
333
|
+
without_term_id: without_term_id,
|
334
|
+
term_value_id: term_value_id,
|
335
|
+
without_term_value_id: without_term_value_id,
|
336
|
+
acc_below: acc_below,
|
337
|
+
acc_below_or_unknown: acc_below_or_unknown,
|
338
|
+
acc_above: acc_above,
|
339
|
+
before: before,
|
340
|
+
observed_on: observed_on,
|
341
|
+
after: after,
|
342
|
+
created_before: created_before,
|
343
|
+
created_on: created_on,
|
344
|
+
created_after: created_after,
|
345
|
+
unobserved_by_user_id: unobserved_by_user_id,
|
346
|
+
apply_project_rules_for: apply_project_rules_for,
|
347
|
+
conservation_status: conservation_status,
|
348
|
+
conservation_status_authority: conservation_status_authority,
|
349
|
+
conservation_status_iucn: conservation_status_iucn,
|
350
|
+
geoprivacy: geoprivacy,
|
351
|
+
taxon_geoprivacy: taxon_geoprivacy,
|
352
|
+
rank_lowest: rank_lowest,
|
353
|
+
rank_highest: rank_highest,
|
354
|
+
iconic_taxa: iconic_taxa,
|
355
|
+
id_below: id_below,
|
356
|
+
id_above: id_above,
|
357
|
+
identifications: identifications,
|
358
|
+
latitude: latitude,
|
359
|
+
longitude: longitude,
|
360
|
+
radius: radius,
|
361
|
+
ne_latitude: ne_latitude,
|
362
|
+
ne_longitude: ne_longitude,
|
363
|
+
sw_latitude: sw_latitude,
|
364
|
+
sw_longitude: sw_longitude,
|
365
|
+
list_id: list_id,
|
366
|
+
not_in_project: not_in_project,
|
367
|
+
not_matching_project_rules_for: not_matching_project_rules_for,
|
368
|
+
quality_grade: quality_grade,
|
369
|
+
updated_since: updated_since,
|
370
|
+
viewer_id: viewer_id,
|
371
|
+
reviewed: reviewed,
|
372
|
+
locale: locale,
|
373
|
+
preferred_place_id: preferred_place_id,
|
374
|
+
only_id: only_id,
|
375
|
+
ttl: ttl,
|
376
|
+
order: order,
|
377
|
+
order_by: order_by,
|
378
|
+
page: page,
|
379
|
+
per_page: per_page,
|
380
|
+
headers: headers,
|
381
|
+
verbose: verbose).perform
|
382
|
+
end
|
383
|
+
|
384
|
+
|
385
|
+
# Get places
|
386
|
+
# @param id [String, Integer] A comma-separated list of place IDs
|
387
|
+
# @param admin_level [String, Integer, nil] A comma-separated list of admin levels (-10: continent, 0: country, 10: state, 20: county, 30: town, 100: park)
|
388
|
+
#
|
389
|
+
# @return [Hash, Boolean] A hash with places results
|
390
|
+
def self.places_id(id, admin_level: nil, verbose: false)
|
391
|
+
endpoint = "places/#{id}"
|
392
|
+
Request.new(endpoint: endpoint, admin_level: admin_level, verbose: verbose).perform
|
393
|
+
end
|
394
|
+
|
395
|
+
# Suggest places
|
396
|
+
# @param q [String] A place name must start with this query
|
397
|
+
#
|
398
|
+
# @param order_by [String, nil] The parameter to sort by (area) # TODO: iNaturalist bug? doesn't seem to affect sorting in the API?
|
399
|
+
# @param per_page [Integer, nil] The results limit
|
400
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
401
|
+
#
|
402
|
+
# @return [Hash, Boolean] A hash with suggest places results
|
403
|
+
def self.places_autocomplete(q, order_by: nil, per_page: nil, verbose: false)
|
404
|
+
endpoint = "places/autocomplete"
|
405
|
+
Request.new(endpoint: endpoint, q: q, order_by: order_by, per_page: per_page, verbose: verbose).perform
|
406
|
+
end
|
407
|
+
|
408
|
+
# https://api.inaturalist.org/v1/places/nearby?nelat=40.346036&nelng=-87.951568&swlat=39.935393&swlng=-88.628846
|
409
|
+
# Get nearby places
|
410
|
+
# @param ne_latitude [Double, nil] Get nearby places within provided (nelat) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
411
|
+
# @param ne_longitude [Double, nil] Get nearby places within provided (nelng) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
412
|
+
# @param sw_latitude [Double, nil] Get nearby places within provided (swlat) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
413
|
+
# @param sw_longitude [Double, nil] Get nearby places within provided (swlng) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
414
|
+
# @param name [String, nil] Place name must match this value # TODO: iNaturalist bug? you can't provide the last word of a name (e.g., River Bend Forest works, but River Bend Forest Preserve doesn't work)
|
415
|
+
#
|
416
|
+
# @param per_page [Integer, nil] The results limit
|
417
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
418
|
+
#
|
419
|
+
# @return [Hash, Boolean] A hash with suggest places results
|
420
|
+
def self.places_nearby(ne_latitude, ne_longitude, sw_latitude, sw_longitude, name: nil, verbose: false)
|
421
|
+
endpoint = "places/nearby"
|
422
|
+
Request.new(endpoint: endpoint, ne_latitude: ne_latitude, ne_longitude: ne_longitude, sw_latitude: sw_latitude, sw_longitude: sw_longitude, name: name, verbose: verbose).perform
|
423
|
+
end
|
424
|
+
|
425
|
+
|
426
|
+
# Get journal posts
|
427
|
+
# @param login [String, nil] Filter by user login
|
428
|
+
# @param project_id [String, Integer, nil] Filter by project ID
|
429
|
+
# @param parent_id [String, Integer, nil] Filter by parent ID
|
430
|
+
#
|
431
|
+
# @param page [String, Integer, nil]
|
432
|
+
# @param per_page [String, Integer, nil]
|
433
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
434
|
+
#
|
435
|
+
# @return [Array, Boolean] An array of journal posts
|
436
|
+
def self.posts(login: nil, project_id: nil, parent_id: nil, page: nil, per_page: nil, verbose: false)
|
437
|
+
endpoint = "posts"
|
438
|
+
Request.new(endpoint: endpoint, login: login, project_id: project_id, parent_id: parent_id, page: page, per_page: per_page, verbose: verbose).perform
|
439
|
+
end
|
440
|
+
|
441
|
+
# TODO: Add tests
|
442
|
+
# Get projects
|
443
|
+
# @param q [String, nil] Project name must begin with query string
|
444
|
+
# @param autocomplete [Boolean, nil] Returns projects that start with the search q
|
445
|
+
# @param id [String, Integer, nil] Project must have this ID
|
446
|
+
# @param not_id [String, Integer, nil] Project must not have this ID
|
447
|
+
# @param latitude [Double, nil] Filter by projects within a {radius} kilometer circle around the provided latitude coordinate (lat)
|
448
|
+
# @param longitude [Double, nil] Filter by projects within a {radius} kilometer circle around the provided longitude coordinate (lng)
|
449
|
+
# @param radius [String, Integer, Double] Filter by projects within the provided radius in kilometers
|
450
|
+
# @param place_id [String, Integer, nil] Filter by a comma-separated list of place_ids
|
451
|
+
# @param featured [Boolean, nil] Filter by marked featured for the relevant site
|
452
|
+
# @param noteworthy [Boolean, nil] Filter by marked noteworthy for the relevant site
|
453
|
+
# @param site_id [String, Integer, nil] The site ID that applies to featured and noteworthy, defaults to site of the authenticated user or the main iNaturalist site
|
454
|
+
# @param rule_details [Boolean, nil] Return more details about the project rules
|
455
|
+
# @param type [String, nil] Filter by project type [collection, umbrella]
|
456
|
+
# @param member_id [String, Integer, nil] Filter by projects that include a user ID
|
457
|
+
# @param has_params [Boolean, nil] Must have search parameter requirements
|
458
|
+
# @param has_posts [Boolean, nil] Project must have posts
|
459
|
+
#
|
460
|
+
# @param page [Integer, nil] The results page number
|
461
|
+
# @param per_page [Integer, nil] The results limit
|
462
|
+
# @param order_by [String, nil] The parameter to sort by (observed_on, species_guess, votes, id, created_at)
|
463
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
464
|
+
#
|
465
|
+
# @return [Hash, Boolean] A hash with search results
|
466
|
+
def self.projects(q: nil, autocomplete: nil, id: nil, not_id: nil, latitude: nil, longitude: nil, radius: nil, place_id: nil, featured: nil, noteworthy: nil, site_id: nil, rule_details: nil, type: nil, member_id: nil, has_params: nil, has_posts: nil, page: nil, per_page: nil, order_by: nil, verbose: false)
|
467
|
+
if autocomplete
|
468
|
+
endpoint = "projects/autocomplete"
|
469
|
+
else
|
470
|
+
endpoint = "projects"
|
471
|
+
end
|
472
|
+
Request.new(endpoint: endpoint, q: q, id: id, not_id: not_id, latitude: latitude, longitude: longitude, radius: radius, place_id: place_id, featured: featured, noteworthy: noteworthy, site_id: site_id, rule_details: rule_details, type: type, member_id: member_id, has_params: has_params, has_posts: has_posts, page: page, per_page: per_page, order_by: order_by, verbose: verbose).perform
|
473
|
+
end
|
474
|
+
|
475
|
+
# Get project members
|
476
|
+
# @param id [String, Integer] The project ID
|
477
|
+
#
|
478
|
+
# @param page [Integer, nil] The results page number
|
479
|
+
# @param per_page [Integer, nil] The results limit
|
480
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
481
|
+
#
|
482
|
+
# @return [Hash, Boolean] A hash with search results
|
483
|
+
def self.project_members(id, page: nil, per_page: nil, verbose: false)
|
484
|
+
endpoint = "projects/#{id}/members"
|
485
|
+
Request.new(endpoint: endpoint, page: page, per_page: per_page, verbose: verbose).perform
|
486
|
+
end
|
487
|
+
|
488
|
+
# Search places, projects, taxa, users
|
489
|
+
# @param q [String, nil] A search query
|
490
|
+
# @param sources [String, nil] Type of record to search (places, projects, taxa, users)
|
491
|
+
# @param place_id [String, nil] Filter to an array of place_ids (TODO: place_id is an array in the documentation but doesn't seem to work even with their example?)
|
492
|
+
# @param preferred_place_id [Integer, nil] Place of preference for regional taxon common names
|
493
|
+
# @param locale [String, nil] Locale preference for taxon common names (e.g., en-US)
|
494
|
+
#
|
495
|
+
# @param page [Integer, nil] The results page number
|
496
|
+
# @param per_page [Integer, nil] The results limit
|
497
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
498
|
+
#
|
499
|
+
# @return [Hash, Boolean] A hash with search results
|
500
|
+
def self.search(q: nil, sources: nil, place_id: nil, preferred_place_id: nil, locale: nil, page: nil, per_page: nil,
|
501
|
+
verbose: false)
|
502
|
+
endpoint = 'search'
|
503
|
+
Request.new(
|
504
|
+
endpoint: endpoint,
|
505
|
+
q: q,
|
506
|
+
sources: sources,
|
507
|
+
place_id: place_id,
|
508
|
+
preferred_place_id: preferred_place_id,
|
509
|
+
locale: locale,
|
510
|
+
page: page,
|
511
|
+
per_page: per_page,
|
512
|
+
verbose: verbose
|
513
|
+
).perform
|
514
|
+
end
|
515
|
+
|
516
|
+
# Get user
|
517
|
+
# @param id [Integer] The user ID
|
518
|
+
#
|
519
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
520
|
+
#
|
521
|
+
# @return [Hash, Boolean] A hash with user results
|
522
|
+
def self.user(id, verbose: false)
|
523
|
+
endpoint = "users/#{id}"
|
524
|
+
Request.new(endpoint: endpoint, verbose: verbose).perform
|
525
|
+
end
|
526
|
+
|
527
|
+
# Get logged in user
|
528
|
+
# @param id [Integer] The user ID
|
529
|
+
#
|
530
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
531
|
+
#
|
532
|
+
# @return [Hash, Boolean] A hash with user results
|
533
|
+
def self.user_me(verbose: false)
|
534
|
+
endpoint = "users/me"
|
535
|
+
Request.new(endpoint: endpoint, verbose: verbose).perform
|
536
|
+
end
|
537
|
+
|
538
|
+
# Get user's projects
|
539
|
+
# @param id [Integer] The user ID
|
540
|
+
# @param rule_details [Boolean, nil] Return more details about project rules
|
541
|
+
# @param project_type [String, nil] Filter by project type (collection, contest, traditional, umbrella)
|
542
|
+
#
|
543
|
+
# @param page [Integer, nil] The results page number
|
544
|
+
# @param per_page [Integer, nil] The results limit
|
545
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
546
|
+
#
|
547
|
+
# @return [Hash, Boolean] A hash with user results
|
548
|
+
def self.user_projects(id, rule_details: nil, project_type: nil, page: nil, per_page: nil, verbose: false)
|
549
|
+
endpoint = "users/#{id}/projects"
|
550
|
+
Request.new(endpoint: endpoint, rule_details: rule_details, project_type: project_type,
|
551
|
+
page: page, per_page: per_page, verbose: verbose).perform
|
552
|
+
end
|
553
|
+
|
554
|
+
# Get user suggestions
|
555
|
+
# @param q [String] The username must begin with this query
|
556
|
+
# @param project_id [Integer, nil] Only show members of this project ID
|
557
|
+
#
|
558
|
+
# @param per_page [Integer, nil] The results limit
|
559
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
560
|
+
#
|
561
|
+
# @return [Hash, Boolean] A hash with user results
|
562
|
+
def self.user_autocomplete(q, project_id: nil, per_page: nil, verbose: false)
|
563
|
+
endpoint = "users/autocomplete"
|
564
|
+
Request.new(endpoint: endpoint, q: q, project_id: project_id, per_page: per_page, verbose: verbose).perform
|
565
|
+
end
|
566
|
+
|
567
|
+
# TODO: iNatualist API documentation does not include sound_license?
|
568
|
+
|
569
|
+
# Get observations
|
570
|
+
#
|
571
|
+
# Note: use the subresource parameter to access these subresource endpoints which share the same parameters as /observations:
|
572
|
+
# /observations/histogram
|
573
|
+
# /observations/identifiers
|
574
|
+
# /observations/observers
|
575
|
+
# /observations/popular_field_values
|
576
|
+
# /observations/species_counts
|
577
|
+
#
|
578
|
+
# @param subresource [String, nil] Access a subresource endpoint of observations (histogram, identifiers, observers, popular_field_values, species_counts)
|
579
|
+
#
|
580
|
+
# @param q [String, nil] An observation properties search query
|
581
|
+
# @param search_on [String, nil] Observation properties to search on (names, tags, description, place)
|
582
|
+
# @param id [String, Integer, nil] A comma-separated list of observation IDs
|
583
|
+
# @param not_id [String, Integer, nil] A comma-separated list of observation IDs that must not be included
|
584
|
+
# @param acc [Boolean, nil] Filter by whether the positional accuracy/coordinate uncertainty was specified
|
585
|
+
# @param captive [Boolean, nil] Filter on whether it was captive/cultivated observations
|
586
|
+
# @param endemic [Boolean, nil] Filter on whether observations were of taxa endemic to their location
|
587
|
+
# @param geo [Boolean, nil] Filter to only georeferenced observations
|
588
|
+
# @param identified [Boolean, nil] Filter to only observations with community identifications
|
589
|
+
# @param introduced [Boolean, nil] Filter to observations of taxa that were introduced to their location
|
590
|
+
# @param mappable [Boolean, nil] Filter to only observations that show on map tiles
|
591
|
+
# @param native [Boolean, nil] Filter to only observations of taxa native tot heir location
|
592
|
+
# @param out_of_range [Boolean, nil] Filter to only observations made in locations outside the taxon's known ranges
|
593
|
+
# @param pcid [Boolean, nil] Filter to observations identified by a curator of a project
|
594
|
+
# @param photos [Boolean, nil] Filter to observations with photos
|
595
|
+
# @param popular [Boolean, nil] Filter to only observations that have been favorited by at least 1 user
|
596
|
+
# @param sounds [Boolean, nil] Filter to observations with sounds
|
597
|
+
# @param taxon_is_active [Boolean, nil] Filter to observations of active taxon concepts
|
598
|
+
# @param threatened [Boolean, nil] Filter to observations of taxa that are threatened at their location
|
599
|
+
# @param verifiable [Boolean, nil] Filter by observations with a quality_grade=needs_id,research
|
600
|
+
# @param licensed [Boolean, nil] Filter by observations with a license
|
601
|
+
# @param photo_licensed [Boolean, nil] License attribute of at least one photo in an observation must not be nil
|
602
|
+
# @param license [String, nil] Filter by a comma-separated list of licenses (cc-by,cc-by-nc,cc-by-nd,cc-by-sa,cc-by-nc-nd,cc-by-nc-sa,cc0)
|
603
|
+
# @param photo_license [String, nil] Filter by a comma-separated list of photo licenses (cc-by,cc-by-nc,cc-by-nd,cc-by-sa,cc-by-nc-nd,cc-by-nc-sa,cc0)
|
604
|
+
# @param sound_license [String, nil] Filter by a comma-separated list of sound licenses (cc-by,cc-by-nc,cc-by-nd,cc-by-sa,cc-by-nc-nd,cc-by-nc-sa,cc0)
|
605
|
+
# @param ofv_datatype [String, nil] Filter by a comma-separated list of datatypes that the observation must include # TODO: does it take arrays?
|
606
|
+
# @param place_id [String, Integer, nil] Filter by a comma-separated list of place_ids
|
607
|
+
# @param project_id [String, Integer, nil] Filter by a comma-separated list of project_ids
|
608
|
+
# @param rank [String, nil] Filter by an array of taxon ranks
|
609
|
+
# @param site_id [String, Integer, nil] Filter by a comma-separated list of site_ids
|
610
|
+
# @param taxon_id [String, Integer, nil] Filter by a comma-separated list of taxon_ids and their descendants
|
611
|
+
# @param without_taxon_id [String, Integer, nil] Exclude a comma-separated list of taxon_ids and their descendants
|
612
|
+
# @param taxon_name [String, Integer, nil] Filter by a comma-separated list of scientific or common names
|
613
|
+
# @param user_id [String, Integer nil] Filter by observations made by a comma-separated list of user_ids
|
614
|
+
# @param user_login [String, nil] Filter by a comma-separated list of user_logins
|
615
|
+
# @param ident_user_id [String, Integer, nil] Filter by observations identified by a particular user_id
|
616
|
+
# @param day [String, Integer, nil] Filter on a comma-separated list of days
|
617
|
+
# @param month [String, Integer, nil] Filter on a comma-separated list of months
|
618
|
+
# @param year [String, Integer, nil] Filter on a comma-separated list of years
|
619
|
+
# @param term_id [String, Integer, nil] Filter on a comma-separated list of term_ids
|
620
|
+
# @param without_term_id String, Integer, nil] Exclude on a comma-separated list of term_ids
|
621
|
+
# @param term_value_id [String, Integer, nil] Filter on annotations made with this controlled value ID; must be used with term_id
|
622
|
+
# @param without_term_value_id [String, Integer, nil] Exclude on annotations made with this controlled value ID
|
623
|
+
# @param acc_above [String, nil] Positional accuracy must be above value
|
624
|
+
# @param acc_below [String, nil] Positional accuracy must be below value
|
625
|
+
# @param acc_below_or_unknown [String, nil] Positional accuracy must be below value or unknown
|
626
|
+
# @param before [String, nil] Must have been observed on or before this date (d2)
|
627
|
+
# @param after [String, nil] Must have been observed on or after this date (d1)
|
628
|
+
# @param observed_on [String, nil] Must have been observed on this date
|
629
|
+
# @param created_before [String, nil] Must have been created on or before this date (created_d2)
|
630
|
+
# @param created_on [String, nil] Must have been created on this date
|
631
|
+
# @param created_after [String, nil] Must have been created on or before this date (created_d1)
|
632
|
+
# @param unobserved_by_user_id [String, nil] Taxon must be unobserved by the provided user_id
|
633
|
+
# @param apply_project_rules_for [String, nil] Must match rules of the provided project_id
|
634
|
+
# @param conservation_status [String, nil] Taxon must have this conservation status (cs) code, use with place_id to make location-specific
|
635
|
+
# @param conservation_status_authority [String, nil] Taxon must have the conservation status from the provided authority (csa), use with place_id to make location-specific
|
636
|
+
# @param conservation_status_iucn [String, nil] Taxon must have the provided conservation status from the IUCN, use with place_id to make location-specific
|
637
|
+
# @param geoprivacy [String, nil] Filter by a comma-separated list of geoprivacy settings (obscured, obscured_private, open)
|
638
|
+
# @param taxon_geoprivacy [String, nil] Filter by a comma-separated list of geoprivacy settings (obscured, obscured_private, open) of the most conservative geoprivacy associated with one of the taxa proposed in the current identifications
|
639
|
+
# @param rank_lowest [String, nil] Taxon rank must be less than or equal to provided rank
|
640
|
+
# @param rank_highest [String, nil] Taxon rank must be greater than or equal to provided rank
|
641
|
+
# @param iconic_taxa [String, nil] Filter by taxa with the provided iconic taxon (Actinopterygii, Animalia, Amphibia, Arachnida, Aves, Chromista, Fungi, Insecta, Mammalia, Mollusca, Repitilia, Plantae, Protozoa, unknown)
|
642
|
+
# @param id_below [String, Integer, nil] Most have an observation ID below the provided value
|
643
|
+
# @param id_above [String, Integer, nil] Most have an observation ID above the provided value
|
644
|
+
# @param identifications [String, nil] Filter by identifications status (most_agree, some_agree, most_disagree)
|
645
|
+
# @param latitude [Double, nil] Filter by observations within a {radius} kilometer circle around the provided latitude coordinate (lat)
|
646
|
+
# @param longitude [Double, nil] Filter by observations within a {radius} kilometer circle around the provided longitude coordinate (lng)
|
647
|
+
# @param radius [String, Integer, Double] Filter by observations within the provided radius in kilometers
|
648
|
+
# @param ne_latitude [Double, nil] Filter by observations within provided (nelat) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
649
|
+
# @param ne_longitude [Double, nil] Filter by observations within provided (nelng) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
650
|
+
# @param sw_latitude [Double, nil] Filter by observations within provided (swlat) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
651
|
+
# @param sw_longitude [Double, nil] Filter by observations within provided (swlng) bounding box (ne_latitude, ne_longitude, sw_latitude, sw_longitude)
|
652
|
+
# @param list_id [Integer, nil] Taxon must bin the list with the provided ID
|
653
|
+
# @param not_in_project [String, nil] Observation must not be in the provided project_id or slug
|
654
|
+
# @param not_matching_project_rules_for [String, nil] Must not match the rules of the provided project_id or slug
|
655
|
+
# @param quality_grade [String, nil] Filter by observation quality grade (casual, needs_id, research)
|
656
|
+
# @param updated_since [String, nil] Filter by observations updated since the provided time
|
657
|
+
# @param reviewed [Boolean, nil] Observations have been reviewed by viewer_id
|
658
|
+
# @param viewer_id [String, nil] Use with reviewed boolean to filter by observations reviewed by the provided viewer_id
|
659
|
+
# @param locale [String, nil] Locale preference for taxon common names (e.g., en-US)
|
660
|
+
# @param preferred_place_id [Integer, nil] Place of preference for regional taxon common names
|
661
|
+
# @param ttl [String, Integer, nil] Set the Cache-Control HTTP header with a max-age value to cache the request on iNaturalist serers and within the client
|
662
|
+
# @param only_id [Boolean, nil] Only return record IDs
|
663
|
+
#
|
664
|
+
# @param order [String, nil] Ascending or descending sort order (asc, desc)
|
665
|
+
# @param order_by [String, nil] The parameter to sort by (observed_on, species_guess, votes, id, created_at)
|
666
|
+
# @param page [Integer, nil] The results page number
|
667
|
+
# @param per_page [Integer, nil] The results limit
|
668
|
+
# @param headers [Boolean] Return headers instead of body
|
669
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
670
|
+
#
|
671
|
+
# @return [Hash, Boolean] A hash with observation results
|
672
|
+
def self.observations(subresource: nil, q: nil, search_on: nil, id: nil, not_id: nil, acc: nil, captive: nil,
|
673
|
+
endemic: nil, geo: nil, identified: nil, introduced: nil, mappable: nil, native: nil,
|
674
|
+
out_of_range: nil, pcid: nil, photos: nil, popular: nil, sounds: nil, taxon_is_active: nil,
|
675
|
+
threatened: nil, verifiable: nil, licensed: nil, photo_licensed: nil,
|
676
|
+
photo_license: nil, sound_license: nil, ofv_datatype: nil, place_id: nil, project_id: nil,
|
677
|
+
rank: nil, site_id: nil, taxon_id: nil, without_taxon_id: nil, taxon_name: nil, user_id: nil,
|
678
|
+
user_login: nil, ident_user_id: nil, day: nil, month: nil, year: nil, term_id: nil,
|
679
|
+
without_term_id: nil, term_value_id: nil, without_term_value_id: nil, acc_below: nil,
|
680
|
+
acc_below_or_unknown: nil, acc_above: nil, before: nil, observed_on: nil,
|
681
|
+
after: nil, created_before: nil, created_on: nil, created_after: nil,
|
682
|
+
unobserved_by_user_id: nil, apply_project_rules_for: nil, conservation_status: nil,
|
683
|
+
conservation_status_authority: nil, conservation_status_iucn: nil, geoprivacy: nil,
|
684
|
+
taxon_geoprivacy: nil, rank_lowest: nil, rank_highest: nil, iconic_taxa: nil,
|
685
|
+
id_below: nil, id_above: nil, identifications: nil, latitude: nil, longitude: nil,
|
686
|
+
radius: nil, ne_latitude: nil, ne_longitude: nil, sw_latitude: nil, sw_longitude: nil,
|
687
|
+
list_id: nil, not_in_project: nil, not_matching_project_rules_for: nil, quality_grade: nil,
|
688
|
+
updated_since: nil, viewer_id: nil, reviewed: nil, locale: nil, preferred_place_id: nil,
|
689
|
+
only_id: nil, ttl: nil, order: nil, order_by: nil, page: nil, per_page: nil, headers: false,
|
690
|
+
verbose: false)
|
691
|
+
endpoint = 'observations'
|
692
|
+
endpoint = "#{endpoint}/#{subresource}" unless subresource.nil?
|
693
|
+
|
694
|
+
Request.new(endpoint: endpoint,
|
695
|
+
q: q,
|
696
|
+
search_on: search_on,
|
697
|
+
id: id,
|
698
|
+
not_id: not_id,
|
699
|
+
acc: acc,
|
700
|
+
captive: captive,
|
701
|
+
endemic: endemic,
|
702
|
+
geo: geo,
|
703
|
+
identified: identified,
|
704
|
+
introduced: introduced,
|
705
|
+
mappable: mappable,
|
706
|
+
native: native,
|
707
|
+
out_of_range: out_of_range,
|
708
|
+
pcid: pcid,
|
709
|
+
photos: photos,
|
710
|
+
popular: popular,
|
711
|
+
sounds: sounds,
|
712
|
+
taxon_is_active: taxon_is_active,
|
713
|
+
threatened: threatened,
|
714
|
+
verifiable: verifiable,
|
715
|
+
licensed: licensed,
|
716
|
+
photo_licensed: photo_licensed,
|
717
|
+
photo_license: photo_license,
|
718
|
+
sound_license: sound_license,
|
719
|
+
ofv_datatype: ofv_datatype,
|
720
|
+
place_id: place_id,
|
721
|
+
project_id: project_id,
|
722
|
+
rank: rank,
|
723
|
+
site_id: site_id,
|
724
|
+
taxon_id: taxon_id,
|
725
|
+
without_taxon_id: without_taxon_id,
|
726
|
+
taxon_name: taxon_name,
|
727
|
+
user_id: user_id,
|
728
|
+
user_login: user_login,
|
729
|
+
ident_user_id: ident_user_id,
|
730
|
+
day: day,
|
731
|
+
month: month,
|
732
|
+
year: year,
|
733
|
+
term_id: term_id,
|
734
|
+
without_term_id: without_term_id,
|
735
|
+
term_value_id: term_value_id,
|
736
|
+
without_term_value_id: without_term_value_id,
|
737
|
+
acc_below: acc_below,
|
738
|
+
acc_below_or_unknown: acc_below_or_unknown,
|
739
|
+
acc_above: acc_above,
|
740
|
+
before: before,
|
741
|
+
observed_on: observed_on,
|
742
|
+
after: after,
|
743
|
+
created_before: created_before,
|
744
|
+
created_on: created_on,
|
745
|
+
created_after: created_after,
|
746
|
+
unobserved_by_user_id: unobserved_by_user_id,
|
747
|
+
apply_project_rules_for: apply_project_rules_for,
|
748
|
+
conservation_status: conservation_status,
|
749
|
+
conservation_status_authority: conservation_status_authority,
|
750
|
+
conservation_status_iucn: conservation_status_iucn,
|
751
|
+
geoprivacy: geoprivacy,
|
752
|
+
taxon_geoprivacy: taxon_geoprivacy,
|
753
|
+
rank_lowest: rank_lowest,
|
754
|
+
rank_highest: rank_highest,
|
755
|
+
iconic_taxa: iconic_taxa,
|
756
|
+
id_below: id_below,
|
757
|
+
id_above: id_above,
|
758
|
+
identifications: identifications,
|
759
|
+
latitude: latitude,
|
760
|
+
longitude: longitude,
|
761
|
+
radius: radius,
|
762
|
+
ne_latitude: ne_latitude,
|
763
|
+
ne_longitude: ne_longitude,
|
764
|
+
sw_latitude: sw_latitude,
|
765
|
+
sw_longitude: sw_longitude,
|
766
|
+
list_id: list_id,
|
767
|
+
not_in_project: not_in_project,
|
768
|
+
not_matching_project_rules_for: not_matching_project_rules_for,
|
769
|
+
quality_grade: quality_grade,
|
770
|
+
updated_since: updated_since,
|
771
|
+
viewer_id: viewer_id,
|
772
|
+
reviewed: reviewed,
|
773
|
+
locale: locale,
|
774
|
+
preferred_place_id: preferred_place_id,
|
775
|
+
only_id: only_id,
|
776
|
+
ttl: ttl,
|
777
|
+
order: order,
|
778
|
+
order_by: order_by,
|
779
|
+
page: page,
|
780
|
+
per_page: per_page,
|
781
|
+
headers: headers,
|
782
|
+
verbose: verbose).perform
|
783
|
+
end
|
784
|
+
|
785
|
+
# Taxon search
|
786
|
+
# @param id [String, Integer, nil] A taxon ID or comma-separated array of taxon IDs
|
787
|
+
# @param q [String, nil] A search query
|
788
|
+
# @param is_active [Boolean, nil] Filter to taxa with active taxon concepts
|
789
|
+
# @param taxon_id [String, Integer, nil] Filter by a comma-separated array of taxon_ids
|
790
|
+
# @param parent_id [Integer, nil] Filter by a taxon parent_id
|
791
|
+
# @param rank [String, nil] Filter by an array of taxon ranks
|
792
|
+
# @param rank_level [Integer, nil] Filter by taxon rank level (e.g., 70 for kingdom)
|
793
|
+
# @param id_above [Integer, nil] ID must be greater than value
|
794
|
+
# @param id_below [Integer, nil] ID must be below value
|
795
|
+
# @param preferred_place_id [Integer, nil] Place of preference for regional taxon common names
|
796
|
+
# @param locale [String, nil] Locale preference for taxon common names (e.g., en-US)
|
797
|
+
# @param only_id [Boolean, nil] Only return record IDs
|
798
|
+
# @param all_names [Boolean, nil] Include all taxon names in the response
|
799
|
+
#
|
800
|
+
# @param order [String, nil] Ascending or descending sort order (asc, desc)
|
801
|
+
# @param order_by [String, nil] The parameter to sort by
|
802
|
+
# @param page [Integer, nil] The results page number
|
803
|
+
# @param per_page [Integer, nil] The results limit
|
804
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
805
|
+
#
|
806
|
+
# @return [Hash, Boolean] A hash with search results
|
807
|
+
def self.taxa(id: nil, q: nil, is_active: nil, taxon_id: nil, parent_id: nil, rank: nil, rank_level: nil,
|
808
|
+
id_above: nil, id_below: nil, locale: nil, only_id: nil, all_names: nil, preferred_place_id: nil,
|
809
|
+
order: nil, order_by: nil, page: nil, per_page: nil, verbose: false)
|
810
|
+
if id.nil?
|
811
|
+
endpoint = 'taxa'
|
812
|
+
Request.new(endpoint: endpoint, q: q, is_active: is_active, taxon_id: taxon_id, parent_id: parent_id, rank: rank,
|
813
|
+
rank_level: rank_level, id_above: id_above, id_below: id_below, locale: locale, only_id: only_id,
|
814
|
+
all_names: all_names, preferred_place_id: preferred_place_id, order: order, order_by: order_by,
|
815
|
+
page: page, per_page: per_page, verbose: verbose).perform
|
816
|
+
else
|
817
|
+
endpoint = "taxa/#{id}"
|
818
|
+
Request.new(endpoint: endpoint, verbose: verbose).perform
|
819
|
+
end
|
820
|
+
end
|
821
|
+
|
822
|
+
# Taxon suggest
|
823
|
+
# @param q [String, nil] A suggest query
|
824
|
+
# @param is_active [Boolean, nil] Suggest only taxa with active taxon concepts
|
825
|
+
# @param taxon_id [String, nil] Filter by comma-separated taxon IDs
|
826
|
+
# @param rank [String, nil] Filter by an array of taxon ranks
|
827
|
+
# @param rank_level [Integer, nil] Filter by taxon rank level (e.g., 70 for kingdom)
|
828
|
+
# @param locale [String, nil] Locale preference for taxon common names (e.g., en-US)
|
829
|
+
# @param preferred_place_id [Integer, nil] Place of preference for regional taxon common names
|
830
|
+
# @param all_names [Boolean, nil] Include all taxon names in the response
|
831
|
+
#
|
832
|
+
# @param per_page [Integer, nil] The results limit
|
833
|
+
# @param verbose [Boolean] Print headers to STDOUT
|
834
|
+
#
|
835
|
+
# @return [Hash, Boolean] A hash with search results
|
836
|
+
def self.taxa_autocomplete(q: nil, is_active: nil, taxon_id: nil, rank: nil, rank_level: nil, locale: nil,
|
837
|
+
preferred_place_id: nil, all_names: nil, per_page: nil, verbose: false)
|
838
|
+
endpoint = 'taxa/autocomplete'
|
839
|
+
Request.new(endpoint: endpoint, q: q, is_active: is_active, taxon_id: taxon_id, rank: rank, rank_level: rank_level,
|
840
|
+
locale: locale, preferred_place_id: preferred_place_id, all_names: all_names, per_page: per_page,
|
841
|
+
verbose: verbose).perform
|
842
|
+
end
|
843
|
+
end
|