diff --git a/Gemfile.lock b/Gemfile.lock index 67fb21c..ac4065c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -6,7 +6,7 @@ GEM minitest (~> 5.1) tzinfo (~> 1.1) zeitwerk (~> 2.2, >= 2.2.2) - addressable (2.7.0) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) coffee-script (2.4.1) coffee-script-source @@ -15,7 +15,7 @@ GEM colorator (1.1.0) commonmarker (0.17.13) ruby-enum (~> 0.5) - concurrent-ruby (1.1.8) + concurrent-ruby (1.1.9) dnsruby (1.61.5) simpleidn (~> 0.1) em-websocket (0.5.2) @@ -30,7 +30,7 @@ GEM multipart-post (>= 1.2, < 3) ruby2_keywords faraday-net_http (1.0.1) - ffi (1.14.2) + ffi (1.15.4) forwardable-extended (2.6.0) gemoji (3.0.1) github-pages (211) @@ -200,7 +200,7 @@ GEM kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) liquid (4.0.3) - listen (3.4.1) + listen (3.7.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) @@ -219,10 +219,10 @@ GEM forwardable-extended (~> 2.6) public_suffix (3.1.1) racc (1.5.2) - rb-fsevent (0.10.4) + rb-fsevent (0.11.0) rb-inotify (0.10.1) ffi (~> 1.0) - rexml (3.2.4) + rexml (3.2.5) rouge (3.26.0) ruby-enum (0.9.0) i18n diff --git a/_config.yaml b/_config.yaml index 42dde3c..886448a 100644 --- a/_config.yaml +++ b/_config.yaml @@ -32,11 +32,12 @@ github_username: tdwg/camtrap-dp # THEME SETTINGS theme: minima -remote_theme: peterdesmet/petridish +remote_theme: peterdesmet/petridish@2.0 colors: links: "#ca6500" # TDWG orange banner: "#617694" # TDWG blue footer: "#617694" # TDWG blue +font_serif: false # BUILD SETTINGS markdown: kramdown diff --git a/_layouts/profile.html b/_layouts/profile.html index 0664fd8..2f3da89 100644 --- a/_layouts/profile.html +++ b/_layouts/profile.html @@ -1,96 +1,92 @@ --- -layout: base +layout: default --- -
-
+{{ content }} - {{ content }} +{% assign profile_file = "camtrap-dp-profile" %} +{% assign properties1 = site.data[profile_file].allOf[1].properties %} +{% assign required1 = site.data[profile_file].allOf[1].required %} - {% assign profile_file = "camtrap-dp-profile" %} - {% assign properties1 = site.data[profile_file].allOf[1].properties %} - {% assign required1 = site.data[profile_file].allOf[1].required %} +

Source: {{ profile_file }}.json

-

Source: {{ profile_file }}.json

+{% for p1_raw in properties1 %} + {% assign p1_name = p1_raw[0] %} + {% assign p1 = p1_raw[1] %} + {% assign p1_id = p1_name | downcase | url_encode %} + +

+ {{ p1_name }} + {% if required1 contains p1_name %}*{% endif %} +

- {% for p1_raw in properties1 %} - {% assign p1_name = p1_raw[0] %} - {% assign p1 = p1_raw[1] %} - {% assign p1_id = p1_name | downcase | url_encode %} - -

- {{ p1_name }} - {% if required1 contains p1_name %}*{% endif %} -

+ {{ p1.description | markdownify }} - {{ p1.description | markdownify }} + {% if p1['skos:exactMatch'] %} +

Same as {{ p1['skos:exactMatch'] }}

+ {% elsif p1['skos:narrowMatch'] %} +

Narrower than {{ p1['skos:narrowMatch'] }}

+ {% elsif p1['skos:broadMatch'] %} +

Broader than {{ p1['skos:broadMatch'] }}

+ {% endif %} - {% if p1['skos:exactMatch'] %} -

Same as {{ p1['skos:exactMatch'] }}

- {% elsif p1['skos:narrowMatch'] %} -

Narrower than {{ p1['skos:narrowMatch'] }}

- {% elsif p1['skos:broadMatch'] %} -

Broader than {{ p1['skos:broadMatch'] }}

- {% endif %} + {% if p1.properties %} + {% assign properties2 = p1.properties %} + {% assign required2 = p1.required %} + {% elsif p1.items.properties %} + {% assign properties2 = p1.items.properties %} + {% assign required2 = p1.items.required %} + {% else %} + {% assign properties2 = false %} + {% endif %} - {% if p1.properties %} - {% assign properties2 = p1.properties %} - {% assign required2 = p1.required %} - {% elsif p1.items.properties %} - {% assign properties2 = p1.items.properties %} - {% assign required2 = p1.items.required %} - {% else %} - {% assign properties2 = false %} - {% endif %} + {% if properties2 %} + + + + + + + + + + + + + + + {% for p2_raw in properties2 %} + {% assign p2_name = p2_raw[0] %} + {% assign p2 = p2_raw[1] %} + {% assign p2_id = p2_name | downcase | url_encode %} - {% if properties2 %} -
NameDefinitionType
- - - - + + + - - - - - - - - {% for p2_raw in properties2 %} - {% assign p2_name = p2_raw[0] %} - {% assign p2 = p2_raw[1] %} - {% assign p2_id = p2_name | downcase | url_encode %} - - - - - - - {% endfor %} - -
NameDefinitionType + {{ p2_name }} + {% if required2 contains p2_name %}*{% endif %} + + {{ p2.description | markdownify }} + {% if p2.const or p2.enum or p2.items.enum %} + Constraints +
    + {% if p2.const %}
  • const: {{ p2.const }}
  • {% endif %} + {% if p2.enum %}
  • enum: {{ p2.enum | join: ", " }}
  • {% endif %} + {% if p2.items.enum %}
  • enum: {{ p2.items.enum | join: ", " }}
  • {% endif %} +
