<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Onroerend Erfgoed Ontwikkelaarsportaal - Blog</title>
        <link>https://developers.onroerenderfgoed.be/en/blog</link>
        <description>Artikelen over de IT-projecten en technologie van Onroerend Erfgoed</description>
        <lastBuildDate>Fri, 06 Nov 2020 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Onroerend Erfgoed</copyright>
        <item>
            <title><![CDATA[Atramhasis v0.7.0 released]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/atramhasis-0.7.0</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/atramhasis-0.7.0</guid>
            <pubDate>Fri, 06 Nov 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[Version 0.7.0 of Atramhasis, our open-source, web-based SKOS editor, is out.]]></description>
            <content:encoded><![CDATA[<p>Version 0.7.0 of <a href="https://pypi.org/project/atramhasis/" target="_blank" rel="noopener noreferrer" class="">Atramhasis</a>, our open-source, web-based SKOS editor, is out.</p>
<!-- -->
<p>Most of this release is under the hood rather than user-visible, focused on stability. One new user-facing feature: a <a href="https://thesaurus.onroerenderfgoed.be/conceptschemes/SOORTEN/tree" target="_blank" rel="noopener noreferrer" class="">simple tree view</a> that makes printing a thesaurus practical.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This release contains backwards-incompatible changes that require a careful upgrade and some manual intervention. <strong>The 0.7.x line will also be the last to support Python 2</strong> — if you haven't moved to Python 3 yet, now's the time.</p></div></div>
<p>The breaking change concerns how and when <code>skosprovider.registry.Registry</code> gets instantiated: previously this happened at application startup, now it happens per request. The old approach caused problems with SQLAlchemy providers on a multi-threaded webserver. See the <a href="https://atramhasis.readthedocs.io/en/latest/customisation.html#creating-conceptschemes" target="_blank" rel="noopener noreferrer" class="">customisation docs</a> for the new pattern, and the <a href="https://pyramid-skosprovider.readthedocs.io/en/0.9.0/install.html" target="_blank" rel="noopener noreferrer" class="">pyramid_skosprovider docs</a> for background.</p>
<p>Python 2 support is being phased out across the whole stack:</p>
<ul>
<li class=""><a href="https://pypi.org/project/atramhasis/" target="_blank" rel="noopener noreferrer" class="">atramhasis</a> will drop it in <code>1.0.0</code></li>
<li class=""><a href="https://pypi.org/project/skosprovider/" target="_blank" rel="noopener noreferrer" class="">skosprovider</a> will drop it in <code>0.8.0</code></li>
<li class=""><a href="https://pypi.org/project/language-tags/" target="_blank" rel="noopener noreferrer" class="">language-tags</a> dropped it in <code>1.0.0</code></li>
<li class=""><a href="https://pypi.org/project/pyramid_skosprovider/" target="_blank" rel="noopener noreferrer" class="">pyramid_skosprovider</a> will drop it in <code>0.10.0</code></li>
<li class=""><a href="https://pypi.org/project/skosprovider-sqlalchemy/" target="_blank" rel="noopener noreferrer" class="">skosprovider_sqlalchemy</a> will drop it in <code>0.7.0</code></li>
<li class=""><a href="https://pypi.org/project/skosprovider-atramhasis/" target="_blank" rel="noopener noreferrer" class="">skosprovider_atramhasis</a> dropped it in <code>0.4.0</code></li>
<li class=""><a href="https://pypi.org/project/skosprovider-getty/" target="_blank" rel="noopener noreferrer" class="">skosprovider_getty</a> will drop it in <code>0.6.0</code></li>
<li class=""><a href="https://pypi.org/project/skosprovider-rdf/" target="_blank" rel="noopener noreferrer" class="">skosprovider_rdf</a> will drop it in <code>0.9.0</code></li>
<li class=""><a href="https://pypi.org/project/skosprovider_heritagedata/" target="_blank" rel="noopener noreferrer" class="">skosprovider_heritagedata</a> is currently unmaintained</li>
</ul>
<p>SKOS collections also got a fix: it was always assumed that concepts in a collection are narrower concepts of that collection's superordinate concept, but the implementation was incomplete and buggy. Collections now have a boolean <code>infer_concept_relations</code> attribute — when <code>true</code>, member concepts count as narrower concepts of the superordinate; when <code>false</code>, they don't. This mainly affects a provider's expand function and how <code>thesaurus arrays</code> or <code>node labels</code> are interpreted.</p>
<p>We also invested in SEO: concept detail pages now carry HTML metadata such as a canonical URL, a Twitter card and OpenGraph info, and a new script can generate an XML sitemap for your installation.</p>
<p><img decoding="async" loading="lazy" alt="Atramhasis admin interface" src="https://developers.onroerenderfgoed.be/en/assets/images/atramhasis_admin-6486745f1208c98e062dfacfe2692501.png" width="1851" height="949" class="img_ev3q"></p>
<p><em>The Atramhasis admin interface</em></p>
<p>If you're not sure what Atramhasis looks like or does, the documentation now has a <a href="https://atramhasis.readthedocs.io/en/latest/features.html" target="_blank" rel="noopener noreferrer" class="">dedicated features section</a> explaining it.</p>
<p>As always, see the <a href="https://github.com/OnroerendErfgoed/atramhasis/releases/tag/0.7.0" target="_blank" rel="noopener noreferrer" class="">0.7.0 release notes</a> for the full changelog. Try a live example at <a href="https://thesaurus.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">thesaurus.onroerenderfgoed.be</a>. Questions or issues: the <a href="https://groups.google.com/forum/#!forum/atramhasis" target="_blank" rel="noopener noreferrer" class="">forum</a> or our <a href="https://github.com/OnroerendErfgoed/atramhasis" target="_blank" rel="noopener noreferrer" class="">GitHub tracker</a>.</p>]]></content:encoded>
            <category>Atramhasis</category>
        </item>
        <item>
            <title><![CDATA[Web pages move too]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/webpagina-verhuizen</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/webpagina-verhuizen</guid>
            <pubDate>Fri, 31 Jan 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[We don't always think about it, but web pages move too. Websites, databases and other information systems aren't static cool URIs don't change, real ones do. Deal with it. (For this post, feel free to read URI and URL as synonyms.)]]></description>
            <content:encoded><![CDATA[<p>We don't always think about it, but web pages move too. Websites, databases and other information systems aren't static: they get built at a particular point in time, with particular expectations, on particular technology. In an ideal world a URL never changes — <a href="https://www.w3.org/Provider/Style/URI" target="_blank" rel="noopener noreferrer" class="">Cool URIs don't change</a>, as the saying goes. In practice, something always changes: cool URIs don't change, real ones do. Deal with it. (For this post, feel free to read URI and URL as synonyms.)</p>
<!-- -->
<p>At <a href="https://www.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Flanders Heritage Agency</a> we've tried, for a long time now (since roughly 2005), to keep our URIs as stable as possible. When a URL has to change or disappear anyway, we set up a redirect from the old URL to a page with the same or similar information. So you can still browse the inventory via <a href="https://inventaris.vioe.be/" target="_blank" rel="noopener noreferrer" class="">https://inventaris.vioe.be</a>, even though <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">https://inventaris.onroerenderfgoed.be</a> has been the canonical URL for years, and <a href="https://www.erfgoed.net/beschermingen" target="_blank" rel="noopener noreferrer" class="">https://www.erfgoed.net/beschermingen</a> still sends you to the search form for protected heritage, even though that original page hasn't existed for nearly a decade.</p>
<p>The downside: many people don't realise URLs have changed, and old URLs linger on all kinds of websites, redirecting to newer ones. The longer that goes on, the more tangled the redirect logic gets — old URLs pointing to less-old URLs, which in turn redirect to current ones. Once the memory of those old systems fades, it also gets harder for us to keep everything working. So today we're listing a number of common old links, focused on protected heritage (the inventory itself is covered in a later post).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="information-systems-for-protected-heritage">Information systems for protected heritage<a href="https://developers.onroerenderfgoed.be/en/blog/webpagina-verhuizen#information-systems-for-protected-heritage" class="hash-link" aria-label="Direct link to Information systems for protected heritage" title="Direct link to Information systems for protected heritage" translate="no">​</a></h2>
<p>Long before the web was really a thing, there was already a first information system for protected heritage: <em>Melanie</em>, short for <code>Monumenten En LANdschappen InformatiEsysteem</code>. Initially not connected to the internet at all, it later got an online view of the protected objects in a shadow database. Even without URIs, every protected object already got a unique number following a fixed pattern: an <code>O</code> (for "object"), a letter per province (<code>W</code>, <code>O</code>, <code>A</code>, <code>L</code>, <code>B</code>), and six digits between <code>000000</code> and <code>999999</code> — the Melanie Object Number, such as <code>OO003255</code> or <code>OW000678</code>. You'll still spot these on today's designation-object records. There were also Melanie Dossier Numbers, structured the same way but starting with <code>D</code> instead of <code>O</code>, since multiple objects could be protected together in one dossier — like <code>DA002378</code>, covering 4 protected monuments by 1 architect.</p>
<p>When Monumenten en Landschappen merged into the Ruimte en Erfgoed agency, its information systems were merged too. Melanie was retired, and its role taken over by <em>Bredero</em>, the case-tracking system already used for Spatial Planning. It also had the concepts of an object and a dossier. A Bredero number has three parts separated by slashes: the document type (protected monument, townscape, protection dossier, ...), a 5-digit NIS code for the municipality or province, and a sequence number. A full number looks like <code>4.01/43005/162.1</code> (a protected monument), <code>4.03/40000/107.1</code> (a protected landscape), or <code>4.001/30000/2517.1</code> (a protection dossier).</p>
<p>When Flanders Heritage Agency was founded in 2011, it quickly became clear that <code>Bredero</code> was well suited to case tracking, but not to a stable environment for detailed, object-related heritage information. The existing Flanders Heritage Inventory offered far more there, and that synergy produced the designation objects (see <a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten">Heritage objects and designation objects</a>). When building that dataset, we carried over the old identifiers as much as possible, which is why a designation object's page still lists older numbers today under <code>Beschermingsdossiers</code>. The inventory itself had always lived on the web and always used URIs, and since designation objects came about, we've followed the Flemish Government's URI guidelines. So you can find the parish church of St. Peter and St. Paul in Hansbeke under the old Melanie number <code>OO001175</code>, the equivalent Bredero number <code>4.01/44049/119.1</code>, and the new URI <a href="https://id.erfgoed.net/aanduidingsobjecten/10535" target="_blank" rel="noopener noreferrer" class="">https://id.erfgoed.net/aanduidingsobjecten/10535</a>.</p>
<p><img decoding="async" loading="lazy" alt="Searching by Melanie or Bredero number" src="https://developers.onroerenderfgoed.be/en/assets/images/andere_nummers_zoeken-4290259c1cd656af25f1f2772de48353.png" width="943" height="777" class="img_ev3q"></p>
<p><em>Searching by Melanie or Bredero number on the designation objects search form</em></p>
<p>The protection-database project included migrating protected objects from Bredero into designation objects, with close attention to data quality, a re-evaluation of old data, and the addition of new information such as location data and thesaurus terms. Sometimes an old Melanie or Bredero number had to be split across several new records, so today one old number can occasionally map to more than one record — the exception rather than the rule. To make this easy, you can just search on an old number: go to the <a href="https://inventaris.onroerenderfgoed.be/aanduidingsobjecten/zoeken" target="_blank" rel="noopener noreferrer" class="">designation objects search form</a> and enter the Melanie or Bredero number under <code>Ander nummer?</code> ("other number?") at the bottom.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="old-urls">Old URLs<a href="https://developers.onroerenderfgoed.be/en/blog/webpagina-verhuizen#old-urls" class="hash-link" aria-label="Direct link to Old URLs" title="Direct link to Old URLs" translate="no">​</a></h2>
<p>If you still have an old URL lying around somewhere, it will always contain a Melanie or Bredero number. URLs from 2012–2016 probably look like <code>https://beschermingen.onroerenderfgoed.be/object/id/OO001175</code> or <code>https://beschermingen.onroerenderfgoed.be/object/id/4.01/44049/119.1</code>. After 2016 that traffic was redirected to an inventory page such as <code>https://inventaris.onroerenderfgoed.be/erfgoed/beschermd/OO001175</code>, showing every linked designation object (or redirecting straight through if there was only one). Today that traffic goes to something like <code>https://inventaris.onroerenderfgoed.be/aanduidingsobjecten?ander_nummer=OO001175</code>, showing every designation object matching that old number.</p>
<p>If you have even older URLs like <code>http://paola.erfgoed.net/engine/fiche.php?id=000816&amp;pv=O</code>, those no longer work, but you can easily reconstruct the Melanie number: take the value of <code>pv</code>, followed by <code>O</code>, followed by the value of <code>id</code> — giving <code>OO000816</code>, which you can then look up under "other number" in the new inventory. That eventually leads you to the Motte de Hoge Wal in Ertvelde.</p>
<p>If you have old links, we strongly recommend converting them to our new URIs. Note the distinction between the <code>document URI</code> (say, the page you can read about the Hoge Wal) and the <code>concept URI</code> (representing the concept of the Hoge Wal as a tangible object). We only guarantee persistence on the latter: the document URI is tied to our domain name <code>onroerenderfgoed.be</code>, which is tied to our organisation's name, while the concept URIs on <code>erfgoed.net</code> aren't affected by that.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="say-it-with-a-script">Say it with a script<a href="https://developers.onroerenderfgoed.be/en/blog/webpagina-verhuizen#say-it-with-a-script" class="hash-link" aria-label="Direct link to Say it with a script" title="Direct link to Say it with a script" translate="no">​</a></h2>
<p>If you have a lot of links to our site, looking them up one by one is a lot of work. So we've put together a short Python script that resolves a whole batch of old Melanie or Bredero numbers to their URIs in one go: save the script, provide a CSV file listing the old identifiers, and run it. The full script is available in this blog's source repository on <a href="https://github.com/OnroerendErfgoed/OnroerendErfgoed.github.io" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content:encoded>
            <category>Inventaris</category>
            <category>Aanduidingsobjecten</category>
        </item>
        <item>
            <title><![CDATA[We are the Hypermedia!]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/vioe-hypermedia-api</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/vioe-hypermedia-api</guid>
            <pubDate>Mon, 30 Dec 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Within the Flemish Government, a central body coordinates policy on Information and ICT. Under its umbrella, several taskforces operate, including the OSLO Datastandards taskforce, which develops standards, semantic models and tooling for Flemish government agencies and partners. One of its 2018 projects was a Generic Hypermedia API standard — guidelines and building blocks to make REST services more hypermedia-driven and therefore more interoperable. Its first version, approved on November 8, 2018, covers three building blocks: language, CRUD and pagination.]]></description>
            <content:encoded><![CDATA[<p>Within the Flemish Government, a central body coordinates policy on Information and ICT. Under its umbrella, several taskforces operate, including the <a href="https://informatievlaanderen.github.io/handreikingOslo/" target="_blank" rel="noopener noreferrer" class="">OSLO Datastandards</a> taskforce, which develops standards, semantic models and tooling for Flemish government agencies and partners. One of its 2018 projects was a <a href="https://github.com/Informatievlaanderen/generieke-hypermedia-api" target="_blank" rel="noopener noreferrer" class="">Generic Hypermedia API</a> standard — guidelines and building blocks to make REST services more hypermedia-driven and therefore more interoperable. Its first version, approved on November 8, 2018, covers three building blocks: language, CRUD and pagination.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pagination-web-scale">Pagination. Web scale<a href="https://developers.onroerenderfgoed.be/en/blog/vioe-hypermedia-api#pagination-web-scale" class="hash-link" aria-label="Direct link to Pagination. Web scale" title="Direct link to Pagination. Web scale" translate="no">​</a></h2>
<p>At Flanders Heritage we've started aligning our information systems with this standard, particularly the <code>pagination</code> building block. For now we're adopting the HTTP <code>Link</code> header method of pagination, as specified <a href="https://github.com/Informatievlaanderen/generieke-hypermedia-api/blob/master/paginering.md#http" target="_blank" rel="noopener noreferrer" class="">here</a> and detailed in <a href="https://tools.ietf.org/html/rfc5988" target="_blank" rel="noopener noreferrer" class="">RFC 5988</a>.</p>
<p>To see this in action, look at the <code>Link</code> HTTP header — via a command-line tool like cURL, a browser plugin, or a standalone REST client. We'll use cURL, since it's generally available or easy to install on Linux and Mac.</p>
<p>Say we're interested in books and documents about <code>Knokke</code>, a coastal town in Flanders. Looking at the REST API docs at <a href="https://bib.onroerenderfgoed.be/api_docs" target="_blank" rel="noopener noreferrer" class="">https://bib.onroerenderfgoed.be/api_docs</a> tells us we can call <a href="https://bib.onroerenderfgoed.be/werken" target="_blank" rel="noopener noreferrer" class="">https://bib.onroerenderfgoed.be/werken</a> with a <code>titel</code> parameter, so <code>https://bib.onroerenderfgoed.be/werken?titel=knokke</code> gives us books with <code>Knokke</code> in the title, or a chapter title:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ curl -G -i -H Accept:application/json https://bib.onroerenderfgoed.be/werken?titel=knokke</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">HTTP/1.1 200 OK</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Date: Mon, 16 Dec 2019 19:51:07 GMT</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Server: Apache</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Content-Type: application/json</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Content-Length: 3933</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Access-Control-Expose-Headers: Content-Range, X-Content-Range</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Accept-Ranges: items</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Content-Range: items 0-9/167</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Link: &lt;https://bib.onroerenderfgoed.be/werken?titel=knokke&amp;per_pagina=10&amp;pagina=2&gt;; rel="next", &lt;https://bib.onroerenderfgoed.be/werken?titel=knokke&amp;per_pagina=10&amp;pagina=17&gt;; rel="last", &lt;https://bib.onroerenderfgoed.be/werken?titel=knokke&amp;per_pagina=10&amp;pagina=1&gt;; rel="first"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">X-Content-Type-Options: nosniff</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Access-Control-Allow-Origin: *</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">X-Permitted-Cross-Domain-Policies: none</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">X-XSS-Protection: 1; mode=block</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[{"publicatietype": {"url": "http://purl.org/ontology/bibo/Document", "naam": "Document", "id": 1}, "titel": "Het landelijke Knokke", "self": "https://bib.onroerenderfgoed.be/werken/552291", "uri": "https://id.erfgoed.net/infocat/werken/552291", "auteur": "D'hont A.", "id": 552291}, "... 9 more results ..."]</span><br></div></code></pre></div></div>
<p>This <code>curl</code> call fetches books and documents (<code>werken</code>) from our library catalog with <code>knokke</code> in the title, and asks it to print the headers. The one we care about here is <code>Link</code>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Link: &lt;https://bib.onroerenderfgoed.be/werken?titel=knokke&amp;per_pagina=10&amp;pagina=2&gt;; rel="next", &lt;https://bib.onroerenderfgoed.be/werken?titel=knokke&amp;per_pagina=10&amp;pagina=17&gt;; rel="last", &lt;https://bib.onroerenderfgoed.be/werken?titel=knokke&amp;per_pagina=10&amp;pagina=1&gt;; rel="first"</span><br></div></code></pre></div></div>
<p>We got results back, but only a partial set. The <code>Link</code> header tells us there's a <code>next</code> page, a <code>last</code> page and a <code>first</code> page — and since we're on page 1, no <code>previous</code>. We can follow these links to page through the results, or jump straight to the end. Importantly, a client shouldn't assume anything beyond what the links say: you might be tempted to infer, from 17 pages of at most 10 records each, that there are 161–170 results, but the server isn't obliged to make that arithmetic hold, or to put any other information in the link. This does expose a real limitation of <code>Link</code>-header pagination: there's no way to tell how many results there are in total, or how many pages remain. All the client knows is whether there's a <code>next</code> link; if there isn't, you're on the last page, and if <code>next</code> and <code>last</code> are identical, you're on the second-to-last. On the upside, the client needs zero knowledge of the URL's internal structure — no <code>page</code> vs. <code>pagina</code>, no <code>limit</code>/<code>offset</code> — which makes it easy to reuse the same client code across very different webservices. All it needs to know is: if there's a <code>next</code> link, there's more to fetch.</p>
<p>To get the second page:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ curl -G -i -H Accept:application/json https://bib.onroerenderfgoed.be/werken?titel=knokke\&amp;per_pagina=10\&amp;pagina=2</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="all-your-data-belongs-to-us">All your data belongs to us!<a href="https://developers.onroerenderfgoed.be/en/blog/vioe-hypermedia-api#all-your-data-belongs-to-us" class="hash-link" aria-label="Direct link to All your data belongs to us!" title="Direct link to All your data belongs to us!" translate="no">​</a></h2>
<p>To show this off, we wrote a small Python script that queries several of our information systems and handles pagination via the <code>Link</code> header automatically. In Python, the <a href="https://requests.readthedocs.io/en/master/" target="_blank" rel="noopener noreferrer" class="">requests</a> library is the standard tool for REST calls, and conveniently it already has built-in support for the <code>Link</code> header, making it trivial to iterate over every result. For this example, we fetch all images (see <a class="" href="https://developers.onroerenderfgoed.be/en/blog/beeldbank-zoeken">Searching the image database</a>), themes (see <a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-themas-personen-gebeurtenissen">Themes, people and events</a>), heritage and designation objects (see <a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten">Heritage objects and designation objects</a>) for the municipality of <code>Knokke-Heist</code>. It's a short script that drops a large pile of URIs at your feet, chaining calls to the various APIs and following each <code>next</code> link along the way.</p>
<p>Running it prints a long list of URIs — functional, but not exactly satisfying: a URI is great for a machine, but doesn't tell a human much on its own.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="no-context-no-information">No context, no information<a href="https://developers.onroerenderfgoed.be/en/blog/vioe-hypermedia-api#no-context-no-information" class="hash-link" aria-label="Direct link to No context, no information" title="Direct link to No context, no information" translate="no">​</a></h2>
<p>Another interesting technique in the Linked Data world is <a href="https://json-ld.org/" target="_blank" rel="noopener noreferrer" class="">JSON-LD</a> (JSON for Linking Data), which turns plain JSON into linked data by mapping it to RDF through a <code>context</code> — defining which JSON keys correspond to which RDF properties. Here's a simple context you could use on our image database endpoint:</p>
<div class="language-json-ld codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json-ld codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "dct": "http://purl.org/dc/terms/",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "title": "dct:title",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "description": "dct:description",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "uri": "@id"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>This defines a namespace shorthand <code>dct</code> for the Dublin Core Terms namespace, so <code>dct:title</code> stands in for the full <code>http://purl.org/dc/terms/title</code>, and maps <code>uri</code> to <code>@id</code>, JSON-LD's way of marking a record's unique identifier. Applying this context to an image from our image database gives:</p>
<div class="language-json-ld codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json-ld codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "@id": "https://id.erfgoed.net/afbeeldingen/392715",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "http://purl.org/dc/terms/title": "Villa Cools met kinesistenpraktijk",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "http://purl.org/dc/terms/description": ""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>This tells us there's a resource identified by <code>https://id.erfgoed.net/afbeeldingen/392715</code> that can be described with a Dublin Core <code>title</code>. It's common in JSON-LD to also assign a <code>@type</code>, a URI pointing to a class in an RDF vocabulary, so records from different sources stay distinguishable once merged:</p>
<div class="language-json-ld codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json-ld codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">{</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "@id": "https://id.erfgoed.net/afbeeldingen/392715",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "@type": "http://purl.org/dc/dcmitype/Image",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "http://purl.org/dc/terms/title": "Villa Cools met kinesistenpraktijk",</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    "http://purl.org/dc/terms/description": ""</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="once-more-with-feeling">Once more, with feeling<a href="https://developers.onroerenderfgoed.be/en/blog/vioe-hypermedia-api#once-more-with-feeling" class="hash-link" aria-label="Direct link to Once more, with feeling" title="Direct link to Once more, with feeling" translate="no">​</a></h2>
<p>Let's use JSON-LD to improve our script. We want a homogeneous dataset covering everything known about <code>Knokke-Heist</code>, with every record sharing the same structure — so we built two JSON-LD contexts, one for the image database and one shared across the three closely related inventory datasets. Since none of these datasets normally include their own resource type, we add that ourselves. Our inventory system also has a <code>locatie_samenvatting</code> field summarising an object's geographic location — the underlying summarisation logic can get fairly involved (some things sit in more than one street, municipality or even province), but it's very handy for a human glancing at results. The image database has no such field, so we compute a simple equivalent for it (image locations are much simpler than those of heritage objects).</p>
<p>The script fetches everything as before, adds the record type and a location summary for images, then expands it all into JSON-LD using the Python <a href="https://pypi.org/project/PyLD/" target="_blank" rel="noopener noreferrer" class="">pyLD</a> library. That leaves us with valid but unwieldy JSON-LD — every key is now a URI. So we compact it again, using a third context based on Dublin Core Terms, and print the result.</p>
<p>To run this script, install <code>requests</code> and <code>pyLD</code> first. It may take a while for larger municipalities like <code>Gent</code> or <code>Antwerpen</code>. As a bonus, we also wrote a variant that writes the resulting dataset to a CSV instead of printing it — feel free to adapt either script to build your own dataset for another municipality.</p>
<p>If Hypermedia APIs and Linked Data interest you, <a href="https://data.vlaanderen.be/" target="_blank" rel="noopener noreferrer" class="">https://data.vlaanderen.be/</a> has a lot more background and points to the relevant standards and documents, and there's a whole community of Linked Data people happy to answer questions — you'll find a fair number of them on <a href="https://twitter.com/koenedaele/lists/linked-data" target="_blank" rel="noopener noreferrer" class="">Twitter</a>. As always, feel free to <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">get in touch</a> with further questions.</p>]]></content:encoded>
            <category>API</category>
            <category>Hypermedia</category>
        </item>
        <item>
            <title><![CDATA[Flanders Heritage Geoportal: All Together Now!]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/geoportaal-architectuur</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/geoportaal-architectuur</guid>
            <pubDate>Thu, 28 Nov 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Flanders Heritage has run a geoportal since 2013. It's grown and changed a lot since then, but its basic goals and architecture have stayed largely the same.]]></description>
            <content:encoded><![CDATA[<p><a href="https://www.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Flanders Heritage</a> has run a <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">geoportal</a> since 2013. It's grown and changed a lot since then, but its basic goals and architecture have stayed largely the same.</p>
<!-- -->
<p><img decoding="async" loading="lazy" alt="The Flanders Heritage geoportal in 2014" src="https://developers.onroerenderfgoed.be/en/assets/images/geoportaal_2014-e75249399a9e2d02dd027ef4778bd9b0.png" width="1609" height="964" class="img_ev3q"></p>
<p><em>The Flanders Heritage geoportal in 2014</em></p>
<p>Our first and main requirement was something easy to use for a large user base. We'd noticed that other geoportals tended to cater to GIS professionals, often building what amounted to an online desktop GIS — versatile and powerful for people who already know GIS, but inaccessible to everyone else. We wanted an experience closer to Google Maps, tailored specifically to people looking for cultural heritage information in Flanders. We also wanted the geoportal to feel like part of our online information systems, not a separate geodata silo, so we built reports that link back to our online sources through their persistent URIs. Those URIs live as metadata in all our geographical data, tying every feature back to the authentic source application the raw data (geodata included) lives in — so you can always follow the link to see the full set of attributes and everything we know about a resource.</p>
<p><img decoding="async" loading="lazy" alt="The Flanders Heritage geoportal in 2019" src="https://developers.onroerenderfgoed.be/en/assets/images/geoportaal_2019-be33d33483fd17e6774afc9ae9a48f29.png" width="1853" height="953" class="img_ev3q"></p>
<p><em>The Flanders Heritage geoportal in 2019</em></p>
<p>A second requirement came from the data itself. Flanders Heritage creates and publishes geodata about immovable heritage, but not other kinds of geodata, and we didn't want to start doing so just for the geoportal — so we lean heavily on publicly available webservices instead. <a href="https://informatie.vlaanderen.be/" target="_blank" rel="noopener noreferrer" class="">Informatie Vlaanderen</a> (formerly AGIV) has always been our partner for basemaps and non-heritage layers, and we've pulled in other layers too, from bodies like <a href="https://mercator.vlaanderen.be/" target="_blank" rel="noopener noreferrer" class="">Mercator</a> or other countries' agencies (e.g. the Dutch <a href="https://www.cultureelerfgoed.nl/" target="_blank" rel="noopener noreferrer" class="">Cultural Heritage Agency</a>). Informatie Vlaanderen also provides alphanumeric services that help navigate maps: the <a href="https://overheid.vlaanderen.be/informatie-vlaanderen/producten-diensten/centraal-referentieadressenbestand-crab" target="_blank" rel="noopener noreferrer" class="">CRAB service</a> enumerating Flemish address data, the <a href="https://overheid.vlaanderen.be/capakey-rest-service" target="_blank" rel="noopener noreferrer" class="">CAPAKEY service</a> for cadastral parcel data, and a <a href="https://loc.geopunt.be/Help" target="_blank" rel="noopener noreferrer" class="">geolocation service</a> for free-text address search. We wanted to use these services, not copy their data wholesale, as might have happened a decade earlier — we store as little as possible from them, a cache here and there at most, so what we show users always matches the source.</p>
<p>Finally, from a technical standpoint, we wanted open source software (cost-efficient, and a good fit for our stack) and a portal that's simple to maintain while still configurable in detail — easy things (adding a data source) should be easy, hard things (optimising specific requests) should be doable. That philosophy has served us well: a fairly light codebase has kept serving our visitors for years.</p>
<p><img decoding="async" loading="lazy" alt="Software architecture of the Flanders Heritage Geoportal" src="https://developers.onroerenderfgoed.be/en/assets/images/geoportaal_architectuur-4ed0d0076a305ad5f95731f38e7eecff.png" width="1081" height="641" class="img_ev3q"></p>
<p><em>Software architecture of the Flanders Heritage Geoportal</em></p>
<p>So where did those design considerations land us? Like any modern application, the geoportal has a back- and a frontend. The frontend is the bulk of the code (roughly 98% JavaScript, HTML and CSS) — the map layout, UI/UX and general presentation. Since it was written several years ago, it still runs on an older JavaScript framework, <a href="https://dojotoolkit.org/" target="_blank" rel="noopener noreferrer" class="">Dojo</a>, with <a href="https://openlayers.org/" target="_blank" rel="noopener noreferrer" class="">OpenLayers</a> (and <a href="http://proj4js.org/" target="_blank" rel="noopener noreferrer" class="">PROJ4</a>) for mapping, and HTML/CSS built on the Flemish government's corporate style using the <a href="https://foundation.zurb.com/" target="_blank" rel="noopener noreferrer" class="">Zurb Foundation framework</a>. The frontend talks exclusively through services, either to our own geoportal backend or to other webservices.</p>
<p>Those other services are mostly INSPIRE-compliant WMS, WMTS and WFS services hosted across a few parties:</p>
<ul>
<li class=""><a href="https://informatie.vlaanderen.be/" target="_blank" rel="noopener noreferrer" class="">Informatie Vlaanderen</a> hosts a large number of reference datasets — basemaps, aerial photography, historic maps, address data, cadastral parcels — through the official <a href="https://www.geopunt.be/" target="_blank" rel="noopener noreferrer" class="">Flemish INSPIRE node</a>.</li>
<li class=""><a href="https://mercator.vlaanderen.be/" target="_blank" rel="noopener noreferrer" class="">Mercator</a> is an INSPIRE subnode hosting datasets for the Environment policy domain, a cluster of Flemish Government entities covering topics like Environment, Pollution, Energy, Heritage and Spatial Planning. Flanders Heritage publishes its own INSPIRE-compliant heritage data through this subnode.</li>
<li class="">While end users typically harvest our layers via Mercator, for our own geoportal we run our own <a href="http://geoserver.org/" target="_blank" rel="noopener noreferrer" class="">Geoserver</a> instance, giving us more control over presentation and letting us keep a few internal or authenticated-only layers unpublished.</li>
<li class="">We've also included Dutch INSPIRE heritage layers from our colleagues at the <a href="https://english.cultureelerfgoed.nl/" target="_blank" rel="noopener noreferrer" class="">Cultural Heritage Agency</a> — heritage doesn't respect political borders, so it's useful for our users to see across them, and consuming another party's published WMS is easy.</li>
</ul>
<p>We also use a few non-INSPIRE layers: <a href="https://www.openstreetmap.org/" target="_blank" rel="noopener noreferrer" class="">OpenStreetMap</a> as a solid general basemap, the NGI topographical map for those interested, and, mostly for fun, the <a href="https://dare.ht.lu.se/" target="_blank" rel="noopener noreferrer" class="">Pelagios map of the Roman World</a>.</p>
<p>The geoportal backend is a simple Python application built on the <a href="https://trypyramid.com/" target="_blank" rel="noopener noreferrer" class="">Pyramid framework</a>. Besides serving the frontend's static files, its main job is proxying a few location services from Informatie Vlaanderen:</p>
<ul>
<li class=""><a href="https://loc.geopunt.be/Help" target="_blank" rel="noopener noreferrer" class="">Geolocation</a>, suggesting addresses from free-text input and returning coordinates — a quick way to navigate the map.</li>
<li class=""><a href="https://overheid.vlaanderen.be/informatie-vlaanderen/producten-diensten/centraal-referentieadressenbestand-crab" target="_blank" rel="noopener noreferrer" class="">CRAB</a>, a more exhaustive service with full address data (municipalities, streets, house numbers and their locations). We use it across most of our systems to validate incoming data; in the geoportal it's a navigational aid, letting users drill down from province to municipality to street to address.</li>
<li class=""><a href="https://overheid.vlaanderen.be/capakey-rest-service" target="_blank" rel="noopener noreferrer" class="">CAPAKEY</a>, a REST service with parcel data (municipalities, cadastral divisions, sections and parcel numbers), similarly used to guide users through the Belgian cadastral system to a specific parcel.</li>
</ul>
<p>These three services are now freely and openly available, so proxying them might seem less necessary than it did when we started in 2013:</p>
<ul>
<li class="">Early on, both CRAB and CAPAKEY were SOAP services, hard or impossible to call directly from browser JS. CAPAKEY has since moved to REST, but CRAB is still SOAP. Both also originally required authentication, so proxying let us shield the credentials.</li>
<li class="">It frees us from wrestling with CORS headers — we already use CORS a lot, but getting it all to cooperate can be a hassle, and the Geolocation service doesn't support CORS at all, which would otherwise force us into something like JSON-P.</li>
<li class="">It insulates us from upstream API changes: since our applications always call our own proxies, only the proxy needs to track an upstream change (like CAPAKEY's SOAP-to-REST move), keeping the impact on our systems minimal and contained.</li>
<li class="">The CRAB and CAPAKEY proxies double as caches, cutting the number of calls to the upstream services significantly.</li>
<li class="">We've extended these services in a few small ways for our own needs — adding a list of Flemish provinces (present in neither CRAB nor CAPAKEY), and incorporating a <a href="https://pypi.org/project/pycountry/" target="_blank" rel="noopener noreferrer" class="">list of country codes</a> for address validation.</li>
</ul>
<p>If you need Flemish address or parcel data yourself and work in Python, feel free to use our <a href="https://pypi.org/project/crabpy/" target="_blank" rel="noopener noreferrer" class="">CRABpy</a> library; if you're on <a href="https://trypyramid.com/" target="_blank" rel="noopener noreferrer" class="">Pyramid</a>, <a href="https://pypi.org/project/crabpy_pyramid/" target="_blank" rel="noopener noreferrer" class="">CRABpy_pyramid</a> simplifies integrating it and adds a set of opinionated JSON views on top.</p>
<p>The other major backend component is an open source project called <a href="https://mapproxy.org/" target="_blank" rel="noopener noreferrer" class="">Mapproxy</a>, which solved what was for a while the hardest part of building the geoportal: dealing with non-publicly-accessible spatial data. Our prime example is a database of archaeological findspots that, for several reasons, isn't public — the data isn't part of INSPIRE, but does have WMS/WFS services on our own Geoserver, protected by username and password. Including that service directly in our frontend would expose those credentials to clients; Mapproxy solves this by proxying the service on our geoportal server and handling authentication and authorisation itself, letting us translate the same Pyramid authentication/authorisation policies we use in all our web applications into rules about which GIS layers are visible to whom.</p>
<p>Beyond this security-related proxying, we also route WMS GetFeatureInfo requests through Mapproxy to avoid CORS issues, and may make more use of its caching features down the line, though we haven't yet.</p>
<p>All told, our <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">geoportal</a> has proven to be an important platform, used by roughly 12,000 people a month in fairly intensive sessions, while remaining cheap to build and run — it needs very little in the way of resources itself, since the heavy lifting is done by underlying services shared with other applications and processes. Interested in the setup? Browse the geoportal, check our libraries on <a href="https://github.com/onroerenderfgoed" target="_blank" rel="noopener noreferrer" class="">GitHub</a>, read more posts tagged <a class="" href="https://developers.onroerenderfgoed.be/en/blog/tags/geoportaal">geoportaal</a>, or drop us a line at <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">ict@onroerenderfgoed.be</a>.</p>]]></content:encoded>
            <category>Geoportaal</category>
            <category>Geoserver</category>
        </item>
        <item>
            <title><![CDATA[Welcome to the Ilucidare Playground]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/ilucidare</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/ilucidare</guid>
            <pubDate>Wed, 20 Nov 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Flanders Heritage Agency is a government agency and scientific institution responsible for architectural, archaeological, landscape and maritime heritage. Today we're taking part in the Ilucidare Playground: Cracking the future of heritage. We bring new technologies and paradigms together with our responsibility for heritage, to improve preservation, support decision-making and management, and inform the public. Here are a few concrete results of that innovation-driven approach.]]></description>
            <content:encoded><![CDATA[<p><a href="https://www.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Flanders Heritage Agency</a> is a government agency and scientific institution responsible for architectural, archaeological, landscape and maritime heritage. Today we're taking part in the <a href="https://ilucidare.eu/" target="_blank" rel="noopener noreferrer" class="">Ilucidare Playground: Cracking the future of heritage</a>. We bring new technologies and paradigms together with our responsibility for heritage, to improve preservation, support decision-making and management, and inform the public. Here are a few concrete results of that innovation-driven approach.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="no-innovation-without-dissemination">No innovation without dissemination<a href="https://developers.onroerenderfgoed.be/en/blog/ilucidare#no-innovation-without-dissemination" class="hash-link" aria-label="Direct link to No innovation without dissemination" title="Direct link to No innovation without dissemination" translate="no">​</a></h2>
<p>Innovation often brings technology to mind, but society itself is innovating constantly too — sometimes driving technological progress, sometimes following it. One of the past decade's clearest shifts has been toward openness: open source software, open data and open access are central to today's information-driven society. Both Flanders Heritage and the Flemish Government support open data and open access. On the open data side, the government has adopted the <a href="https://smart.flanders.be/" target="_blank" rel="noopener noreferrer" class="">Smart Flanders Open Data Charter</a>; Flanders Heritage has published several open datasets, such as our <a href="https://thesaurus.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">thesauri and controlled vocabularies</a>, under the Flemish open data licence, and we also publish the <a href="https://atramhasis.readthedocs.io/en/latest" target="_blank" rel="noopener noreferrer" class="">software used to maintain them</a> as <a href="https://github.com/onroerendErfgoed" target="_blank" rel="noopener noreferrer" class="">open source</a>.</p>
<p>On scholarly open access, we aim to make all our publications freely available. Nearly all research output is published through <a href="https://oar.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">OAR, our Open Access Repository</a>. In recent years we've invested in digitising publications by our predecessors, and now have an online archive going back to the eighties, all freely downloadable. Digitisation might sound trivial — scan it, put it online — but copyright and the effort of producing good metadata make it more work than it looks. It's paid off: since digitising and publishing our back catalogue, monthly downloads have doubled, and we now see around 15,000 publications consulted digitally every month.</p>
<p><img decoding="async" loading="lazy" alt="Number of downloads per month from OAR" src="https://developers.onroerenderfgoed.be/en/assets/images/ilucidare_oar_downloads_per_month-2747bf1973050c83360ffee041d4fa58.png" width="1600" height="480" class="img_ev3q"></p>
<p><em>Number of downloads per month from OAR</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pictures-or-it-didnt-happen">Pictures or it didn't happen<a href="https://developers.onroerenderfgoed.be/en/blog/ilucidare#pictures-or-it-didnt-happen" class="hash-link" aria-label="Direct link to Pictures or it didn't happen" title="Direct link to Pictures or it didn't happen" translate="no">​</a></h2>
<p>While our publications are still very much a written information channel, visual information matters more and more today. Heritage professionals have documented heritage and its condition ever since cameras existed, and digital cameras — more recently smartphones with good cameras — have only accelerated this. We estimate a few million pictures circulate within our agency, in both analog and digital form. In 2019 we launched a new online <a href="https://beeldbank.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">image database</a> holding some 280,000 images of heritage in Flanders, some recent, some digitised from analog archive material. Reusability mattered a lot here too: where possible, images are published under an open licence allowing reuse, even commercially, as long as attribution is given.</p>
<p><img decoding="async" loading="lazy" alt="A set of images in the image database found by searching for &amp;quot;Bijloke&amp;quot;" src="https://developers.onroerenderfgoed.be/en/assets/images/ilucidare_images_bijloke-834767a3621959add299e94f5b39c6b4.png" width="1837" height="949" class="img_ev3q"></p>
<p><em>A set of images in the image database found by searching for "Bijloke"</em></p>
<p>The system has been running for a while and has proven our basic needs are covered, so we're now tackling more complex problems. First, GDPR and privacy: while our pictures are taken in public places, things like license plates and faces count as sensitive data. We have manual review procedures, but they're slow and labour-intensive, so we're exploring automatic detection and blurring of license plates and faces with <a href="https://opencv.org/" target="_blank" rel="noopener noreferrer" class="">OpenCV</a>. Results for license plates have been good; results for faces more mixed, likely because license plates follow a simple, predictable format, while facial detection tends to be a bit too eager — it has a habit of flagging paintings, sculptures or billboards as faces too. More tuning is needed before this is ready for large-scale use.</p>
<p><img decoding="async" loading="lazy" alt="The license plate on the left was automatically blurred with OpenCV" src="https://developers.onroerenderfgoed.be/en/assets/images/ilucidare_plate_censor-8115d2eb5cd391c6fe0de4045163a983.jpg" width="4230" height="3096" class="img_ev3q"></p>
<p><em>The license plate on the left was automatically blurred with OpenCV</em></p>
<p>Another avenue is automated duplicate detection. As in any large organisation, files get copied, distributed and emailed repeatedly, and images end up in multiple places — costing storage and, since every image needs metadata, duplicating that effort too. We're exploring automatic duplicate detection; <a href="https://www.pyimagesearch.com/2017/11/27/image-hashing-opencv-python/" target="_blank" rel="noopener noreferrer" class="">image hashing</a> looks promising, and we'll likely settle on the <code>dHash</code> algorithm. We're now working out how to integrate this properly into our archiving workflows so colleagues benefit without needing to deal with the technical details — innovation only really pays off once it comes with usability.</p>
<p>As a government agency dealing with immovable cultural heritage, almost everything we collect has a spatial dimension, and our images are no exception. Nearly every picture we take shows some form of immovable heritage — an archaeological site, a cultural landscape, a building, a cemetery, or something else — so we've put real effort into geolocating the images in our database. Older images are linked to the <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten_info" target="_blank" rel="noopener noreferrer" class="">heritage objects</a> they depict and inherit their location; newer images rely on the automatic geolocation built into modern smartphones and cameras. The resulting GIS layer of point locations can be visualised on our <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">geoportal</a> or <a href="https://geo.onroerenderfgoed.be/downloads" target="_blank" rel="noopener noreferrer" class="">downloaded</a> for your own use, and every picture links through to the image database for more information, download and reuse — provided you respect the licence.</p>
<p><img decoding="async" loading="lazy" alt="A view of the Bijloke site in Ghent with all known images of this area" src="https://developers.onroerenderfgoed.be/en/assets/images/ilucidare_geoportal_images-a0df7e2ccdb0c8c1428d565883cda466.png" width="1852" height="950" class="img_ev3q"></p>
<p><em>A view of the Bijloke site in Ghent with all known images of this area</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="give-me-a-map-and-ill-never-get-lost">Give me a map and I'll never get lost<a href="https://developers.onroerenderfgoed.be/en/blog/ilucidare#give-me-a-map-and-ill-never-get-lost" class="hash-link" aria-label="Direct link to Give me a map and I'll never get lost" title="Direct link to Give me a map and I'll never get lost" translate="no">​</a></h2>
<p>Nearly everything we do has a spatial component, which makes maps essential to us. As a government agency we publish INSPIRE-compliant datasets, distributed through the <a href="https://inspire.ec.europa.eu/" target="_blank" rel="noopener noreferrer" class="">INSPIRE network across Europe</a> — aimed mostly at professional GIS users on their own desktop software. But we felt we were missing part of our audience: people who just want to quickly find out what's known about their neighbourhood, their property, or a place they remember from childhood. That's why we built our own <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Geoportal</a>, a website where a regular, non-GIS user can browse a (hopefully) intuitive map of Flanders and see what heritage is present — the aim was something like "Google Maps for Heritage." It's no longer new, but it's still very popular, and because it's optimised for heritage data specifically, it works better for that purpose than a general-purpose portal. For general spatial data we point people to <a href="https://geopunt.be/" target="_blank" rel="noopener noreferrer" class="">Geopunt</a>, the Flemish Government's geoportal for all spatial data — it holds far more data than we need, but isn't optimised for heritage information specifically.</p>
<p><img decoding="async" loading="lazy" alt="The current-day city of Zottegem and its listed heritage as seen on the Villaret map (1745-1748)" src="https://developers.onroerenderfgoed.be/en/assets/images/ilucidare_geoportal_sotteghem-ceb2eeb62920cd8e8cc1800481f5bfbb.png" width="1852" height="952" class="img_ev3q"></p>
<p><em>The current-day city of Zottegem and its listed heritage as seen on the Villaret map (1745-1748)</em></p>
<p>First-time visitors to the <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Geoportal</a> are asked to pick one of two profiles — preset combinations of map layers, one a good default for most people, the other tuned for users focused on the legal side of heritage (actuaries, real-estate agents, property developers, other government bodies, and so on). You can always load other layers too. Some point to our other systems, like the image database mentioned above, or archaeological survey reports submitted by archaeologists. Base layers include several orthophoto layers as well as historical maps, some dating back to the 18th and 19th centuries — some supplied by <a href="https://overheid.vlaanderen.be/informatie-vlaanderen" target="_blank" rel="noopener noreferrer" class="">Informatie Vlaanderen</a>, others, like the <a href="https://www.onroerenderfgoed.be/nieuws/oudste-kaart-van-belgie-als-gratis-open-data" target="_blank" rel="noopener noreferrer" class="">Villaret map (1745–1748)</a>, digitised by us in cooperation with them.</p>
<p>Have a look at <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">our portal</a>, browse the map, and dig into the places and pictures you find there.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-points-become-clouds-of-information">When points become clouds of information<a href="https://developers.onroerenderfgoed.be/en/blog/ilucidare#when-points-become-clouds-of-information" class="hash-link" aria-label="Direct link to When points become clouds of information" title="Direct link to When points become clouds of information" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="The city of Damme and its fortifications as seen on the multidirectional hillshade" src="https://developers.onroerenderfgoed.be/en/assets/images/ilucidare_geoportal_damme-737a8419e88266fd899c873c0d47ed80.png" width="1851" height="953" class="img_ev3q"></p>
<p><em>The city of Damme and its fortifications as seen on the multidirectional hillshade</em></p>
<p>One last mapping project to close with. Our colleagues at <a href="https://overheid.vlaanderen.be/informatie-vlaanderen" target="_blank" rel="noopener noreferrer" class="">Informatie Vlaanderen</a> created the <a href="https://overheid.vlaanderen.be/informatie-vlaanderen/producten-diensten/digitaal-hoogtemodel-dhmv" target="_blank" rel="noopener noreferrer" class="">Digitaal Hoogtemodel Vlaanderen (DHMV)</a>, a <a href="https://en.wikipedia.org/wiki/Lidar" target="_blank" rel="noopener noreferrer" class="">LIDAR</a> dataset consisting of a Digital Surface Model and a Digital Terrain Model, together giving height data that lets us visualise the Flemish terrain in different ways. While the raw data is open, turning it into a useful visualisation takes real expertise, so a few standard renderings have been available for a while. We knew it was possible to create <a href="https://oar.onroerenderfgoed.be/item/452" target="_blank" rel="noopener noreferrer" class="">visualisations better suited to archaeologists</a>, allowing easier detection of archaeological sites through micro-topology, so Flanders Heritage and Informatie Vlaanderen collaborated on <a href="https://www.onroerenderfgoed.be/blog/vlaanderen-onder-de-scanner-twee-hoge-resolutie-verwerkingen-van-het-dhm-vlaanderen-ii-online" target="_blank" rel="noopener noreferrer" class="">two new renderings of the DHMV</a> and <a href="https://www.onroerenderfgoed.be/nieuws/hoge-resolutie-verwerkingen-van-het-digitale-hoogtemodel-vlaanderen-online-beschikbaar" target="_blank" rel="noopener noreferrer" class="">published them</a>. Each uses different techniques and parameters, so which one helps depends on what you're looking for.</p>
<p><img decoding="async" loading="lazy" alt="Trenches and a fortress near Kapellen as seen on the skyview factor" src="https://developers.onroerenderfgoed.be/en/assets/images/ilucidare_geoportal_trenches-8494b7af94967d54b3636330f2885b06.png" width="1854" height="952" class="img_ev3q"></p>
<p><em>Trenches and a fortress near Kapellen as seen on the skyview factor</em></p>
<p>The result has proven genuinely useful to archaeologists in their day-to-day work — glancing at these two layers, either on the Geoportal or downloaded into their own GIS, lets them quickly judge the potential of a site or location. To try it, head to the <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Geoportal</a> and select them under <code>Layers &gt; Background layers &gt; Digital Elevation Model &gt; DHMV II, multidirectional hillshade or DHMV II, skyview factor</code>. This project has been more successful than we expected, and its impact has reached well beyond archaeology and cultural heritage — it was even nominated for a <a href="https://datanewscio.be/" target="_blank" rel="noopener noreferrer" class="">Datanews ICT Project of the Year</a> and an <a href="https://www.agoria.be/nl/Agoria-e-Gov-Awards-2019-And-the-nominees-are" target="_blank" rel="noopener noreferrer" class="">Agoria e-Gov Award Open Data</a>.</p>
<p>We hope this shows there's a real synergy between heritage and technology as we move further into the 21st century. Like every organisation, technology has become deeply woven into our daily operations. As Satya Nadella, Microsoft's CEO, put it: "Every company is now a software company" — and the same holds for a government agency or a cultural heritage institution. Software is everywhere, digital is everywhere, and even though our cultural heritage is still largely analog, the tools and information sources we use to study it no longer are, and never will be again.</p>
<p>Questions? <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">Get in touch</a>, browse the rest of this blog, check out our <a href="https://github.com/onroerendErfgoed" target="_blank" rel="noopener noreferrer" class="">open source projects</a>, or visit our <a href="https://www.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">website</a>.</p>]]></content:encoded>
            <category>Innovation</category>
            <category>Geoportaal</category>
            <category>Beeldbank</category>
            <category>OAR</category>
        </item>
        <item>
            <title><![CDATA[Searching the image database]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/beeldbank-zoeken</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/beeldbank-zoeken</guid>
            <pubDate>Thu, 31 Oct 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[We've talked a lot recently about the new inventory (Ten years of the inventory), but in 2019 we also launched a new image database ("beeldbank"). It replaces both an old module of the inventory and VIOE's earlier image database, and now holds around 277,000 images, most of which can be freely reused as long as you follow the terms of reuse. Today we explain how to make the most of its search functions.]]></description>
            <content:encoded><![CDATA[<p>We've talked a lot recently about the new inventory (<a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-nieuw">Ten years of the inventory</a>), but in 2019 we also launched a new <a href="https://beeldbank.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">image database</a> ("beeldbank"). It replaces both an old module of the inventory and VIOE's earlier image database, and now holds around 277,000 images, most of which can be freely reused as long as you follow the <a href="https://beeldbank.onroerenderfgoed.be/hergebruik" target="_blank" rel="noopener noreferrer" class="">terms of reuse</a>. Today we explain how to make the most of its search functions.</p>
<!-- -->
<p><img decoding="async" loading="lazy" alt="The image database homepage" src="https://developers.onroerenderfgoed.be/en/assets/images/beeldbank_home-a2bd2a6b401406430be4eb47449ff1a2.png" width="1838" height="953" class="img_ev3q"></p>
<p><em>The image database homepage</em></p>
<p>On the <a href="https://beeldbank.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">image database's homepage</a>, a simple search bar at the top lets you search on one or more terms, like any typical search engine. Search for <code>Knokkestraat</code>, for instance, and you get 18 results sorted by relevance — just like the inventory (<a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-full-text">Full-text search in the inventory</a>), the most "Knokkestraat-like" result comes first: a set of images of houses on Knokkestraat in Knokke-Heist, where the street name appears both in the title and the address. Next come images from Knokkestraat in Diksmuide, Zwevegem and Wachtebeke, where the name is in the title but not the address.</p>
<p><img decoding="async" loading="lazy" alt="Images matching &amp;quot;Knokkestraat&amp;quot; with facets" src="https://developers.onroerenderfgoed.be/en/assets/images/beeldbank_knokkestraat-132162865066e59338e81d18436210af.png" width="1837" height="953" class="img_ev3q"></p>
<p><em>Images matching the search term "knokkestraat", with a few facets</em></p>
<p>On this results page you can refine using facets: filters on the dataset such as <code>Province</code>, <code>Municipality</code>, <code>Year</code>, <code>Creator</code> and <code>License</code>. Each facet shows every possible value along with a count — so you can see at a glance there are 8 images from Knokke-Heist and just 1 from Diksmuide. The <code>License</code> facet shows the terms under which an image may be reused.</p>
<p>The free-text field supports the same full-text search operators as the inventory:</p>
<ul>
<li class="">Multiple terms are implicitly combined with AND: <code>molen knokke</code> is the same as <code>molen &amp; knokke</code>.</li>
<li class="">Use <code>|</code> for OR: <a href="https://beeldbank.onroerenderfgoed.be/images?text=molen+%7C+knokke" target="_blank" rel="noopener noreferrer" class=""><code>molen | knokke</code></a>.</li>
<li class="">Use <code>-</code> right before a term for NOT: <a href="https://beeldbank.onroerenderfgoed.be/images?text=molen+-knokke" target="_blank" rel="noopener noreferrer" class=""><code>molen -knokke</code></a>.</li>
<li class="">Treat multiple words as one term with quotes: search <code>van daele</code> and you get 7 images containing both <code>van</code> and <code>daele</code>, but search <a href="https://beeldbank.onroerenderfgoed.be/images?text=%22van+daele%22" target="_blank" rel="noopener noreferrer" class=""><code>"van daele"</code></a> and you only get images by the photographer of that name.</li>
<li class="">Use a postfix wildcard <code>*</code> to search part of a word (only at the end): <a href="https://beeldbank.onroerenderfgoed.be/images?text=roze*" target="_blank" rel="noopener noreferrer" class=""><code>roze*</code></a> matches <code>rozendale</code>, <code>rozeveldstraat</code> and <code>rozebeekstraat</code> alike.</li>
<li class="">Use parentheses <code>()</code> to group operators: <a href="https://beeldbank.onroerenderfgoed.be/images?text=dorp*+%28knokke-heist%7Cbrugge%29" target="_blank" rel="noopener noreferrer" class=""><code>dorp* (knokke-heist | brugge)</code></a> finds images with a term starting with <code>dorp</code>, combined with either <code>knokke-heist</code> or <code>brugge</code>.</li>
</ul>
<p>Keep in mind the general search field matches words, which can refer to "a municipality" just as easily as something else — searching <code>brugge*</code> finds both images of bridges (<em>bruggen</em>) and images from the municipality of Bruges (<em>Brugge</em>). Our search engine ranks results by relevance by default: an image where a term appears more often ranks higher, and certain fields (title, location, description) weigh more than others. If you'd rather not have that, change the <code>Sort by</code> field on the results page to title or capture date.</p>
<p>Full-text search combines cleanly with facets: search <code>brugge*</code> and tick the year <code>2019</code>, and you'll see every 2019 image with a term starting with <code>brugge</code>.</p>
<p><img decoding="async" loading="lazy" alt="A heritage object in the inventory with links to the image database" src="https://developers.onroerenderfgoed.be/en/assets/images/beeldbank_erfgoedobject_met_afbeeldingen-2f571354889008dc3865a30af6604f78.png" width="1841" height="952" class="img_ev3q"></p>
<p><em>A heritage object in the immovable heritage inventory, with links to the image database</em></p>
<p>Besides the search form, there are other ways to find images. Most images are linked to the <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">immovable heritage inventory</a>: look up a heritage object there and you'll see a selection of images, with a link to view all of them.</p>
<p><img decoding="async" loading="lazy" alt="Image database images shown on the geoportal" src="https://developers.onroerenderfgoed.be/en/assets/images/beeldbank_geoportaal-a700940c76c5f2889459b65b0f492dc1.png" width="1852" height="953" class="img_ev3q"></p>
<p><em>Viewing image database images on the geoportal</em></p>
<p>You can also use our <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">geoportal</a>, which has an optional <code>Beeldbank</code> layer (off by default, toggle it under <code>Layers</code>). Once enabled, camera icons appear once you're zoomed in far enough; click one to see all images at that location. This layer can also be <a href="https://geo.onroerenderfgoed.be/downloads" target="_blank" rel="noopener noreferrer" class="">downloaded</a> and integrated into your own GIS workflow — the attribute table includes a download link for every available format.</p>
<p>So there are several ways to find images in our image database. Just remember to respect the license terms and credit everyone appropriately for their work. Questions or suggestions are welcome at <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">ict@onroerenderfgoed.be</a>.</p>]]></content:encoded>
            <category>Beeldbank</category>
            <category>Search</category>
            <category>Full-text</category>
        </item>
        <item>
            <title><![CDATA[Themes, people and events]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/inventaris-themas-personen-gebeurtenissen</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/inventaris-themas-personen-gebeurtenissen</guid>
            <pubDate>Mon, 30 Sep 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[On May 13 we launched a brand new Flanders Heritage Inventory, with five datasets: heritage objects, designation objects, people, themes and events. Heritage objects and designation objects already covered the core of the inventory; this time we look at the three supporting datasets.]]></description>
            <content:encoded><![CDATA[<p>On May 13 we <a href="https://www.onroerenderfgoed.be/nieuws/inventaris-onroerend-erfgoed-vernieuwd" target="_blank" rel="noopener noreferrer" class="">launched</a> a brand new <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Flanders Heritage Inventory</a>, with five datasets: heritage objects, designation objects, people, themes and events. <a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten">Heritage objects and designation objects</a> already covered the core of the inventory; this time we look at the three supporting datasets.</p>
<!-- -->
<p>The <strong>people and collectives</strong> dataset has existed since the very first inventory launched in May 2009. It holds people and organisations who played a role in creating the heritage we describe: architects, contractors, master builders, clients, artists, sculptors, and so on. The dataset emerged in 2007–2009 while assigning thesaurus terms to heritage objects. Until then, heritage objects were mostly documents, which made searching harder — especially with common surnames, finding "all buildings by a particular architect" was difficult. (Did you know there was once an architect named <a href="https://inventaris.onroerenderfgoed.be/personen/7927" target="_blank" rel="noopener noreferrer" class="">Baksteen</a>, literally "Brick"?) So alongside the thesauri, we also built an authority file holding canonical versions of the designers and other people involved. For the agency, this dataset — like our thesauri — isn't a core dataset in its own right: without the inventory, we wouldn't need it at all.</p>
<p>Over the years the dataset has grown into a fine cross-section of designers, artists and architects who shaped Flanders' heritage. Where possible we enrich each entry with other known names, birth and death dates (or founding dates for organisations), places lived or worked, professions, education, and a short biography, and we link every person or collective to the heritage objects they're connected to as designer, builder, or client. Our people dataset is, in effect, a quick who's who of Flemish immovable heritage.</p>
<p>The <strong>events</strong> dataset has also existed since May 2009, though for a long time it was only accessible internally. An event is an action performed at a given moment by one or more people or organisations — in practice, limited to actions on or about immovable heritage. That can be something as small as measuring a tree, an excavation or a site inspection, up to a large project like an <a href="https://inventaris.onroerenderfgoed.be/gebeurtenissen/921" target="_blank" rel="noopener noreferrer" class="">inventory campaign</a>. It always comes down to: X and Y performed work of type A at location L, from date I to date J. We sometimes add an extended text description with links to further sources, aiming to explain how a piece of information came about. So for a given heritage object you can see which inventory campaign first recorded it, when it was re-surveyed, and when its address was last checked.</p>
<p>The third dataset, <strong>themes</strong>, has two subtypes: one that already existed in the 2009 inventory, and one added fairly recently. A theme provides context around heritage objects, so certain information doesn't need to be repeated on every individual object. The first themes, added in 2014, fall under <code>content themes</code> — usually a combination of typology, style or period, and location, such as <a href="https://inventaris.onroerenderfgoed.be/themas/37" target="_blank" rel="noopener noreferrer" class="">First World War military defences in the front zone</a>, <a href="https://inventaris.onroerenderfgoed.be/themas/79" target="_blank" rel="noopener noreferrer" class="">Welcome trees</a>, or <a href="https://inventaris.onroerenderfgoed.be/themas/17271" target="_blank" rel="noopener noreferrer" class="">Prehistoric barrow complexes and urnfields</a>. With the launch of the new inventory, older descriptions of geographic areas were converted into <code>geographic themes</code> — the old municipality and street introductions from the <code>Bouwen door de Eeuwen Heen</code> series, which, like the content themes, provide context, but purely based on location. That's where you can read more about the historic core of Ghent, <a href="https://inventaris.onroerenderfgoed.be/themas/7250" target="_blank" rel="noopener noreferrer" class="">Lippenslaan in Knokke</a>, or <a href="https://inventaris.onroerenderfgoed.be/themas/13659" target="_blank" rel="noopener noreferrer" class="">the port of Antwerp</a>. Some of these theme pages are among our most-visited, and are often used by outside parties as historical context.</p>
<p>None of these three datasets forms the essence of the immovable heritage inventory, but together they make it more interesting and more useful. Want to know more about the new inventory? Read <a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-nieuw">Ten years of the inventory</a>. Questions or suggestions are welcome at <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">ict@onroerenderfgoed.be</a>.</p>]]></content:encoded>
            <category>Inventaris</category>
            <category>Themes</category>
            <category>People</category>
            <category>Events</category>
        </item>
        <item>
            <title><![CDATA[Ten years of the inventory]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/inventaris-nieuw</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/inventaris-nieuw</guid>
            <pubDate>Wed, 14 Aug 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Since May 13, a brand new inventory has been live at https the data is still the same heritage Flanders is rich in. Behind the scenes, though, plenty changed — the underlying technology was rewritten from scratch. Today we look back at ten years of technological evolution behind the inventory.]]></description>
            <content:encoded><![CDATA[<p>Since May 13, a <a href="https://www.onroerenderfgoed.be/nieuws/inventaris-onroerend-erfgoed-vernieuwd" target="_blank" rel="noopener noreferrer" class="">brand new inventory</a> has been live at <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">https://inventaris.onroerenderfgoed.be</a>. It looks very different, but anyone who knew the previous version will recognise a lot: the data is still the same heritage Flanders is rich in. Behind the scenes, though, plenty changed — the underlying technology was rewritten from scratch. Today we look back at ten years of technological evolution behind the inventory.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-was-new-then-is-old-now">What was new then is old now<a href="https://developers.onroerenderfgoed.be/en/blog/inventaris-nieuw#what-was-new-then-is-old-now" class="hash-link" aria-label="Direct link to What was new then is old now" title="Direct link to What was new then is old now" translate="no">​</a></h2>
<p>The new inventory follows the technological principles and architecture Flanders Heritage Agency has used since 2014, following the merger of the <code>Flemish Institute for Immovable Heritage</code> (VIOE) and the <code>Ruimte en Erfgoed</code> agency. At the time, the agency had a very diverse technology landscape, and it was quickly decided to move to a new technology stack.</p>
<p>VIOE already had a strong preference for open source software, and that choice was kept: on the systems side we stuck with *nix servers (Debian or Ubuntu), and on the database side <a href="https://www.postgresql.org/" target="_blank" rel="noopener noreferrer" class="">PostgreSQL</a> remained the obvious choice — no licensing cost, ample capacity for our volumes, and with the <a href="https://postgis.net/" target="_blank" rel="noopener noreferrer" class="">PostGIS</a> plugin, an excellent GIS engine.</p>
<p>The biggest change was the choice of programming language. Where VIOE had developed in PHP and <code>Ruimte en Erfgoed</code> worked with Java and .NET, the new agency settled on <code>Python</code>. Of the three major Python web frameworks available at the time (<a href="https://www.djangoproject.com/" target="_blank" rel="noopener noreferrer" class="">Django</a>, <a href="https://flask.pocoo.org/" target="_blank" rel="noopener noreferrer" class="">Flask</a> and <a href="https://trypyramid.com/" target="_blank" rel="noopener noreferrer" class="">Pyramid</a>), we ultimately went with <code>Pyramid</code>. <a href="https://www.elastic.co/" target="_blank" rel="noopener noreferrer" class="">Elasticsearch</a> was added for fast search over large datasets, and <a href="https://redis.io/" target="_blank" rel="noopener noreferrer" class="">Redis</a> for caches and queues handling asynchronous jobs.</p>
<p>Our frontends have since used a CSS framework like <a href="https://foundation.zurb.com/" target="_blank" rel="noopener noreferrer" class="">Foundation</a>, and like many other web developers, we made the move to Single Page Applications (SPAs) — web applications running largely on JavaScript, talking to the backend continuously through REST services. We use those heavily for management environments and complex applications like our <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">geoportal</a>; for public-facing pages we deliberately keep things functional with minimal JavaScript, so they work well on older devices and index cleanly for search engines. Our first SPAs used <a href="https://dojotoolkit.org/" target="_blank" rel="noopener noreferrer" class="">Dojo</a>; more recent applications use <a href="https://aurelia.io/" target="_blank" rel="noopener noreferrer" class="">Aurelia</a>.</p>
<p>Where the old inventory started out on classic HTML forms and HTTP POST requests, it evolved over the past decade toward a system built around REST services. In the new inventory, as in all our current applications, we followed that through fully: we built a Resource Oriented Architecture, moving from a few large, monolithic applications to a network of smaller, more focused applications each with their own specialisation. The new inventory is now the central component of that network.</p>
<p>Deployment and operations changed just as much: ten years ago we made manual changes on a handful of servers in a single data centre; today we run automated deploys across two data centres, using <code>Ansible</code> for base server setup, <code>fabric</code> for rolling out applications, and <code>Alembic</code> for managing version-controlled database schemas.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="its-not-just-the-technology-that-changes">It's not just the technology that changes<a href="https://developers.onroerenderfgoed.be/en/blog/inventaris-nieuw#its-not-just-the-technology-that-changes" class="hash-link" aria-label="Direct link to It's not just the technology that changes" title="Direct link to It's not just the technology that changes" translate="no">​</a></h2>
<p>Technology wasn't the only thing that changed — the content and focus evolved just as much. When we launched the inventory in 2009, the <code>Flemish Institute for Immovable Heritage</code> had just been founded as a scientific institution that, for the first time, brought together research into archaeology, built heritage and landscapes. Several inventories and information systems (databases, but also books like <code>Bouwen door de Eeuwen Heen</code>) came under shared management for the first time. Since those systems each had their own angle, the first version of the <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Flanders Heritage Inventory</a> was conceived as a portal: one look and feel, but each inventory kept its own data model. At launch in May 2009, the portal held the built-heritage inventory and the WWI heritage inventory, plus supporting modules for images, events and thesaurus terms.</p>
<p>Between 2009 and 2015, new modules were added: organs, archaeological zones, historic gardens and parks, heritage trees and woody plantings, landscape anchor points, and maritime heritage. It quickly became clear that despite methodological differences (a building gets demolished, a tree gets felled), these inventories were essentially doing the same thing: describing what heritage exists where, documented with images, descriptions and thesaurus terms. Every new module was therefore built as an adapted version of the built-heritage inventory, the main remaining difference being the location component: precise address data for small elements versus larger heritage ensembles for the other modules.</p>
<p>When VIOE merged with the Ruimte en Erfgoed agency in 2012, the protected-heritage database came along with it. It turned out to hold mostly legal data and little content, so it was folded into the inventory as a separate module that largely shared the same data model. This eventually became the designation objects dataset (see <a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten">Heritage objects and designation objects</a>), made public in June 2016.</p>
<p>As the inventory evolved, it became clear that all these different inventories weren't actually that different, and we started treating them more as one integrated inventory — which also led to more communication and collaboration between heritage researchers. Alongside the launch of designation objects, we also introduced the term "heritage objects": every object from the scientific inventories got its own heritage object with a unique URI. In 2016 this was still largely cosmetic — the various detail pages were merged into one, but underneath they remained separate datasets with their own data model. At that point it became clear the old inventory had been pushed as far as it could go within its original design.</p>
<p>So preparations began for what eventually became the new inventory — partly because our view of the scientific inventories had shifted, from separate silos to one large inventory of heritage objects, and partly because the underlying technology was due for replacement. Now that the new inventory is here, we keep refining it until it does everything we want within its current capabilities.</p>
<p>Want to know more about the inventory? A few other posts worth reading:</p>
<ul>
<li class=""><a href="https://www.onroerenderfgoed.be/nieuws/inventaris-onroerend-erfgoed-vernieuwd" target="_blank" rel="noopener noreferrer" class="">General information</a> about the new inventory</li>
<li class=""><a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten">Heritage objects and designation objects</a>: what are they and why do they exist?</li>
<li class=""><a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-themas-personen-gebeurtenissen">Themes, people and events</a>: what are the three supporting modules for?</li>
<li class=""><a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-inleiding">From searching to finding on the new inventory</a>: how are the search options structured?</li>
<li class=""><a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-full-text">Full-text search in the inventory</a>: how does full-text search work, illustrated with heritage objects?</li>
</ul>
<p>The IT world keeps evolving fast. Our core business may be the past, but we want to manage that past in a forward-looking way — with a continuous, adaptive approach that stays open to new insight, both into our own subject matter and into the technology we use to manage and share it. Questions about any of this are always welcome — <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">get in touch</a>.</p>]]></content:encoded>
            <category>Inventaris</category>
            <category>Technology stack</category>
        </item>
        <item>
            <title><![CDATA[Full-text search in the inventory]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-full-text</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-full-text</guid>
            <pubDate>Thu, 25 Jul 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Since May 13, a brand new inventory has been live at https://inventaris.onroerenderfgoed.be. Last time (From searching to finding on the new inventory) we covered some general principles; today we dig into full-text search. We use heritage objects as our example, but our other modules support the same syntax.]]></description>
            <content:encoded><![CDATA[<p>Since May 13, a <a href="https://www.onroerenderfgoed.be/nieuws/inventaris-onroerend-erfgoed-vernieuwd" target="_blank" rel="noopener noreferrer" class="">brand new inventory</a> has been live at <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">https://inventaris.onroerenderfgoed.be</a>. Last time (<a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-inleiding">From searching to finding on the new inventory</a>) we covered some general principles; today we dig into full-text search. We use heritage objects as our example, but our other modules support the same syntax.</p>
<!-- -->
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Because the new inventory is still fresh, small shifts may still occur.</p></div></div>
<p>Full-text search works like a major web search engine: you're after a fairly specific object or document, and the search engine tries to put the best match on top. Search for <code>Gravensteen</code> and you get the most "Gravensteen-like" object first.</p>
<p>Several factors determine what counts as most relevant: the more often your search term appears in an object, the more relevant; the smaller the field it appears in, the more relevant; and the more often the term appears across all objects overall, the less relevant. Certain fields also weigh more heavily than others — a title counts for more than the body text of a record. Search for <code>Gravensteen</code> and an object titled that way outranks one where the term appears once in the text.</p>
<p>Type <code>Gravensteen</code> into the <code>Algemeen</code> ("general") field of the <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten/zoeken" target="_blank" rel="noopener noreferrer" class="">heritage objects search form</a> and you get <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst=gravensteen" target="_blank" rel="noopener noreferrer" class="">https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst=gravensteen</a>, with the Gravensteen in Ghent on top. Case doesn't matter here.</p>
<p>Want to know specifically about the Gravensteen in Aalst? Search <code>Gravensteen Aalst</code> and you get only 2 results: objects containing both <code>Gravensteen</code> and <code>Aalst</code>. By default, each word is treated as a separate term combined with AND — written as <code>+</code>, so <code>Gravensteen Aalst</code> equals <code>Gravensteen+Aalst</code>. Prefer either one or the other? Use the OR operator, the pipe character <code>|</code>: <code>Gravensteen|Aalst</code>. The third operator is NOT, a <code>-</code> sign: <code>Gravensteen -Aalst</code> gives you everything with <code>Gravensteen</code> but not <code>Aalst</code>.</p>
<p>By default the search engine splits your query on spaces. Search <code>Grote Markt Aalst</code> and you get quite a few results, including, right at the bottom, <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten/1996" target="_blank" rel="noopener noreferrer" class="">Paviljoen De Notelaer</a> — the words <code>grote</code>, <code>markt</code> and <code>aalst</code> do appear, just not next to each other. To search for the exact phrase, use quotes: <code>"Grote Markt" Aalst</code> searches for two terms instead of three, and returns fewer, more relevant results.</p>
<p>For more complex combinations, use parentheses to control operator precedence. Search <code>vismarkt brugge gent</code> and you get objects containing all three terms — not what you meant. <code>vismarkt + brugge | gent</code> then returns far too many results, because operators have a fixed precedence. The fix: group with parentheses, <code>vismarkt + (brugge|gent)</code>, to find records about the fish market that also mention Bruges or Ghent.</p>
<p>You can also search on part of a word with a postfix wildcard: <code>gedenk*</code> matches <code>gedenksteen</code>, <code>gedenkplaat</code> and similar words. This only works at the end of a term — <code>*linde</code> won't match <code>herdenkingslinde</code>. You can combine all of this: <code>visgraat* (oost-vlaanderen|west-vlaanderen) -brugge</code> finds objects with a word starting with <code>visgraat</code>, in East or West Flanders, but not in Bruges.</p>
<p>Which fields are actually searched in full text, and in what order of importance? The text, the text's title, the short description (shown in a search result), province, municipality, sub-municipality and street names, thesaurus terms, and the object's own name. We show every object containing your term, unless there are more than 10,000 (the maximum number of results).</p>
<p>In short, these are the operators you can use:</p>
<ul>
<li class="">Multiple terms are implicitly combined with AND; make it explicit with <code>+</code></li>
<li class="">Combine with OR using <code>|</code></li>
<li class="">Exclude a term with NOT using <code>-</code></li>
<li class="">Turn multiple words into one term with quotes <code>"</code></li>
<li class="">Control operator precedence with parentheses <code>()</code></li>
<li class="">Search by prefix with a postfix wildcard <code>*</code></li>
</ul>
<p>Happy searching! Questions about search are always welcome — <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">get in touch</a>.</p>]]></content:encoded>
            <category>Inventaris</category>
            <category>Search</category>
            <category>Full-text</category>
        </item>
        <item>
            <title><![CDATA[Heritage objects and designation objects]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten</guid>
            <pubDate>Tue, 18 Jun 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[On May 13 we launched a brand new Flanders Heritage Inventory. Anyone who has used it will have noticed five datasets: heritage objects (erfgoedobjecten), designation objects (aanduidingsobjecten), people, themes and events. Heritage and designation objects form the core of the inventory database; the other three datasets are covered in a later post.]]></description>
            <content:encoded><![CDATA[<p>On May 13 we <a href="https://www.onroerenderfgoed.be/nieuws/inventaris-onroerend-erfgoed-vernieuwd" target="_blank" rel="noopener noreferrer" class="">launched</a> a brand new <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Flanders Heritage Inventory</a>. Anyone who has used it will have noticed five datasets: heritage objects (erfgoedobjecten), designation objects (aanduidingsobjecten), people, themes and events. Heritage and designation objects form the core of the inventory database; the other three datasets are covered in a later post.</p>
<!-- -->
<p><strong>Heritage objects</strong> are the beating heart of the inventory: the things we and you consider heritage, from Antwerp Cathedral or the Gravensteen to the Zwin nature reserve, a chapel, a tree, a ship or an organ. The focus isn't on legal consequences but on the scientific record: what is it, how big, where, how old, what does it look like, who was involved, where can I learn more? A heritage object's boundary is often a bit fuzzy in practice — for <code>the Gravensteen</code>, one person might see only the keep, another might include the moat, and a third might count the adjoining square as well. We settle on one boundary per object without treating it as perfectly exact.</p>
<p><strong>Designation objects</strong>, by contrast, are heritage as it's legally anchored: the protection or listing of a heritage object. Where a heritage object's boundary can be a bit vague, a designation object's must be beyond dispute, since it determines which legal consequences apply to a given piece of Flanders. Since the new Immovable Heritage Decree, we now delineate listed heritage <a href="https://www.onroerenderfgoed.be/nieuws/update-datalagen-onroerend-erfgoed-1" target="_blank" rel="noopener noreferrer" class="">with a polygon rather than points</a>. The key questions for a designation object: exactly how large is it, what type of designation is it, why does it have heritage value, and which decree or document backs that decision? A single heritage object can be anchored more than once, under different statuses.</p>
<p><img decoding="async" loading="lazy" alt="Antwerp Cathedral, a heritage object and its designations" src="https://developers.onroerenderfgoed.be/en/assets/images/erfgoedobject_olv_kathedraal-1c2fe3d4ae1a05c4a8f04a897c99927d.png" width="1851" height="952" class="img_ev3q"></p>
<p><em>Antwerp Cathedral, a heritage object and its designations</em></p>
<p>Look at <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten/4092" target="_blank" rel="noopener noreferrer" class="">Antwerp Cathedral</a>, for instance, and you'll find four designations: a listing as built heritage, a designation as UNESCO World Heritage, a protection as a monument, and an additional protection of a section of wall, also as a monument. The heritage object "the cathedral" tells you what it is; the designation objects tell you, in detail, what applies to its various parts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="couldnt-this-be-simpler">Couldn't this be simpler?<a href="https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten#couldnt-this-be-simpler" class="hash-link" aria-label="Direct link to Couldn't this be simpler?" title="Direct link to Couldn't this be simpler?" translate="no">​</a></h2>
<p>At first glance, this split looks complex and arbitrary. It emerged during the protection-database project, shortly after the merger of the <code>Ruimte en Erfgoed</code> agency and the <code>Flemish Institute for Immovable Heritage</code>. The first managed the protection database, the second the inventory database, which at the time consisted of several separate inventories (built heritage, gardens and parks, woody plantings, ...), each with its own record per element.</p>
<p>Because the protection database offered far less functionality than the inventory database at the time, all protected heritage was added into the inventory database, immediately equipped with images, thesaurus terms and extended descriptions. In that first data model, protected heritage was described identically to inventoried heritage: a record for a church in the built-heritage inventory, a separate record for that same church as a protected monument, and possibly yet another record as part of a village townscape. Those records largely repeated the same content, sometimes with slight differences due to a different boundary — a nightmare to maintain whenever new insight about a building came to light.</p>
<p>A similar problem existed between the different inventories themselves. When they were still published on paper (in series like <code>M&amp;L Cahiers</code> and <code>Bouwen door de Eeuwen Heen</code>), overlap between, say, a historic garden and its associated built heritage was manageable; online, this proved less straightforward, sometimes leading to contradictory records.</p>
<p>Eventually we changed course by strictly separating two things. On one hand, the content: we now assign every heritage object one or more disciplines (archaeological, architectural, landscape, or maritime), and bring as much information as possible together into a single record, regardless of which part of it is protected. On the other hand, the legal information, which we want to be able to handle independently — a protection can cease to exist, for example, without the heritage itself disappearing. That's how we reworked the protection database into a database of designation objects, a term we borrowed from <a href="https://historicengland.org.uk/" target="_blank" rel="noopener noreferrer" class="">Historic England</a>, where "designation" refers to the formal act of attaching legal consequences to heritage.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="everything-is-connected">Everything is connected<a href="https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten#everything-is-connected" class="hash-link" aria-label="Direct link to Everything is connected" title="Direct link to Everything is connected" translate="no">​</a></h2>
<p>Our heritage is vast and varied, and every record puts just a small piece of reality in the spotlight — pieces that are connected to each other. That's why we've been linking objects with relations for about a decade. Where heritage used to be managed mostly as isolated points, there's been a long-running shift toward larger wholes and contexts that matter just as much as the small elements we readily recognise as heritage. Former <code>built ensembles</code>, <code>archaeological zones</code> and <code>anchor points</code> have all become heritage objects, with a consistent distinction between <code>ensembles</code> (larger areas) and <code>elements</code> (smaller-scale pieces of heritage). Since 2009, we've linked heritage objects using three relations:</p>
<ul>
<li class=""><strong>is related to</strong>: a connection between two objects, without one containing the other — for example a coal mine and a miners' housing estate.</li>
<li class=""><strong>contains</strong>: one heritage object contains another, such as a castle estate containing the coach house, or a church containing a separately described organ.</li>
<li class=""><strong>is part of</strong>: the inverse of "contains" — the organ is part of the church, the coach house part of the estate.</li>
</ul>
<p>For the interaction between heritage objects and designation objects, we distinguish three relations:</p>
<ul>
<li class=""><strong>is designated as</strong>: the heritage object and the designation object are (nearly) identical in extent — the heritage object is (roughly) fully protected or listed.</li>
<li class=""><strong>encompasses the designation as</strong>: the heritage object is larger than the designation object, e.g. a church of which only the tower is protected.</li>
<li class=""><strong>is part of the designation as</strong>: the heritage object is smaller than the designation object, e.g. an individual tree within a protected landscape.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="help-im-looking-for-something">Help, I'm looking for something!<a href="https://developers.onroerenderfgoed.be/en/blog/inventaris-erfgoedobjecten-aanduidingsobjecten#help-im-looking-for-something" class="hash-link" aria-label="Direct link to Help, I'm looking for something!" title="Direct link to Help, I'm looking for something!" translate="no">​</a></h2>
<p>So when do you use which dataset? You can <a href="http://inventaris.onroerenderfgoed.be/erfgoedobjecten/zoeken" target="_blank" rel="noopener noreferrer" class="">search heritage objects</a> or <a href="https://inventaris.onroerenderfgoed.be/aanduidingsobjecten" target="_blank" rel="noopener noreferrer" class="">search designation objects</a>, and both forms offer filters related to legal consequences. With heritage objects, you're primarily searching on content characteristics — the unit of information is heritage. With designation objects, you're searching on characteristics of the designation itself — the unit of information is a legal decision about heritage.</p>
<p>Search for <code>protected libraries</code>, for example, and <code>typologie=bibliotheken</code> + <code>rechtsgevolgen=beschermd</code> on heritage objects gives <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten?typologie=bibliotheken&amp;rechtsgevolgen=beschermd" target="_blank" rel="noopener noreferrer" class="">17 results</a>, while <code>typologie=bibliotheken</code> + <code>categorie=beschermingen</code> + <code>geldig=true</code> on designation objects gives <a href="https://inventaris.onroerenderfgoed.be/aanduidingsobjecten?typologie=bibliotheken&amp;categorie=beschermingen&amp;geldig=true" target="_blank" rel="noopener noreferrer" class="">22 results</a> — not quite the same thing. The first is 17 heritage objects that are (partly) a library and carry a protection; the second is 22 protected objects that relate to a library in some way. The <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten/209986" target="_blank" rel="noopener noreferrer" class="">Loppem Castle estate</a>, for instance, is protected twice: the whole estate as a landscape, and the manor house with outbuildings separately as a monument.</p>
<p>Splitting our information into heritage objects and designation objects lets us handle content flexibly and make additions without touching the legally anchored data. Got suggestions for making our information clearer? <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">Get in touch</a>.</p>]]></content:encoded>
            <category>Inventaris</category>
            <category>Erfgoedobjecten</category>
            <category>Aanduidingsobjecten</category>
        </item>
        <item>
            <title><![CDATA[From searching to finding on the new inventory]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-inleiding</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-inleiding</guid>
            <pubDate>Wed, 15 May 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[Since May 13, a brand new inventory has been live at https some stayed the same, others changed slightly or significantly. To ease that transition we're using this blog to walk through the main search capabilities. Today we start with some general principles; later posts dig into specific parts.]]></description>
            <content:encoded><![CDATA[<p>Since May 13, a <a href="https://www.onroerenderfgoed.be/nieuws/inventaris-onroerend-erfgoed-vernieuwd" target="_blank" rel="noopener noreferrer" class="">brand new inventory</a> has been live at <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">https://inventaris.onroerenderfgoed.be</a>. As with any overhaul, it takes some getting used to, and that's especially true for the search options: some stayed the same, others changed slightly or significantly. To ease that transition we're using this blog to walk through the main search capabilities. Today we start with some general principles; later posts dig into specific parts.</p>
<!-- -->
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Because the new inventory is still fresh, small shifts may still occur — not everything is necessarily final yet.</p></div></div>
<p>The inventory currently holds five major datasets: heritage objects (erfgoedobjecten), designation objects (aanduidingsobjecten), people, themes and events. Many search options and principles are shared across these datasets — searching for heritage or designation objects in a given municipality works identically, and so does searching by thesaurus term.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="user-interface-vs-rest-service">User interface vs. REST service<a href="https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-inleiding#user-interface-vs-rest-service" class="hash-link" aria-label="Direct link to User interface vs. REST service" title="Direct link to User interface vs. REST service" translate="no">​</a></h2>
<p>When it comes to search, we distinguish between the search service itself and the UI that uses it. Search is complex: multiple parameters, boolean combinations (this AND that, this OR that, NOT this), searching by id or by text, wildcards — and it all has to stay simple and unambiguous. In practice, the perfect search UI doesn't exist; it always depends on the user, which is hard to predict. That's why our search services often support more than what the standard UI exposes: we build the UI for the average user, while the service itself targets developers and experienced users.</p>
<p>By "UI" we mean the search forms themselves, such as <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten/zoeken" target="_blank" rel="noopener noreferrer" class="">https://inventaris.onroerenderfgoed.be/erfgoedobjecten/zoeken</a>, where you enter search parameters in a guided way (with suggestion lists for municipality and street names, for instance). The downside: a UI is expensive to build, and complex queries don't always fit neatly into one.</p>
<p><img decoding="async" loading="lazy" alt="Searching via the user interface" src="https://developers.onroerenderfgoed.be/en/assets/images/erfgoedobjecten_zoeken-c9ce39a733d2a928383f86b2d76c5ee7.png" width="1854" height="991" class="img_ev3q"></p>
<p><em>The user interface makes simple searches easy</em></p>
<p>The service itself is a machine-queryable REST service that uses JSON to exchange information. A search result on the new inventory can be browsed as HTML or downloaded as JSON or CSV — just request the same URL with a different <code>Accept</code> header, such as <code>application/json</code>. You can do this with a command-line tool like <code>curl</code>, a REST client, or your favourite programming language:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ curl -X GET -H "Accept: application/json" https://inventaris.onroerenderfgoed.be/erfgoedobjecten?gemeente=278</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-text-search-vs-filtering">Full-text search vs. filtering<a href="https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-inleiding#full-text-search-vs-filtering" class="hash-link" aria-label="Direct link to Full-text search vs. filtering" title="Direct link to Full-text search vs. filtering" translate="no">​</a></h2>
<p>The search forms support both full-text search (often just called "search") and filtering. These sound similar but serve very different purposes — though both help you avoid seeing irrelevant data.</p>
<p>Filtering is black and white: an object either matches a criterion or it doesn't. You might want all heritage in a municipality or street, or all churches, or all churches in a given municipality — often you're not after one specific object, sometimes you just want a count.</p>
<p>Full-text search is a shade of grey: the search engine tries to give you the most relevant result. Search for <code>Gravensteen</code> or <code>Sint-Veerle</code> and you're usually after a small number of objects, wanting the most relevant one at the top — the same way major web search engines like Google work.</p>
<p>You can of course combine the two. A full-text search for <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst=gravensteen" target="_blank" rel="noopener noreferrer" class="">Gravensteen</a> returns ten objects, with the Gravensteen in Ghent on top — the last result is the archaeological zone of Aalst, because "gravensteen" also appears in its description. Add a filter for the municipality of Ghent, and you're left with <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten?tekst=gravensteen&amp;gemeente=278" target="_blank" rel="noopener noreferrer" class="">seven results</a>, still topped by the Gravensteen.</p>
<p>As long as you run a full-text search via the <code>Algemeen</code> ("general") field, the application sorts by relevance by default; without full-text search, it sorts by location. When full-text searching, you can still change the sort order, though that's rarely useful.</p>
<p>In a follow-up post we explain how to search full-text more precisely (<a class="" href="https://developers.onroerenderfgoed.be/en/blog/inventaris-zoeken-full-text">Full-text search in the inventory</a>), and exactly how we determine which record is most relevant for a given query.</p>]]></content:encoded>
            <category>Inventaris</category>
            <category>Search</category>
        </item>
        <item>
            <title><![CDATA[Running an Atramhasis demo site with Docker]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/atramhasis-docker</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/atramhasis-docker</guid>
            <pubDate>Thu, 11 Jan 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[Atramhasis is our online SKOS editor: it lets anyone with a browser create, edit and consult an online thesaurus (see What's a thesaurus?) or vocabulary that follows the SKOS specification.]]></description>
            <content:encoded><![CDATA[<p><a href="http://atramhasis.readthedocs.io/" target="_blank" rel="noopener noreferrer" class="">Atramhasis</a> is our online SKOS editor: it lets anyone with a browser create, edit and consult an online thesaurus (see <a class="" href="https://developers.onroerenderfgoed.be/en/blog/whats-a-thesaurus">What's a thesaurus?</a>) or vocabulary that follows the <a href="http://www.w3.org/TR/skos-reference/" target="_blank" rel="noopener noreferrer" class="">SKOS specification</a>.</p>
<!-- -->
<p>Setting up a demo instance used to take some manual work. We now publish a <a href="https://hub.docker.com/r/atramhasis/demo/" target="_blank" rel="noopener noreferrer" class="">Docker image</a> that bundles both a demo application and its companion <a href="http://linkeddatafragments.org/" target="_blank" rel="noopener noreferrer" class="">Linked Data Fragments</a> server, so you can get a working instance running in minutes.</p>
<p>After <a href="https://docs.docker.com/engine/installation/#supported-platforms" target="_blank" rel="noopener noreferrer" class="">installing Docker</a> (the CE edition is more than enough), pull and run the image:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ sudo docker pull atramhasis/demo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ sudo docker run -p 6543:6543 -p 3000:3000 atramhasis/demo</span><br></div></code></pre></div></div>
<p>The demo app is then available at <a href="http://localhost:6543/" target="_blank" rel="noopener noreferrer" class="">http://localhost:6543</a>, and the bundled Linked Data Fragments server at <a href="http://localhost:3000/" target="_blank" rel="noopener noreferrer" class="">http://localhost:3000</a>.</p>
<p>You can also pin a specific version (from Atramhasis 0.6.4 onward):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ sudo docker pull atramhasis/demo:0.6.4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ sudo docker run -p 6543:6543 -p 3000:3000 atramhasis/demo:0.6.4</span><br></div></code></pre></div></div>
<p>Keep in mind this is meant for a quick first look, not long-term use: any edits you make are discarded when the container stops. If you need persistence while still using Docker, customise the <a href="https://github.com/OnroerendErfgoed/atramhasis-demo-docker/" target="_blank" rel="noopener noreferrer" class="">Dockerfile</a> to fit your needs.</p>]]></content:encoded>
            <category>Atramhasis</category>
        </item>
        <item>
            <title><![CDATA[Heritage printed on a map]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/erfgoed-geprint-op-kaart</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/erfgoed-geprint-op-kaart</guid>
            <pubDate>Tue, 03 Oct 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[The Geoportal (Where is our heritage located?) makes it easy for a person to see where our heritage is, and Geozoekdiensten (Geozoekdiensten: what's here?) lets a machine ask what heritage sits in a given area. But what do you do with that information next? As of recently, it's easier to turn it into your own maps.]]></description>
            <content:encoded><![CDATA[<p>The Geoportal (<a class="" href="https://developers.onroerenderfgoed.be/en/blog/waar-ligt-ons-erfgoed">Where is our heritage located?</a>) makes it easy for a person to see where our heritage is, and Geozoekdiensten (<a class="" href="https://developers.onroerenderfgoed.be/en/blog/geozoekdiensten">Geozoekdiensten: what's here?</a>) lets a machine ask what heritage sits in a given area. But what do you do with that information next? As of recently, it's easier to turn it into your own maps.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="static-map-generator">Static map generator<a href="https://developers.onroerenderfgoed.be/en/blog/erfgoed-geprint-op-kaart#static-map-generator" class="hash-link" aria-label="Direct link to Static map generator" title="Direct link to Static map generator" translate="no">​</a></h2>
<p>Generating this kind of map is done with the <code>static map generator</code>, a module built for Flanders Heritage Agency together with external partners. Its purpose: assemble static maps from a mix of geographic formats (such as GeoJSON), a background layer (such as WMS), and layout overlays like text and a scale bar. Based on a configuration file, the generator merges all layers into one image with a scale bar, returned either as an image file or as base64.</p>
<p>The generator works both as a Python module and as a REST service, so it's easy to plug into your own project — use the library directly if you work in Python, or run it as a standalone application on a server if you don't.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-municipalitys-heritage-atlas">A municipality's heritage atlas<a href="https://developers.onroerenderfgoed.be/en/blog/erfgoed-geprint-op-kaart#a-municipalitys-heritage-atlas" class="hash-link" aria-label="Direct link to A municipality's heritage atlas" title="Direct link to A municipality's heritage atlas" translate="no">​</a></h2>
<p>The inventory is a great tool for learning about our heritage, but sometimes a local copy is handy — say, to take on the road without an internet connection. Combining a few of our services lets you build your own heritage atlas.</p>
<p>As an example, we use the municipality of Edegem. First, all heritage objects and designation objects within the municipality are fetched via the geo search services. Then a base configuration is set up for the image: background layer, text, width and height. Each object's geometry is added as a separate layer, and finally the configuration is handed to the static map generator, which returns the image. Edegem's own boundary comes from a GeoJSON file based on data from Informatie Vlaanderen. The full script is on <a href="https://github.com/OnroerendErfgoed/static_map_generator" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<p>That gets you a map of all the heritage we know about in Edegem:</p>
<p><img decoding="async" loading="lazy" alt="Map of heritage in Edegem" src="https://developers.onroerenderfgoed.be/en/assets/images/Edegem-acd7dcb59176940cad561065a5281cc2.png" width="1000" height="1000" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zooming-in-on-individual-objects">Zooming in on individual objects<a href="https://developers.onroerenderfgoed.be/en/blog/erfgoed-geprint-op-kaart#zooming-in-on-individual-objects" class="hash-link" aria-label="Direct link to Zooming in on individual objects" title="Direct link to Zooming in on individual objects" translate="no">​</a></h2>
<p>You can also generate a separate map for each heritage object — for example with a different background layer, and the object's name printed on the map. That gives you one map per object from the inventory, ready to print or process further. As always, both our data and that of Informatie Vlaanderen are open data, free to reuse.</p>
<p><em>Fort 5</em></p>
<p><img decoding="async" loading="lazy" alt="Fort 5" src="https://developers.onroerenderfgoed.be/en/assets/images/Fort_5-23fa3ba669116f95a890fc7b802b6f4e.png" width="1000" height="1000" class="img_ev3q"></p>
<p><em>Hazeschranshoeven</em></p>
<p><img decoding="async" loading="lazy" alt="Hazeschranshoeven" src="https://developers.onroerenderfgoed.be/en/assets/images/Hazeschranshoeven-9d12dab36c8707c5072970b9623d769a.png" width="1000" height="1000" class="img_ev3q"></p>
<p><em>Kasteel Hof ter Linden</em></p>
<p><img decoding="async" loading="lazy" alt="Kasteel Hof ter Linden" src="https://developers.onroerenderfgoed.be/en/assets/images/Kasteel_Hof_ter_Linden-dae0c395e10ace6b119c3f144bf196d7.png" width="1000" height="1000" class="img_ev3q"></p>
<p><em>Garden City Elsdonk</em></p>
<p><img decoding="async" loading="lazy" alt="Garden City Elsdonk" src="https://developers.onroerenderfgoed.be/en/assets/images/Garden_City_Elsdonk-6431f0fc98ede4063db4ed0f8fc94553.png" width="1000" height="1000" class="img_ev3q"></p>
<p>Want to try the map generator yourself? Check out the <a href="https://github.com/OnroerendErfgoed/static_map_generator" target="_blank" rel="noopener noreferrer" class="">static map generator</a> on GitHub, or browse the live API docs at <a href="https://geo.onroerenderfgoed.be/zoekdiensten/api_doc" target="_blank" rel="noopener noreferrer" class="">https://geo.onroerenderfgoed.be/zoekdiensten/api_doc</a>.</p>]]></content:encoded>
            <category>Static map generator</category>
            <category>Geozoekdiensten</category>
        </item>
        <item>
            <title><![CDATA[What's a thesaurus?]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/whats-a-thesaurus</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/whats-a-thesaurus</guid>
            <pubDate>Thu, 14 Sep 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[We recently released a new version of Atramhasis, our web-based thesaurus editor. But what actually is a thesaurus, and why would a heritage organisation want one?]]></description>
            <content:encoded><![CDATA[<p>We recently released a new version of <a class="" href="https://developers.onroerenderfgoed.be/en/blog/atramhasis-0.7.0">Atramhasis</a>, our web-based thesaurus editor. But what actually is a thesaurus, and why would a heritage organisation want one?</p>
<!-- -->
<p>Our colleagues at <a href="http://www.historicengland.org.uk/" target="_blank" rel="noopener noreferrer" class="">Historic England</a> define a thesaurus as <em>a structured wordlist used to standardize terminology, used to assist in indexing and retrieving information within databases that make use of the same terminology</em>. Structuring related terms like this opens up a few useful things.</p>
<p>First, it lets you express equivalence. Rather than saying two terms are "synonyms," we say both are verbal expressions of the same underlying concept — so instead of stating <em>Jugendstil</em> equals <em>Art Nouveau</em>, we say there's a single concept for that artistic style, labelled with both terms. Subtle difference, but it changes how you interact with the thesaurus.</p>
<p>Second, there are hierarchical relations: one term broader than another, the other narrower. A cathedral is a church, a church is a religious building, so a cathedral is a religious building too. Not all hierarchical relations are strictly "is a" — "is part of" and "is an instance of" exist as well, and they complicate matters. See <a href="https://link.springer.com/article/10.1007/s00799-015-0162-2" target="_blank" rel="noopener noreferrer" class="">On the composition of ISO 25964 hierarchical relations (BTG, BTP, BTI)</a> for how they interact.</p>
<p>Third, the associative relationship — the "softest" one, just stating two terms or concepts are related. <em>Coal mine</em> relates to <em>miner's houses</em> because in Flanders, every coal mine had its own little town where the miners lived.</p>
<p>Thesauri also let you attach a scope note: a written definition of a concept and how it should be used. This turns out to matter a lot in practice — asking experts to define concepts they assumed were self-evident has caused more than one heated discussion. Without a definition, everyone uses a concept however they like, ignoring that others might disagree.</p>
<p>So thesauri help us reach consensus on what concepts mean and share that with the outside world (which is why we publish them as open data). But we also have a very practical reason to build and maintain them: indexing. When someone searches for <a href="https://inventaris.onroerenderfgoed.be/erfgoedobjecten?typologie=fonteinen" target="_blank" rel="noopener noreferrer" class="">fountains</a> in our inventory system, the thesaurus is consulted. If <em>fountains</em> isn't a known term, nothing gets indexed under it and the search stops there. If it is, the system also checks for narrower terms — in this case <em>water tricks</em> is a defined narrower type of fountain — so a search for fountains returns records indexed as either <em>fountains</em> or <em>water tricks</em>.</p>
<p>Those <em>water tricks</em> also show off another handy feature. Look at the record for <a href="https://id.erfgoed.net/thesauri/erfgoedtypes/1524" target="_blank" rel="noopener noreferrer" class="">water tricks</a> and you'll see we call them <em>bedriegertjes</em> in Dutch but never got around to an English label. Luckily, we've linked our <em>bedriegertjes</em> concept to the same concept in the <a href="http://www.getty.edu/research/tools/vocabularies/aat/" target="_blank" rel="noopener noreferrer" class="">Art &amp; Architecture Thesaurus</a>, which tells us the English terms are <em>water tricks</em> or <em>joke fountains</em> — and even gives us the German and Spanish equivalents. That opens up a lot of possible interactions with other systems.</p>
<p>In the end, thesauri are a means, not an end — our job is managing heritage, not building thesauri. But they help enormously in defining what that heritage is, searching through it, and linking it from our local level to the transnational one. If you want more detail on how we built ours, including some do's and don'ts, the original post pointed to a bibliography entry (Mortier et al., 2017) that we weren't able to carry over exactly.</p>]]></content:encoded>
            <category>Vocabulary</category>
            <category>Indexing</category>
            <category>Search</category>
        </item>
        <item>
            <title><![CDATA[Geozoekdiensten: what's here?]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/geozoekdiensten</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/geozoekdiensten</guid>
            <pubDate>Mon, 14 Aug 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[As promised in Where is our heritage located?, here's more detail on our Geozoekdiensten ("geo search services"). Today this is a single webservice built to answer exactly one question: what's located in this area? You send it a geometry, and it answers with the heritage that lies wholly or partly within it, as a simple JSON structure with an id, a uri, a type and the full geometrie for each object.]]></description>
            <content:encoded><![CDATA[<p>As promised in <a class="" href="https://developers.onroerenderfgoed.be/en/blog/waar-ligt-ons-erfgoed">Where is our heritage located?</a>, here's more detail on our Geozoekdiensten ("geo search services"). Today this is a single webservice built to answer exactly one question: <em>what's located in this area?</em> You send it a geometry, and it answers with the heritage that lies wholly or partly within it, as a simple JSON structure with an <code>id</code>, a <code>uri</code>, a <code>type</code> and the full <code>geometrie</code> for each object.</p>
<!-- -->
<p>An example is worth a thousand words. Say we want all heritage within a hundred metres of a point in Flanders:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ curl -X GET --header 'Accept: application/json' 'https://geo.onroerenderfgoed.be/zoekdiensten/afbakeningen?categorie=aanduidingsobjecten&amp;geometrie=%7B%22type%22%3A%20%22Point%22%2C%20%22coordinates%22%3A%20%5B4.7676665601685%2C50.985228897907%5D%7D&amp;buffer=100'</span><br></div></code></pre></div></div>
<p>That returns a list of results, each a JSON object with the attributes <code>id</code>, <code>uri</code>, <code>categorie</code>, <code>type</code>, <code>naam</code> and <code>geometrie</code>. <code>naam</code> is a short description. The <code>id</code> uniquely identifies the object within its source dataset; the <code>uri</code> is guaranteed unique across all datasets — a global identifier that's really just a link to more information. Request <code>https://inventaris.onroerenderfgoed.be/erfgoedobjecten/134454</code> in a browser, for instance, and you land on a page about that object in the <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Inventaris Onroerend Erfgoed</a>. Prefer the raw JSON? Send an <code>Accept: application/json</code> header:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ curl -L -X GET --header 'Accept: application/json' 'https://id.erfgoed.net/erfgoedobjecten/134454'</span><br></div></code></pre></div></div>
<p>In this example we've found a heritage object from the scientific inventory of gardens and parks — you can tell from the <code>type</code> attribute, an object with a <code>uri</code> and a <code>label</code>. That uri points to a term in a thesaurus of <code>inventaristypes</code> or <code>aanduidingstypes</code>; follow it for more detail, such as the fact this inventory is sometimes internally called <code>ile_park</code>.</p>
<p>The geometry itself comes back as GeoJSON, and since it can get large and isn't always needed, you can tell the service to leave it out:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ curl -X GET https://geo.onroerenderfgoed.be/zoekdiensten/afbakeningen?&amp;buffer=100&amp;geef_geometrie=0</span><br></div></code></pre></div></div>
<p>By default the service searches across all kinds of objects, but you can filter with the <code>categorie</code> parameter:</p>
<ul>
<li class=""><strong>Erfgoedobjecten</strong> ("heritage objects"): the content-focused objects that make up our heritage — the <code>scientific inventories</code>.</li>
<li class=""><strong>Aanduidingsobjecten</strong> ("designation objects"): the legal anchoring of heritage objects, both <code>protected</code> and <code>listed</code> (which you can tell from the type's URI), including <code>heritage landscapes</code> and <code>Unesco core</code> and <code>buffer zones</code>.</li>
<li class=""><strong>Plannen</strong> ("plans"): currently just <code>management plans</code>, to be extended later with <code>heritage master plans</code>.</li>
</ul>
<p>To see only designated objects, for example:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ curl -X GET https://geo.onroerenderfgoed.be/zoekdiensten/afbakeningen?&amp;buffer=100&amp;geef_geometrie=0&amp;categorie=aanduidingsobjecten</span><br></div></code></pre></div></div>
<p>For simple questions like "give me all heritage around a point," the above works fine. You're not limited to points either — (multi-)polygons and lines work too, though embedding a full GeoJSON geometry in the URL gets unwieldy fast. That's why the service also supports a <code>POST</code> request, letting you put the query in the request body instead.</p>
<p>The service is freely accessible and reuse is encouraged. For a quick overview of what it can do, we recommend the live API docs at <a href="https://geo.onroerenderfgoed.be/zoekdiensten/api_doc" target="_blank" rel="noopener noreferrer" class="">https://geo.onroerenderfgoed.be/zoekdiensten/api_doc</a>.</p>
<p>We hope this fairly simple webservice proves as useful to you as it is to us. Comments, questions or further needs are always welcome at <a href="mailto:ict@onroerenderfgoed.be" target="_blank" rel="noopener noreferrer" class="">ict@onroerenderfgoed.be</a>.</p>]]></content:encoded>
            <category>Geozoekdiensten</category>
        </item>
        <item>
            <title><![CDATA[Where is our heritage located?]]></title>
            <link>https://developers.onroerenderfgoed.be/en/blog/waar-ligt-ons-erfgoed</link>
            <guid>https://developers.onroerenderfgoed.be/en/blog/waar-ligt-ons-erfgoed</guid>
            <pubDate>Fri, 02 Jun 2017 00:00:00 GMT</pubDate>
            <description><![CDATA[One of the most defining traits of immovable heritage is right there in the name: it doesn't move. Our landscapes, monuments, archaeological sites and so on all have a location, and with a few odd exceptions, they always have. Move such an object from its original spot and it stops existing as that object. So how do you find out what's located where?]]></description>
            <content:encoded><![CDATA[<p>One of the most defining traits of immovable heritage is right there in the name: it doesn't move. Our landscapes, monuments, archaeological sites and so on all have a location, and with <a href="https://besluiten.onroerenderfgoed.be/besluiten?rechtsgevolgen=https%3A%2F%2Fid.erfgoed.net%2Fthesauri%2Fbesluittypes%2F19" target="_blank" rel="noopener noreferrer" class="">a few odd exceptions</a>, they always have. Move such an object from its original spot and it stops existing as that object. So how do you find out what's located where?</p>
<!-- -->
<p>As a person, you have a few options. Head to our <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Geoportal</a> and zoom in on a location to see, in a couple of clicks, what heritage is present there. If maps aren't your thing, our <a href="https://inventaris.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">Inventory</a> lets you search for all heritage in a given street or municipality through a search form — less precise, perhaps, but a quick way into the history and architecture of your neighbourhood.</p>
<p><img decoding="async" loading="lazy" alt="The Flanders Heritage Geoportal" src="https://developers.onroerenderfgoed.be/en/assets/images/geoportaal-77a2f3d8681f593738fd6b9a4ff28804.png" width="1535" height="876" class="img_ev3q"></p>
<p><em>All geographic information about immovable heritage can be found at <a href="https://geo.onroerenderfgoed.be/" target="_blank" rel="noopener noreferrer" class="">https://geo.onroerenderfgoed.be</a></em></p>
<p>If you'd rather work with the data yourself, our heritage inventories and our protected and listed heritage sites can be <a href="http://inventaris.onroerenderfgoed.be/portaal/kaarten" target="_blank" rel="noopener noreferrer" class="">downloaded as GIS files</a>, each geometry carrying a URL to more information. Handy offline, but regenerated every night — so a day-old download is already stale. If you need the current state at all times, our OGC webservices via our <a href="https://geo.onroerenderfgoed.be/geoserver" target="_blank" rel="noopener noreferrer" class="">Geoserver</a> always reflect the latest data, unlike the downloads.</p>
<p>Finally, if you're technically inclined and want to use our data directly in your own systems, there's Geozoekdiensten ("geo search services"). Right now this is a single webservice built to answer exactly one question: <em>what's located in this area?</em> You send it a geometry, and it tells you which heritage lies wholly or partly within it — a simple JSON structure with an <code>id</code>, a <code>uri</code>, a <code>type</code> and the full <code>geometrie</code> for each object. We've been using this service internally for a while, and are now happy to share it.</p>
<p>In a follow-up post (<a class="" href="https://developers.onroerenderfgoed.be/en/blog/geozoekdiensten">Geozoekdiensten: what's here?</a>) we explain exactly how to use this service.</p>]]></content:encoded>
            <category>Geoportaal</category>
            <category>Geoserver</category>
            <category>Geozoekdiensten</category>
        </item>
    </channel>
</rss>