Dear Patrick & Jeff,
I also agree that this is an important service to support from a linked-data point of view - and not just for medievalists, but for institutions that support annotation of any resource (newspapers, art works, archival materials, etc.). Many institutions have not made Canvas and Annotation URIs de-referencable for any number of reasons, including low demand to-date from the community. I notice that you have added some underlying use-cases to https://github.com/IIIF/iiif-stories/issues and already received some comment there, which is an excellent way of gaining some exposure on this issue.
In order to engage the broader community - the community that can encourage institutions into a best-practice, or can exert some influence over the way the spec is currently written - I'm going to bring this conversation over to the more general IIIF-discuss list and I encourage continuing this discussion there.
Best,
Ben
I wanted to start within this group, as I think the case is most applicable to Manuscripts hosting institutions and the pressure would come from users of the manuscript resources. Here's the short version:The IIIF Presentation API allows "Canvases may be dereferenced separately from the manifest via their URIs" but I would like to strongly encourage the dereferencability of Canvas objects. The "Protocol Behavior" also holds it as a recommendation, even if the API language is weak. Canvas |
The use cases I have already come across are in IIIF-Stories (#53, #54, #55, #56) and individual detail is available. Please comment there to undermine my argument and provide a way out in each case if you can.
The problem in more detail is that the standard misleads a little by assuming that each Canvas is uniquely sequenced and that the Manifest which sequences it is always available. The Canvas @id is always like: "http://example.org/iiif/book1/canvas/p1" because IIIF says so:
Canvases must be identified by a URI and it must be an HTTP(s) URI.
which means that even if http://example.org/iiif/book1/canvas/p1 doesn't go anywhere, it looks like it might. In fact, most repositories I have tested return some version of 404 when you try to resolve their Canvas URIs. A non-dereferencable URI means that any application given only an "oa:Annotation" with an "on" property will never know how to find the Canvas object for display unless also given a Manifest URI. It means that any application seeking to describe, select, comment, transcribe or otherwise annotate a Canvas cannot display the Canvas it intends to annotate. If this application is a service, an iframe, or even an embeddable component, it is not enough to have a Canvas URI string, but must instead know the entire Manifest, the sequences index and the canvases index (or at least the Manifest and a Canvas identifier to which to iterate.
So if you work for a hosting institution or you are using one for your research, please ask them to include the Canvas pattern in their support of IIIF. They don't have to, but it would make me so happy.
Respectfully,Patrick Cuba
Center for Digital HumanitiesSaint Louis University
Per discussion on community call today, bumping this up in folks' inboxes. Hopefully we can continue this discussion with the general group.
Best,
B.
The problem in more detail is that the standard misleads a little by assuming that each Canvas is uniquely sequenced and that the Manifest which sequences it is always available. The Canvas @id is always like: "http://example.org/iiif/book1/canvas/p1" because IIIF says so:
Canvases MUST be identified by a URI and it must be an HTTP(s) URI.
which means that even if http://example.org/iiif/book1/canvas/p1 doesn't go anywhere, it looks like it might. In fact, most repositories I have tested return some version of 404 when you try to resolve their Canvas URIs.
A non-dereferencable URI means that any application given only an "oa:Annotation" with an "on" property will never know how to find the Canvas object for display unless also given a Manifest URI.
It means that any application seeking to describe, select, comment, transcribe or otherwise annotate a Canvas cannot display the Canvas it intends to annotate.
The problem in more detail is that the standard misleads a little ...
Canvases MUST be identified by a URI and it must be an HTTP(s) URI.
which means that even if http://example.org/iiif/book1/canvas/p1 doesn't go anywhere, it looks like it might...
I don't think that the specification is misleading, it explicitly says:Canvases MAY be dereferenced separately from the manifest via their URIs [...]
Which is as intended, as there has yet to be any use case articulated that requires them to be separately derefenceable.
A non-dereferencable URI means that any application given only an "oa:Annotation" with an "on" property will never know how to find the Canvas object for display unless also given a Manifest URI.Correct. And thus we recommend in the Search API to include a within reference from the target Canvas to the Manifest that it is part of.
It means that any application seeking to describe, select, comment, transcribe or otherwise annotate a Canvas cannot display the Canvas it intends to annotate.How did the application know the URI of the Canvas in the first place, if it didn't find it from a Manifest?Even if the canvas were dereferencable, I don't see how that would help you find its Manifest without the above within link?
Also, as a Canvas might be part of multiple Manifests at the same time (not commonly, but possibly) it might be confusing to not pass the manifest URI if the Canvas was actually selected from a particular manifest. If not, then the user might find themselves in a different object than the one they started in. Without the context of the object, as provided by the Manifest, how would the user know what they're looking at in the Canvas? It would go from being "page 16 of The Lord of the Rings by Tolkien" to just "page 16".
--
You received this message because you are subscribed to the Google Groups "IIIF Manuscripts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iiif-manuscrip...@googlegroups.com.
To post to this group, send email to iiif-man...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/iiif-manuscripts/CAOUOa4fdDXdEZMBcRxVWFJ54pZ4CC2c_BqB_7-Z8%3DCvrWKM1kw%40mail.gmail.com.
I have placed several in the IIIF-stories. None of these require more than the `within` from the Search API, but they are all made almost absurdly complex without a dereferenceable Canvas. Here's a summary:
- https://github.com/IIIF/iiif-stories/issues/54 - Display for image annotations, currently used at soundingtennyson.org (see comment on issue). With a defererenceable Canvas URI the process is 1) read `on`; 2) load Canvas; 3) crop image to display. Without (and assuming a `within` as below, since it is impossible otherwise) the process is 1) read `within`; 2) load Manifest; 3) loop through [`sequences`] and [`sequences.canvasses`] to find the Canvas from the `on`; and proceed as above. With several annotations displayed from different Manifests, this becomes very unwieldy.
- https://github.com/IIIF/iiif-stories/issues/56 - Broken Books, currently used at brokenbooks.org. Reassembling dispersed manuscripts into virtual collections right now (without dereferenceable Canvas URIs) means we have to upload/link the images themselves instead of the Canvases, which is contrary to interoperability. If a quire of 10 at Stanford and Yale each were already catalogued in their own Manifests, I should be able to generate a new Manifest ordering them together through reference to the Canvas URI each repository maintains. Forking them into the new Manifest means the `within` property becomes an unhelpful array and the aggregated version will not update when better description or photography becomes available, for example.
- https://github.com/IIIF/iiif-stories/issues/53 - Annotation tool, currently in development at CDH. Any 3rd party annotation tool would need the entire Canvas object passed to it to function, rather than just the URI, as Mirador can. Liz Fischer has shared a great little tool to crop IIIF images, but it is notable that this would not work if you tried to give it a Canvas URI instead of the `images[0].resource.@id` value.
- https://github.com/IIIF/iiif-stories/issues/55 - Transcription button, currently in development at CDH and used by the Newberry's French Renaissance Paleography. Like the annotation tool, sending a URI for a single Canvas is preferable for very large Manifests with small areas of interest, such as a single article in a newspaper, a map within a manuscript, a letter in a collection, an entry in a large catalog or index, or any crowdsourced project like Zooniverse where the individual user's path is not linear through the material.
A non-dereferencable URI means that any application given only an "oa:Annotation" with an "on" property will never know how to find the Canvas object for display unless also given a Manifest URI.Correct. And thus we recommend in the Search API to include a within reference from the target Canvas to the Manifest that it is part of.Big fan. I hope people use it as well.
--
-- You received this message because you are subscribed to the IIIF-Discuss Google group. To post to this group, send email to iiif-d...@googlegroups.com. To unsubscribe from this group, send email to iiif-discuss+unsubscribe@googlegroups.com. For more options, visit this group at https://groups.google.com/d/forum/iiif-discuss?hl=en
---
You received this message because you are subscribed to the Google Groups "IIIF Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iiif-discuss+unsubscribe@googlegroups.com.
At the risk of butting into something that I don't fully understand, I feel like issue here is whether canvases are first-class entities or just nodes within a hierarchy.
IIIF is a linked data graph and canvases are an RDF entity, with a type and a URI. As such, they're also a primary source of truth and should only exist once. All references to them should point to the same entity.
IIIF is also a JSON object, somewhat optimized for over-the-wire efficiency, and represents an underlying data store. As such, canvases are just strings representing hierarchical object nodes that can be parsed, composed and combined.
Rob, it sounds like a lot of what you're arguing for assumes that a given canvas should only appear in a single manifest. And if a manifest is fundamentally a JSON file, that's very true—an separate canvas with identical data can exist in a different manifest and be a different canvas. But if a canvas is a RDF entity representing something abstract, that doesn't make sense.
--
-- You received this message because you are subscribed to the IIIF-Discuss Google group. To post to this group, send email to iiif-d...@googlegroups.com. To unsubscribe from this group, send email to iiif-discuss...@googlegroups.com. For more options, visit this group at https://groups.google.com/d/forum/iiif-discuss?hl=en
---
You received this message because you are subscribed to the Google Groups "IIIF Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iiif-discuss...@googlegroups.com.
-- You received this message because you are subscribed to the IIIF-Discuss Google group. To post to this group, send email to iiif-d...@googlegroups.com. To unsubscribe from this group, send email to iiif-discuss+unsubscribe@googlegroups.com. For more options, visit this group at https://groups.google.com/d/forum/iiif-discuss?hl=en
---
You received this message because you are subscribed to the Google Groups "IIIF Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iiif-discuss+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
-- You received this message because you are subscribed to the IIIF-Discuss Google group. To post to this group, send email to iiif-d...@googlegroups.com. To unsubscribe from this group, send email to iiif-discuss+unsubscribe@googlegroups.com. For more options, visit this group at https://groups.google.com/d/forum/iiif-discuss?hl=en
---
You received this message because you are subscribed to the Google Groups "IIIF Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iiif-discuss+unsubscribe@googlegroups.com.
-- You received this message because you are subscribed to the IIIF-Discuss Google group. To post to this group, send email to iiif-d...@googlegroups.com. To unsubscribe from this group, send email to iiif-discuss...@googlegroups.com. For more options, visit this group at https://groups.google.com/d/forum/iiif-discuss?hl=en
---
You received this message because you are subscribed to the Google Groups "IIIF Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iiif-discuss...@googlegroups.com.
To post to this group, send email to iiif-ma...@googlegroups.com.
Because 1) OpenSeadragon can read info.json for all the configuration it needs, and 2) we're using OSD to display pages to be transcribed in FromThePage, then 3) we don't need to persist any attributes of canvases we import beyond @id, label, and image service information.
Now that we're exporting transcripts/translations as derivative manifests (pending widespread support for annotation supplementary layers), we need to hunt down the height and width attributes of the originating canvases in order to generate valid manifests. But how do we get the necessary attributes?
* We could re-query the original manifest, then parse it to look for canvas @ids that match the canvas IDs we've saved (unpleasant and slow in some cases).
* We could parse the image service's info.json for each canvas (mixing the Image API and Presentation API)
* At import time, we could persist the height/width for each canvas, then re-use them at export time (hoping they haven't changed)
* Or we could use the canvas ID we've saved, dereference it, and re-present it.
The last option certainly seems best to me, but won't work if canvases aren't dereferencable.
On the same topic, how can one get from a canvas ID (perhaps occurring within an annotation) to a manifest, or a layer, or an image service, if canvases aren't dereferencable?
--
-- You received this message because you are subscribed to the IIIF-Discuss Google group. To post to this group, send email to iiif-d...@googlegroups.com. To unsubscribe from this group, send email to iiif-discuss+unsubscribe@googlegroups.com. For more options, visit this group at https://groups.google.com/d/forum/iiif-discuss?hl=en
---
You received this message because you are subscribed to the Google Groups "IIIF Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to iiif-discuss+unsubscribe@googlegroups.com.
On Thu, Sep 8, 2016 at 11:31 AM, Ben Brumfield <benw...@gmail.com> wrote:Because 1) OpenSeadragon can read info.json for all the configuration it needs, and 2) we're using OSD to display pages to be transcribed in FromThePage, then 3) we don't need to persist any attributes of canvases we import beyond @id, label, and image service information.That's dangerous, as the height and width of the Canvas might be different from the height and width of any given image. Particularly when there's a choice of image involved, you wouldn't know which set of dimensions might have been chosen for the Canvas. Then it would be impossible to align the annotations again.
* At import time, we could persist the height/width for each canvas, then re-use them at export time (hoping they haven't changed)This is the way that I would suggest, if you're creating new manifests rather than just publishing annotations.
If the dimensions of the Canvas have changed, your annotations would need to be updated for the new dimensions anyway, no? If you don't cache them, how would you know how to transform the target region?