+ {% endif %} + {% if p2['skos:exactMatch'] %} + Same as {{ p2['skos:exactMatch'] }} + {% elsif p2['skos:narrowMatch'] %} + Narrower than {{ p2['skos:narrowMatch'] }} + {% elsif p2['skos:broadMatch'] %} + Broader than {{ p2['skos:broadMatch'] }} + {% endif %} +
{{ p2.type }}
- {{ p2_name }} - {% if required2 contains p2_name %}*{% endif %} - - {{ p2.description | markdownify }} - {% if p2.enum %} -
    - {% for item in p2.enum %} -
  • {{ item }}
  • - {% endfor %} -
- {% endif %} - {% if p2['skos:exactMatch'] %} - Same as {{ p2['skos:exactMatch'] }} - {% elsif p2['skos:narrowMatch'] %} - Narrower than {{ p2['skos:narrowMatch'] }} - {% elsif p2['skos:broadMatch'] %} - Broader than {{ p2['skos:broadMatch'] }} - {% endif %} -
{{ p2.type }}
- {% endif %} - {% endfor %} -
-
+ {% endfor %} + + + {% endif %} +{% endfor %} diff --git a/_layouts/tables.html b/_layouts/tables.html index 738a482..e672e30 100644 --- a/_layouts/tables.html +++ b/_layouts/tables.html @@ -41,19 +41,11 @@

{{ table_schema.title }}

{{ field.description | markdownify }} - {% if field.constraints.enum %} - - {% endif %} {% if field.constraints %} + Constraints {% endif %} diff --git a/camtrap-dp-profile.json b/camtrap-dp-profile.json index a7852e0..2a01eda 100644 --- a/camtrap-dp-profile.json +++ b/camtrap-dp-profile.json @@ -5,7 +5,7 @@ "type": "object", "$defs": { "version": { - "pattern": "0\\.3" + "pattern": "0\\.4" } }, "allOf": [ @@ -23,30 +23,8 @@ "taxonomic" ], "properties": { - "profile": { - "description": "URL of the used Camtrap DP Profile version (e.g. `https://raw.githubusercontent.com/tdwg/camtrap-dp/1.0/camtrap-dp-profile.json`).", - "format": "uri" - }, - "licenses": { - "description": "[Licenses](https://specs.frictionlessdata.io/data-package/#licenses) under which the Data Package is published. If provided, requires at least a license for the content of the Data Package and one for the media files referenced in `media.csv` (see `scope`).", - "minItems": 2, - "items": { - "required": [ - "scope" - ], - "properties": { - "scope": { - "description": "Scope of the license. `data` applies to the content of the Data Package (`datapackage.json` and related CSV files), `media` applies to the media files (locally or externally hosted) referenced via `filePath` in the `media` resource.", - "enum": [ - "data", - "media" - ] - } - } - } - }, "resources": { - "description": "An `array` of Tabular Data Resource objects, each compliant with the [Tabular Data Resource](https://specs.frictionlessdata.io/tabular-data-resource/) specification.", + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#resource-information). Camtrap DP further requires each object to be a [Tabular Data Resource](https://specs.frictionlessdata.io/tabular-data-resource/) with a specific `name` and `schema`. See [Data](../data) for the requirements for those resources.", "minItems": 3, "maxItems": 3, "items": { @@ -56,7 +34,7 @@ ], "properties": { "name": { - "description": "Identifier for the resource. Allowed names are `deployments`, `media` and `observations` (see [Data](../data/)).", + "description": "Identifier of the resource.", "enum": [ "deployments", "media", @@ -85,51 +63,83 @@ } } }, - "organizations": { - "description": "List of organizations related to the Data Package.", - "type": "array", + "profile": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#profile). Camtrap DP further requires this to be the URL of the used Camtrap DP Profile version (e.g. `https://raw.githubusercontent.com/tdwg/camtrap-dp/1.0/camtrap-dp-profile.json`).", + "format": "uri" + }, + "name": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#name)." + }, + "id": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#id)." + }, + "created": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#created). Camtrap DP makes this a required property." + }, + "title": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#title). Not to be confused with the title of the project that originated the package (`package.project.title`)." + }, + "contributors": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#contributors). Camtrap DP makes this a required property. Can include people and organizations." + }, + "description": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#description). Not to be confused with the description of the project that originated the package (`package.project.description`)." + }, + "version": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#version)." + }, + "keywords": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#keywords)." + }, + "image": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#image)." + }, + "homepage": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#homepage)." + }, + "sources": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#sources). Can include the data management platform from which the package was derived (e.g. Agouti, Trapper, Wildlife Insights).", + "items": { + "properties": { + "version": { + "description": "Version of the source.", + "type": "string" + } + } + } + }, + "licenses": { + "description": "See [Data Package specification](https://specs.frictionlessdata.io/data-package/#licenses). If provided, Camtrap DP further requires at least a license for the content of the package and one for the media files.", + "minItems": 2, "items": { - "type": "object", "required": [ - "title", - "path" + "scope" ], "properties": { - "title": { - "description": "Organization name.", - "type": "string" - }, - "path": { - "description": "Organization website.", - "type": "string", - "format": "uri" - }, - "email": { - "description": "Organization contact email.", + "scope": { + "description": "Scope of the license. `data` applies to the content of the package and resources, `media` to the (locally or externally hosted) media files referenced in `media.filePath`.", "type": "string", - "format": "email" + "enum": [ + "data", + "media" + ] } } } }, - "rightsHolder": { - "description": "Person or organization owning the rights over the Data Package.", - "type": "string", - "skos:exactMatch": "http://ns.adobe.com/xap/1.0/rights/Owner" - }, "bibliographicCitation": { - "description": "Bibliographic/recommended citation for the Data Package.", - "type": "string", - "skos:exactMatch": "http://purl.org/dc/terms/bibliographicCitation" + "description": "Bibliographic/recommended citation for the package.", + "skos:exactMatch": "http://purl.org/dc/terms/bibliographicCitation", + "type": "string" }, "project": { - "description": "Camera trap project that generated the data in the Data Package.", + "description": "Camera trap project or study that originated the package.", "type": "object", "required": [ "title", "samplingDesign", "captureMethod", - "animalTypes", + "individualAnimals", "classificationLevel", "sequenceInterval" ], @@ -139,7 +149,7 @@ "type": "string" }, "title": { - "description": "Title of the project.", + "description": "Title of the project. Not to be confused with the title of the package (`package.title`).", "type": "string" }, "acronym": { @@ -147,7 +157,7 @@ "type": "string" }, "description": { - "description": "Description of the project, ideally expressed in Markdown format. To describe the Data Package itself, use .", + "description": "Description of the project, ideally [Markdown](http://commonmark.org/) formatted. Not to be confused with the description of the package (`package.description`).", "type": "string" }, "path": { @@ -168,7 +178,7 @@ ] }, "captureMethod": { - "description": "Method(s) used to capture media files.", + "description": "Method(s) used to capture the media files.", "type": "array", "items": { "type": "string", @@ -180,49 +190,40 @@ "uniqueItems": true, "minItems": 1 }, - "animalTypes": { - "description": "Type of observed animals. `marked` indicates specific animal individuals can be recognized.", - "type": "array", - "items": { - "type": "string", - "enum": [ - "unmarked", - "marked" - ] - }, - "uniqueItems": true, - "minItems": 1 + "individualAnimals": { + "description": "`true` if the project includes marked or recognizable individuals. See also `observations.individualID`.", + "type": "boolean" }, "classificationLevel": { + "description": "Information about a focal level of the classification process. `sequence`: classifications (i.e. rows in the `observations` resource) are provided at a sequence level (multiple media files can be part of one sequence); `media`: classifications are available for each single media file.", "type": "string", - "description": "Information about a focal level of the classification process. `sequence`: classifications (i.e. rows in `observations.csv` table) are provided at a sequence level (multiple media files can be part of one sequence); `media`: classifications are available for each single media file.", "enum": [ "sequence", "media" ] }, "sequenceInterval": { - "description": "Maximum number of seconds between timestamps of successive media files to be considered part of a single sequence and be assigned the same `sequenceID`.", + "description": "Maximum number of seconds between timestamps of successive media files to be considered part of a single sequence and be assigned the same `media.sequenceID`.", "type": "integer" - }, - "references": { - "description": "List of references related to the project (e.g. references cited in the project description). References ideally include a DOI.", - "type": "array", - "items": { - "type": "string" - } } } }, + "coordinatePrecision": { + "description": "Minimum precision of the `deployments.latitude` and `deployments.longitude` (e.g. `0.001` for a minimum precision of 0.001 degree). Especially relevant when coordinates are rounded to protect sensitive species.", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/coordinatePrecision", + "type": "number", + "example": 0.001 + }, "spatial": { - "description": "Spatial coverage for the Data Package expressed as GeoJSON.", - "$ref": "http://json.schemastore.org/geojson.json", - "skos:exactMatch": "http://purl.org/dc/terms/spatial" + "description": "Spatial coverage of the package, expressed as GeoJSON.", + "skos:exactMatch": "http://purl.org/dc/terms/spatial", + "type": "object", + "$ref": "http://json.schemastore.org/geojson.json" }, "temporal": { - "description": "Temporal coverage for the Data Package, based on the included deployments.", - "type": "object", + "description": "Temporal coverage of the package.", "skos:exactMatch": "http://purl.org/dc/terms/temporal", + "type": "object", "required": [ "start", "end" @@ -241,7 +242,7 @@ } }, "taxonomic": { - "description": "List of taxa as the taxonomic coverage for the Data Package. Based on the unique `scientificName` values in `observations.csv` table.", + "description": "Taxonomic coverage of the package, based on the unique `observations.scientificName`.", "type": "array", "items": { "type": "object", @@ -253,27 +254,26 @@ "properties": { "taxonID": { "description": "Unique identifier of the taxon according to the taxonomic reference list defined by `taxonIDReference`.", - "example": "QLXL", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/taxonID", "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/taxonID" + "example": "QLXL" }, "taxonIDReference": { "description": "URL of the source (reference list) of the `taxonID`.", - "example": "https://www.catalogueoflife.org", "type": "string", - "format": "uri" + "format": "uri", + "example": "https://www.catalogueoflife.org" }, "scientificName": { "description": "Scientific name of the taxon.", - "example": "Canis lupus", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/scientificName", "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/scientificName" + "example": "Canis lupus" }, "taxonRank": { "description": "Taxonomic rank of the scientific name.", - "example": "species", - "type": "string", "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/taxonRank", + "type": "string", "enum": [ "kingdom", "phylum", @@ -283,82 +283,187 @@ "genus", "species", "subspecies" - ] + ], + "example": "species" }, "kingdom": { "description": "Kingdom in which the taxon is classified.", - "example": "Animalia", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/kingdom", "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/kingdom" + "example": "Animalia" }, "phylum": { "description": "Phylum or division in which the taxon is classified", - "example": "Chordata", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/phylum", "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/phylum" + "example": "Chordata" }, "class": { "description": "Class in which the taxon is classified.", - "example": "Mammalia", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/class", "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/class" + "example": "Mammalia" }, "order": { "description": "Order in which the taxon is classified.", - "example": "Carnivora", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/order", "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/order" + "example": "Carnivora" }, "family": { "description": "Family in which the taxon is classified.", - "example": "Canidae", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/family", "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/family" + "example": "Canidae" }, "genus": { "description": "Genus in which the taxon is classified.", - "example": "Canis", + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/genus", "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/genus" + "example": "Canis" }, "vernacularNames": { - "description": "Common or vernacular names of the taxon, as `languageCode: vernacular name` pairs. Language code should follow ISO 639-1 (e.g. `en` for English).", - "example": "{'en': 'wolf', 'fr': 'loup gris'}", + "description": "Common or vernacular names of the taxon, as `languageCode: vernacular name` pairs. Language codes should follow ISO 639-1 (e.g. `en` for English).", "type": "object", "patternProperties": { "^[a-z]{2}$": { "description": "Common or vernacular name of the taxon in that language.", - "type": "string", - "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/vernacularName" + "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/vernacularName", + "type": "string" } }, - "additionalProperties": false + "additionalProperties": false, + "example": "{'en': 'wolf', 'fr': 'loup gris'}" } } } }, - "platform": { - "description": "Data management or repository system used to generate the Data Package.", - "type": "object", - "properties": { - "title": { - "description": "Platform name.", - "type": "string" - }, - "path": { - "description": "Platform website.", - "type": "string", - "format": "uri" - }, - "version": { - "description": "Platform version.", - "type": "string" - }, - "packageID": { - "description": "Data Package ID assigned by the platform.", - "type": "string" + "relatedIdentifiers": { + "description": "Identifiers of resources related to the package (e.g. papers, project pages, derived datasets, APIs, etc.).", + "type": "array", + "items": { + "description": "Related identifier.", + "required": [ + "relationType", + "relatedIdentifier", + "relatedIdentifierType" + ], + "properties": { + "relationType": { + "description": "Description of the relationship between the resource (the package) and the related resource.", + "skos:exactMatch": "https://schema.datacite.org/meta/kernel-4.4/include/datacite-relationType-v4.xsd", + "type": "string", + "enum": [ + "IsCitedBy", + "Cites", + "IsSupplementTo", + "IsSupplementedBy", + "IsContinuedBy", + "Continues", + "IsNewVersionOf", + "IsPreviousVersionOf", + "IsPartOf", + "HasPart", + "IsPublishedIn", + "IsReferencedBy", + "References", + "IsDocumentedBy", + "Documents", + "IsCompiledBy", + "Compiles", + "IsVariantFormOf", + "IsOriginalFormOf", + "IsIdenticalTo", + "HasMetadata", + "IsMetadataFor", + "Reviews", + "IsReviewedBy", + "IsDerivedFrom", + "IsSourceOf", + "Describes", + "IsDescribedBy", + "HasVersion", + "IsVersionOf", + "Requires", + "IsRequiredBy", + "Obsoletes", + "IsObsoletedBy" + ] + }, + "relatedIdentifier": { + "description": "Unique identifier of the related resource (e.g. a DOI or URL).", + "type": "string" + }, + "resourceTypeGeneral": { + "description": "General type of the related resource.", + "skos:exactMatch": "https://schema.datacite.org/meta/kernel-4.4/include/datacite-resourceType-v4.xsd", + "type": "string", + "enum": [ + "Audiovisual", + "Book", + "BookChapter", + "Collection", + "ComputationalNotebook", + "ConferencePaper", + "ConferenceProceeding", + "DataPaper", + "Dataset", + "Dissertation", + "Event", + "Image", + "InteractiveResource", + "Journal", + "JournalArticle", + "Model", + "OutputManagementPlan", + "PeerReview", + "PhysicalObject", + "Preprint", + "Report", + "Service", + "Software", + "Sound", + "Standard", + "Text", + "Workflow", + "Other" + ] + }, + "relatedIdentifierType": { + "description": "Type of the `RelatedIdentifier`.", + "skos:exactMatch": "https://schema.datacite.org/meta/kernel-4.4/include/datacite-relatedIdentifierType-v4.xsd", + "type": "string", + "enum": [ + "ARK", + "arXiv", + "bibcode", + "DOI", + "EAN13", + "EISSN", + "Handle", + "IGSN", + "ISBN", + "ISSN", + "ISTC", + "LISSN", + "LSID", + "PMID", + "PURL", + "UPC", + "URL", + "URN", + "w3id" + ] + } } } + }, + "references": { + "description": "List of references related to the package (e.g. references cited in `package.project.description`). References ideally include a DOI.", + "type": "array", + "items": { + "type": "string" + } } } } diff --git a/deployments-table-schema.json b/deployments-table-schema.json index 03aaa53..ba7983d 100644 --- a/deployments-table-schema.json +++ b/deployments-table-schema.json @@ -5,9 +5,9 @@ "fields": [ { "name": "deploymentID", + "description": "Unique (within the package) identifier of the deployment.", "type": "string", "format": "default", - "description": "Unique identifier (within a project) of the deployment.", "example": "dep1", "skos:broadMatch": "http://rs.tdwg.org/dwc/terms/eventID", "constraints": { @@ -17,9 +17,9 @@ }, { "name": "locationID", + "description": "Unique (within the package) identifier of the sampling location for the deployment.", "type": "string", "format": "default", - "description": "Unique identifier (within a project) of the sampling location for the deployment.", "example": "loc1", "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/locationID", "constraints": { @@ -67,7 +67,7 @@ "name": "coordinateUncertainty", "type": "integer", "format": "default", - "description": "Horizontal distance in meters from the given `latitude` and `longitude` describing the smallest circle containing the location of the camera trap. Use for example when coordinates are [rounded](https://en.wikipedia.org/wiki/Decimal_degrees#Precision) to conceal the precise location of an active camera.", + "description": "Horizontal distance in meters from the given `latitude` and `longitude` describing the smallest circle containing the location of the camera trap. Especially relevant when coordinates are rounded to protect sensitive species.", "example": "100", "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/coordinateUncertaintyInMeters", "constraints": { @@ -101,7 +101,7 @@ "name": "setupBy", "type": "string", "format": "default", - "description": "Name or unique identifier of the person who set up the camera for the deployment.", + "description": "Name or unique (within the package) identifier of the person who set up the camera for the deployment.", "example": "Jakub Bubnicki", "constraints": { "required": false @@ -111,7 +111,7 @@ "name": "cameraID", "type": "string", "format": "default", - "description": "Unique identifier (within a project) of the camera used for the deployment (e.g. the camera device serial number).", + "description": "Unique (within the package) identifier of the camera used for the deployment (e.g. the camera device serial number).", "example": "P800HG08192031", "constraints": { "required": false @@ -186,7 +186,7 @@ { "name": "timestampIssues", "type": "boolean", - "description": "`true` if timestamps in `media.csv` and `observations.csv` for the deployment are known to have (unsolvable) issues (e.g. unknown timezone, am/pm switch).", + "description": "`true` if timestamps in the `media` and `observations` resources for that deployment are known to have (unsolvable) issues (e.g. unknown timezone, am/pm switch).", "example": "false", "constraints": { "required": false @@ -196,7 +196,7 @@ "name": "baitUse", "type": "string", "format": "default", - "description": "Type of bait (if any) that was used for the deployment. If other, more info can be provided in the `comments` field.", + "description": "Type of bait (if any) that was used for the deployment. If other, more info can be provided in `comments`.", "example": "food", "constraints": { "required": false, @@ -234,7 +234,7 @@ "name": "featureType", "type": "string", "format": "default", - "description": "Type of feature (if any) that camera deployment is associated with. If other, more info can be provided in the `comments` field.", + "description": "Type of feature (if any) that camera deployment is associated with. If other, more info can be provided in `comments`.", "example": "culvert", "constraints": { "required": false, diff --git a/example/datapackage.json b/example/datapackage.json index e16bc43..49d055f 100644 --- a/example/datapackage.json +++ b/example/datapackage.json @@ -1,25 +1,38 @@ { - "name": "mica-management-of-invasive-coypu-and-muskrat-in-europe-20220909104225", - "id": "1df9727c-dde9-498a-824e-cc4f19436117", - "profile": "https://raw.githubusercontent.com/tdwg/camtrap-dp/0.2/camtrap-dp-profile.json", - "created": "2022-09-09T10:42:25Z", - "licenses": [ + "resources": [ { - "name": "CC0-1.0", - "scope": "data" + "name": "deployments", + "path": "deployments.csv", + "profile": "tabular-data-resource", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": "https://raw.githubusercontent.com/tdwg/camtrap-dp/0.4/deployments-table-schema.json" }, { - "path": "http://creativecommons.org/licenses/by/4.0/", - "scope": "media" - } - ], - "sources": [ + "name": "media", + "path": "media.csv", + "profile": "tabular-data-resource", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": "https://raw.githubusercontent.com/tdwg/camtrap-dp/0.4/media-table-schema.json" + }, { - "title": "Agouti", - "path": "https://www.agouti.eu", - "email": "agouti@wur.nl" + "name": "observations", + "path": "observations.csv", + "profile": "tabular-data-resource", + "format": "csv", + "mediatype": "text/csv", + "encoding": "utf-8", + "schema": "https://raw.githubusercontent.com/tdwg/camtrap-dp/0.4/observations-table-schema.json" } ], + "profile": "https://raw.githubusercontent.com/tdwg/camtrap-dp/0.4/camtrap-dp-profile.json", + "name": "mica-management-of-invasive-coypu-and-muskrat-in-europe-20220909104225", + "id": "1df9727c-dde9-498a-824e-cc4f19436117", + "created": "2022-09-09T10:42:25Z", + "title": "Sample from: MICA - Muskrat and coypu camera trap observations in Belgium, the Netherlands and Germany", "contributors": [ { "title": "Axel Neukermans", @@ -45,14 +58,48 @@ "path": "https://orcid.org/0000-0002-8442-8025", "role": "maintainer", "organization": "Research Institute for Nature and Forest (INBO)" + }, + { + "title": "Research Institute for Nature and Forest (INBO)", + "path": "https://inbo.be", + "role": "publisher" } ], - "organizations": [ + "description": "MICA - Muskrat and coypu camera trap observations in Belgium, the Netherlands and Germany is an occurrence dataset published by the Research Institute of Nature and Forest (INBO). It is part of the LIFE project MICA, in which innovative techniques are tested for a more efficient control of muskrat and coypu populations, both invasive species. This dataset is a sample of the original dataset and serves as an example of a Camtrap Trap Data Package (Camtrap DP).", + "version": "1.0", + "keywords": [ + "camera traps", + "public awareness campaign", + "flood protection", + "flood control", + "damage prevention", + "animal damage", + "pest control", + "invasive alien species", + "muskrat", + "coypu" + ], + "image": "", + "homepage": "", + "sources": [ { - "title": "Research Institute for Nature and Forest (INBO)", - "path": "https://inbo.be" + "title": "Agouti", + "path": "https://www.agouti.eu", + "email": "agouti@wur.nl", + "version": "v3.16" + } + ], + "licenses": [ + { + "name": "CC0-1.0", + "scope": "data" + }, + { + "path": "http://creativecommons.org/licenses/by/4.0/", + "scope": "media" } ], + "bibliographicCitation": "Desmet P, Neukermans A, Van der beeck D, Cartuyvels E (2022). Sample from: MICA - Muskrat and coypu camera trap observations in Belgium, the Netherlands and Germany. Version 1.0. Research Institute for Nature and Forest (INBO). Dataset. https://github.com/tdwg/camtrap-dp/tree/main/example", "project": { "id": "86cabc14-d475-4439-98a7-e7b590bed60e", "title": "MICA - Management of Invasive Coypu and muskrAt in Europe", @@ -62,12 +109,11 @@ "motion detection", "time lapse" ], - "animalTypes": [ - "unmarked" - ], + "individualAnimals": false, "classificationLevel": "sequence", "sequenceInterval": 120 }, + "coordinatePrecision": 0.001, "spatial": { "type": "Feature", "bbox": [ @@ -210,38 +256,19 @@ } } ], - "platform": { - "title": "Agouti", - "path": "https://agouti.eu", - "packageID": "3bdce07e-f0b1-4566-948a-e1f0a0d0a214" - }, - "resources": [ + "relatedIdentifiers": [ { - "name": "deployments", - "path": "deployments.csv", - "profile": "tabular-data-resource", - "format": "csv", - "mediatype": "text/csv", - "encoding": "utf-8", - "schema": "https://raw.githubusercontent.com/tdwg/camtrap-dp/0.3/deployments-table-schema.json" + "relationType": "IsDerivedFrom", + "relatedIdentifier": "https://doi.org/10.5281/zenodo.5590881", + "resourceTypeGeneral": "Dataset", + "relatedIdentifierType": "DOI" }, { - "name": "media", - "path": "media.csv", - "profile": "tabular-data-resource", - "format": "csv", - "mediatype": "text/csv", - "encoding": "utf-8", - "schema": "https://raw.githubusercontent.com/tdwg/camtrap-dp/0.3/media-table-schema.json" - }, - { - "name": "observations", - "path": "observations.csv", - "profile": "tabular-data-resource", - "format": "csv", - "mediatype": "text/csv", - "encoding": "utf-8", - "schema": "https://raw.githubusercontent.com/tdwg/camtrap-dp/0.3/observations-table-schema.json" + "relationType": "IsSupplementTo", + "relatedIdentifier": "https://inbo.github.io/camtraptor/", + "resourceTypeGeneral": "Software", + "relatedIdentifierType": "URL" } - ] + ], + "references": [] } diff --git a/example/deployments.csv b/example/deployments.csv index 65d98b0..3ee1505 100644 --- a/example/deployments.csv +++ b/example/deployments.csv @@ -1,5 +1,5 @@ deploymentID,locationID,locationName,longitude,latitude,coordinateUncertainty,start,end,setupBy,cameraID,cameraModel,cameraInterval,cameraHeight,cameraTilt,cameraHeading,detectionDistance,timestampIssues,baitUse,session,array,featureType,habitat,tags,comments,_id -00a2c20d-f038-490c-9b3f-7e32abfa0be7,e254a13c-26e8-483d-b664-4a0f1f4e9995,B_HS_val 2_processiepark,4.77377,51.49608,,2020-05-30T04:57:37+02:00,2020-07-01T11:41:41+02:00,Dennis,,,0,1.30,,,,,,,,,,boven de stroom,, -29b7d356-4bb4-4ec4-b792-2af5cc32efa8,2df5259b-b4b4-4f43-8cf7-effcced06d6f,B_DL_val 5_beek kleine vijver,5.65490,51.18061,,2020-07-29T07:29:41+02:00,2020-08-08T06:20:40+02:00,Danny Van der beeck,,,0,0.70,,,,,,,,,,boven de stroom,van 29/07/2020 tot 08/08/2020 120 foto's, -577b543a-2cf1-4b23-b6d2-cda7e2eac372,ff1535c0-6b5d-44be-b3ef-c4d4204dad74,B_DL_val 3_dikke boom,5.65869,51.18395,,2020-06-19T23:00:00+02:00,2020-06-29T01:33:22+02:00,Danny Van der beeck,,,0,0.80,,,,,,,,,,linkeroever,van 19/06/2020 tot 29/06/2020 63 foto's, -62c200a9-0e03-4495-bcd8-032944f6f5a1,ce943ced-1bcf-4140-9a2e-e8ee5e8c10e6,B_DM_val 4_'t WAD,4.01330,50.69905,,2021-03-27T21:38:18+01:00,2021-04-18T22:25:00+01:00,Davy,,,0,1.00,,,,,,,,,,,, +00a2c20d-f038-490c-9b3f-7e32abfa0be7,e254a13c-26e8-483d-b664-4a0f1f4e9995,B_HS_val 2_processiepark,4.774,51.496,187,2020-05-30T04:57:37+02:00,2020-07-01T11:41:41+02:00,Dennis,,,0,1.30,,,,,,,,,,boven de stroom,, +29b7d356-4bb4-4ec4-b792-2af5cc32efa8,2df5259b-b4b4-4f43-8cf7-effcced06d6f,B_DL_val 5_beek kleine vijver,5.655,51.181,187,2020-07-29T07:29:41+02:00,2020-08-08T06:20:40+02:00,Danny Van der beeck,,,0,0.70,,,,,,,,,,boven de stroom,van 29/07/2020 tot 08/08/2020 120 foto's, +577b543a-2cf1-4b23-b6d2-cda7e2eac372,ff1535c0-6b5d-44be-b3ef-c4d4204dad74,B_DL_val 3_dikke boom,5.657,51.184,187,2020-06-19T23:00:00+02:00,2020-06-29T01:33:22+02:00,Danny Van der beeck,,,0,0.80,,,,,,,,,,linkeroever,van 19/06/2020 tot 29/06/2020 63 foto's, +62c200a9-0e03-4495-bcd8-032944f6f5a1,ce943ced-1bcf-4140-9a2e-e8ee5e8c10e6,B_DM_val 4_'t WAD,4.013,50.699,187,2021-03-27T21:38:18+01:00,2021-04-18T22:25:00+01:00,Davy,,,0,1.00,,,,,,,,,,,, diff --git a/media-table-schema.json b/media-table-schema.json index 26e9d08..9dad2eb 100644 --- a/media-table-schema.json +++ b/media-table-schema.json @@ -7,7 +7,7 @@ "name": "mediaID", "type": "string", "format": "default", - "description": "Unique identifier (within a project) of the media file.", + "description": "Unique (within the package) identifier of the media file.", "example": "m1", "skos:broadMatch": "http://purl.org/dc/terms/identifier", "constraints": { @@ -19,7 +19,7 @@ "name": "deploymentID", "type": "string", "format": "default", - "description": "Unique identifier of the deployment the media file belongs to. Foreign key to `deployment:deploymentID`.", + "description": "Unique identifier of the deployment the media file belongs to. Foreign key to `deployments.deploymentID`.", "example": "dep1", "skos:broadMatch": "http://rs.tdwg.org/dwc/terms/eventID", "constraints": { @@ -30,7 +30,7 @@ "name": "sequenceID", "type": "string", "format": "default", - "description": "Unique identifier (within a project) of the sequence the media file belongs to. Sequences contain one or more media files (e.g. a single image or video or a sequence of successive images or videos) and are defined by `sequenceInterval` in the Data Package metadata.", + "description": "Unique (within the package) identifier of the sequence the media file belongs to. Sequences contain one or more media files (e.g. a single image or video or a sequence of successive images or videos) and are defined by `package.project.sequenceInterval`.", "example": "seq1", "skos:broadMatch": "http://rs.tdwg.org/dwc/terms/eventID", "constraints": { @@ -67,7 +67,7 @@ "name": "filePath", "type": "string", "format": "default", - "description": "URL or relative path to the media file, respectively for externally hosted files or files that are part of the Data Package.", + "description": "URL or relative path to the media file, respectively for externally hosted files or files that are part of the package.", "example": "https://multimedia.agouti.eu/assets/6d65f3e4-4770-407b-b2bf-878983bf9872/file", "skos:broadMatch": "http://rs.tdwg.org/ac/terms/accessURI", "constraints": { diff --git a/observations-table-schema.json b/observations-table-schema.json index eec97fb..92ce7d7 100644 --- a/observations-table-schema.json +++ b/observations-table-schema.json @@ -7,7 +7,7 @@ "name": "observationID", "type": "string", "format": "default", - "description": "Unique identifier (within a project) of the observation.", + "description": "Unique (within the package) identifier of the observation.", "example": "obs1", "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/occurrenceID", "constraints": { @@ -19,7 +19,7 @@ "name": "deploymentID", "type": "string", "format": "default", - "description": "Unique identifier of the deployment the observation belongs to. Foreign key to `deployment:deploymentID`.", + "description": "Unique identifier of the deployment the observation belongs to. Foreign key to `deployments.deploymentID`.", "example": "dep1", "skos:broadMatch": "http://rs.tdwg.org/dwc/terms/eventID", "constraints": { @@ -30,7 +30,7 @@ "name": "sequenceID", "type": "string", "format": "default", - "description": "Unique identifier of the sequence (collection of media files grouped by a predefined `sequenceInterval`) that is the source of the observation. Foreign key to `media:sequenceID`.", + "description": "Unique identifier of the sequence (collection of media files grouped by a predefined `package.project.sequenceInterval`) that is the source of the observation. Foreign key to `media.sequenceID`.", "example": "seq1", "skos:broadMatch": "http://rs.tdwg.org/dwc/terms/eventID", "constraints": { @@ -41,7 +41,7 @@ "name": "mediaID", "type": "string", "format": "default", - "description": "Unique identifier of the media file that is the source of the observation. Foreign key to `media:mediaID`. Leave empty for sequence-based observations.", + "description": "Unique identifier of the media file that is the source of the observation. Foreign key to `media.mediaID`. Leave empty for sequence-based observations.", "example": "m1", "skos:broadMatch": "http://purl.org/dc/terms/identifier", "constraints": { @@ -52,7 +52,7 @@ "name": "timestamp", "type": "datetime", "format": "%Y-%m-%dT%H:%M:%S%z", - "description": "Date and time of the observation, as an ISO 8601 formatted string with timezone designator (`YYYY-MM-DDThh:mm:ssZ` or `YYYY-MM-DDThh:mm:ss±hh:mm`). For file-based observations this is the `timestamp` of the associated media file (in `mediaID`), for sequence-based observations the `timestamp` of the first media file in the associated sequence (in `sequenceID`).", + "description": "Date and time of the observation, as an ISO 8601 formatted string with timezone designator (`YYYY-MM-DDThh:mm:ssZ` or `YYYY-MM-DDThh:mm:ss±hh:mm`). For file-based observations this is the `media.timestamp` of the associated media file (in `mediaID`), for sequence-based observations the `media.timestamp` of the first media file in the associated sequence (in `sequenceID`).", "example": "2020-03-24T11:21:46Z", "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/eventDate", "constraints": { @@ -91,7 +91,7 @@ "name": "taxonID", "type": "string", "format": "default", - "description": "Unique identifier of the `scientificName` according to the taxonomic reference list defined by `taxonIDReference` in the Data Package metadata.", + "description": "Unique identifier of the `scientificName` as defined in `package.taxonomic.taxonID` for that scientific name.", "example": "QLXL", "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/taxonID", "constraints": { @@ -178,7 +178,7 @@ "name": "individualID", "type": "string", "format": "default", - "description": "Unique identifier (within a project) of the observed individual.", + "description": "Unique (within the package) identifier of the observed individual.", "example": "RD213", "skos:exactMatch": "http://rs.tdwg.org/dwc/terms/organismID", "constraints": { diff --git a/pages/metadata.md b/pages/metadata.md index 71aea02..83727b8 100644 --- a/pages/metadata.md +++ b/pages/metadata.md @@ -1,34 +1,8 @@ --- layout: profile title: Metadata -description: permalink: /metadata/ +toc: true --- -Metadata in Camtrap DP are defined in a `datapackage.json` file. It follows the [Data Package](https://specs.frictionlessdata.io/data-package/#specification) specifications and includes default **Data Package properties** and specific **Camtrap DP properties**. The latter are presented below in human-readable form. Properties indicated with `*` are required (i.e. cannot be empty). - -For a full example, see [this `datapackage.json`](https://raw.githubusercontent.com/tdwg/dwc-for-biologging/403f57db105982dc05b70f3cf66fd2b5591798db/derived/camtrap-dp/data/raw/datapackage.json). - -## Data Package properties - -- [`name`](https://specs.frictionlessdata.io/data-package/#name) -- [`id`](https://specs.frictionlessdata.io/data-package/#id) -- [`profile`](#profile)* -- [`created`](https://specs.frictionlessdata.io/data-package/#created)* -- [`licenses`](#licenses) -- [`sources`](https://specs.frictionlessdata.io/data-package/#sources) -- [`contributors`](https://specs.frictionlessdata.io/data-package/#contributors)* -- [`resources`](#resources)*: the data files, see [Data](../data/). - -## Camtrap DP properties - -- [`organizations`](#organizations) -- [`rightsHolder`](#rightsHolder) -- [`bibliographicCitation`](#bibliographicCitation) -- [`project`](#project)* -- [`spatial`](#spatial)* -- [`temporal`](#temporal)* -- [`taxonomic`](#taxonomic)* -- [`platform`](#platform) - ---- +Metadata in Camtrap DP are expressed in a `datapackage.json` file. It follows the [Data Package](https://specs.frictionlessdata.io/data-package/#specification) specifications and includes generic **Data Package properties** and specific **Camtrap DP properties**. Properties indicated with `*` are required (i.e. cannot be empty).