<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>pycsw Blog</title>
		<description>pycsw is an OARec and OGC CSW server implementation written in Python. Started in 2010 (more formally announced in 2011), pycsw allows for the publishing and discovery of geospatial metadata, providing a standards-based metadata and catalogue component of spatial data infrastructures. pycsw is Open Source, released under an MIT license, and runs on all major platforms (Windows, Linux, Mac OS</description>
		<link>https://pycsw.org</link>
		<atom:link href="https://pycsw.org/feed.xml" rel="self" type="application/rss+xml" />
		
			<item>
				<title>Using keywords from a thesaurus as queryables</title>
				<description>&lt;h2 id=&quot;using-keywords-from-a-thesaurus-as-queryables&quot;&gt;Using keywords from a thesaurus as queryables&lt;/h2&gt;

&lt;p&gt;A common convention in catalogues is the use of keywords from a dedicated thesaurus. The assignment of these keywords can then later be used to filter or query the catalogue by these terms. To achieve this use case in pycsw, some configuration needs to be tailored. This blog post indicates the changes needed for this scenario.&lt;/p&gt;

&lt;p&gt;For this example we’ll use a keyword from the &lt;a href=&quot;https://inspire.ec.europa.eu/theme&quot;&gt;INSPIRE Themes&lt;/a&gt; thesaurus. We will define a new queryable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;inspiretheme&lt;/code&gt;, which will be populated with the relevant keyword (if present).&lt;/p&gt;

&lt;p&gt;You can repeat these steps for any other thesaurus.&lt;/p&gt;

&lt;h2 id=&quot;extra-database-column&quot;&gt;Extra database column&lt;/h2&gt;

&lt;p&gt;Extend the records table in the database with an extra field for the selected thesaurus. This is usually a manual operation on the database.&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;ALTER&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;records&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;ADD&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inspiretheme&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;VARCHAR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;add-parameter-to-pycsw&quot;&gt;Add parameter to pycsw&lt;/h2&gt;

&lt;p&gt;In &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pycsw/core/config.py&lt;/code&gt; the newly created database column can be registered to pycsw.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;&apos;pycsw:InspireTheme&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;inspiretheme&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;add-column-to-mapping&quot;&gt;Add column to mapping&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;etc/mappings.py&lt;/code&gt; links the pycsw parameter to the columnname in the table.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;&apos;pycsw:InspireTheme&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;inspiretheme&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;define-parameter-as-queryable&quot;&gt;Define parameter as queryable&lt;/h2&gt;

&lt;p&gt;Which of the parameters are queryable is defined in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pycsw/core/repository.py&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s&quot;&gt;&apos;inspiretheme&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;inspiretheme&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;add-parameter-to-record-results&quot;&gt;Add parameter to record results?&lt;/h2&gt;

&lt;p&gt;Keywords are already published in records, so there is generally no need to extend the record with the new parameter. If needed you can do so in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pycsw/ogc/api/records.py&lt;/code&gt; (Line 1150).&lt;/p&gt;

&lt;h2 id=&quot;populate-the-parameter-from-record-imports&quot;&gt;Populate the parameter from record imports&lt;/h2&gt;

&lt;p&gt;We have 2 options here, either manage the population of the column within the database as part of an insert trigger on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;record.themes&lt;/code&gt; field. Alternatively update &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pycsw/core/metadata.py&lt;/code&gt; so the column is populated when records are imported.&lt;/p&gt;

&lt;p&gt;For the second option consider the following code. For each of the keyword blocks, it tries to match the thesaurus title or uri and, if matched, adds the keywords to the new parameter.&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;_set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;recobj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;pycsw:InspireTheme&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;, &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keywords&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;md_identification&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keywords&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;hasattr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;thesaurus&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; 
        &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thesaurus&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&apos;title&apos;&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thesaurus&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thesaurus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;title&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thesaurus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;title&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;GEMET - INSPIRE themes, version 1.0&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;GEMET Themes, version 2.3&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&apos;uri&apos;&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thesaurus&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thesaurus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;uri&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;thesaurus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&apos;uri&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&apos;http://inspire.ec.europa.eu/theme&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;add-parameter-to-ogc-api---records-facets&quot;&gt;Add parameter to OGC API - Records facets&lt;/h2&gt;

&lt;p&gt;Facets enable to further limit search results. Keywords from thesauri are very useful to add as facet. Add the paremeter to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;default.yml&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;facets&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;type&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;inspiretheme&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
				
				<pubDate>Wed, 18 Sep 2024 14:59:00 -0400</pubDate>
				
				<link>https://pycsw.org/2024/08/18/keyword-from-thesaurus.html</link>
				<guid isPermaLink="true">https://pycsw.org/2024/08/18/keyword-from-thesaurus.html</guid>
			</item>
		
			<item>
				<title>Dashboarding with pycsw and Apache Superset</title>
				<description>&lt;h2 id=&quot;dashboarding-with-pycsw-and-apache-superset&quot;&gt;Dashboarding with pycsw and Apache Superset&lt;/h2&gt;

&lt;p&gt;At &lt;a href=&quot;https://isric.org&quot;&gt;ISRIC - World Soil Information&lt;/a&gt; we’re in the process of adopting pycsw in a data
workflow related to the &lt;a href=&quot;https://www.ejpsoil.eu&quot;&gt;EJP Soil&lt;/a&gt; project. One of the project requirenements is to provide a dashboard with catalogue statistics. 
On one hand to better understand the content of the catalogue, but also to identify gaps in data availability, by location, date and/or topic.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://pycsw.org/img/superset-dashboard.png&quot; alt=&quot;Apache Superset dashboard visualizaion of pycsw catalogue&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;

&lt;p&gt;At ISRIC we’re already using &lt;a href=&quot;https://superset.apache.org/&quot;&gt;Apache Superset&lt;/a&gt; in some of our projects, so it was relatively easy to add 
the pycsw database and set up the initial dashboard vizualisations. The initiative was appreciated, so these days we include the dashboard 
in each of the pycsw deployments.&lt;/p&gt;

&lt;p&gt;Superset is a tool to create dashboard vizualisations on (relational) databases. It is not as full featured as Kibana or Tableau. 
But it does offer a considerable set of features and fits well in the Open Source aspect of pycsw.&lt;/p&gt;

&lt;p&gt;In this blog I’ll give a quick starter on how to get started. Note that for production systems I recommend to set up proper 
authentication and Redis Cache for improved performance.&lt;/p&gt;

&lt;p&gt;The starting point is https://hub.docker.com/r/apache/superset which provides good guidance on how to get started with superset. 
The guidance suggests to install the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;World Bank&apos;s Health Nutrition and Population Stats&lt;/code&gt; samples. Which is a nice example, 
but it is probably better to continue with a clean environment. 
A SQLite driver is available by default, but you need to tweak the config file to allow connections to sqlite.&lt;/p&gt;

&lt;p&gt;If you aim to connect to a pycsw PostGreSQL database, you need to add the &lt;a href=&quot;https://www.psycopg.org/docs/&quot;&gt;psycopg2&lt;/a&gt; driver to the docker 
image. Alexander Mencevice prepared some &lt;a href=&quot;https://github.com/amancevice/docker-superset/tree/main/examples/postgres&quot;&gt;docker compose&lt;/a&gt; 
examples for setting up superset with postgres (and redis).&lt;/p&gt;

&lt;p&gt;With a running superset instance you can now login and connect to the pycsw database. Setting up vizualisations on fields such as accessconstraints 
is quite straight forward.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;On datasets create a new dataset based on the connected database and select the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;records&lt;/code&gt; table.&lt;/li&gt;
  &lt;li&gt;Then the dataset &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;explore&lt;/code&gt; screen opens.&lt;/li&gt;
  &lt;li&gt;Select a chart type (for example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pie-chart&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;Select group by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;identifier&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;On the simple tab in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metrics&lt;/code&gt;, select &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accessconstraints&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Count&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Save&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Run query&lt;/code&gt; to get your first chart.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can now add the chart to a dashboard.&lt;/p&gt;

&lt;p&gt;Sharing the dashboard to the public can be done by publishing the dashboard. But also you need to give &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;public&lt;/code&gt; access to the datasets behind the charts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Open the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;List Roles&lt;/code&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Settings&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Edit&lt;/code&gt; the public role.&lt;/li&gt;
  &lt;li&gt;Start typing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;datasource access on [My database][records](id:7)&lt;/code&gt; and select the relevant dataset from autocomplete.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;unnesting-json-type-pycsw-fields&quot;&gt;Unnesting json type pycsw fields&lt;/h2&gt;

&lt;p&gt;In recent versions pycsw introduced a number of fields which contain json. Superset currently is not able to parse json and use it in charts. However you can 
set up saved queries and use them as datasets. In a saved query you can place advanced PostGres SQL to parse and unnest the json. 
&lt;a href=&quot;https://www.postgresql.org/docs/current/functions-json.html&quot;&gt;JSON support&lt;/a&gt; in postgres has evolved quite a bit in recent versions. 
Note that you have to parse the json to string of record(set). In case of record(set) you need to join the result of the json parsing back 
to the original resultset (unnest). An example of a query to unnest the pycsw links:&lt;/p&gt;

&lt;div class=&quot;language-sql highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;identifier&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;protocol&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; 
  &lt;span class=&quot;n&quot;&gt;records&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; 
  &lt;span class=&quot;n&quot;&gt;json_to_recordset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;cast&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;links&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;protocol&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Saved queries are created in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SQL lab&lt;/code&gt;. Click &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Explore&lt;/code&gt; once the query is ok to save it and create a vizualisation on it. Note that you have 
to give access to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;public&lt;/code&gt; on the saved query for it to be available publicly.&lt;/p&gt;
</description>
				
				<pubDate>Thu, 24 Nov 2022 07:59:00 -0400</pubDate>
				
				<link>https://pycsw.org/2022/11/24/pycsw-with-superset.html</link>
				<guid isPermaLink="true">https://pycsw.org/2022/11/24/pycsw-with-superset.html</guid>
			</item>
		
			<item>
				<title>pycsw May 2022 code sprint report</title>
				<description>&lt;h2 id=&quot;pycsw-may-2022-code-sprint-report&quot;&gt;pycsw May 2022 code sprint report&lt;/h2&gt;

&lt;p&gt;The second pycsw &lt;a href=&quot;https://github.com/geopython/pycsw/wiki/Code-Sprint-2022-05&quot;&gt;code sprint&lt;/a&gt; was held on 23 - 25 May 2022.  The
sprint was held virtually (Jitsi/Gitter) and involved collaboration between both users and developers.  A number of areas were
discussed and addressed, which are elaborated on in detail below.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;CSW Federated search fixes: &lt;a href=&quot;https://github.com/geopython/pycsw/issues/729&quot;&gt;issue 729&lt;/a&gt; was tested and validated&lt;/li&gt;
  &lt;li&gt;OWSLib ISO constraint parsing: testing and discussion of OWSLib &lt;a href=&quot;https://github.com/geopython/OWSLib/pull/799&quot;&gt;PR 799&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;XSLT support: &lt;a href=&quot;https://github.com/geopython/pycsw/pull/765&quot;&gt;implementation&lt;/a&gt; of &lt;a href=&quot;https://github.com/geopython/pycsw/issues/761&quot;&gt;issue 761&lt;/a&gt; in&lt;/li&gt;
  &lt;li&gt;SOLR repository backends: initial SOLR backed support was implemented in &lt;a href=&quot;https://github.com/epifanio/adc-pycsw&quot;&gt;https://github.com/epifanio/adc-pycsw&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;JSON storage: as per &lt;a href=&quot;https://github.com/geopython/pycsw/issues/704&quot;&gt;issue 704&lt;/a&gt;, initial JSON support was &lt;a href=&quot;https://github.com/geopython/pycsw/pull/766&quot;&gt;implemented&lt;/a&gt; along with an OGC API - Records parser / ingest&lt;/li&gt;
  &lt;li&gt;Security, access control and transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More information on the sprint can be found on the &lt;a href=&quot;https://github.com/geopython/pycsw/wiki/Code-Sprint-2022-05&quot;&gt;pycsw wiki&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you to everyone who contributed their time/resources/facilities to the sprint - see you in Florence at &lt;a href=&quot;https://2022.foss4g.org&quot;&gt;FOSS4G 2022&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://pycsw.org/img/pycsw-codesprint-may-2022.png&quot; alt=&quot;pycsw code sprint May 2022&quot; /&gt;&lt;/p&gt;
</description>
				
				<pubDate>Sun, 29 May 2022 07:59:00 -0400</pubDate>
				
				<link>https://pycsw.org/2022/05/29/pycsw-may-2022-codesprint-report.html</link>
				<guid isPermaLink="true">https://pycsw.org/2022/05/29/pycsw-may-2022-codesprint-report.html</guid>
			</item>
		
			<item>
				<title>pycsw May 2022 code sprint</title>
				<description>&lt;h2 id=&quot;pycsw-may-2022-code-sprint&quot;&gt;pycsw May 2022 code sprint&lt;/h2&gt;

&lt;p&gt;pycsw will hold a virtual sprint on 23 - 25 May 2022.  The purpose of the sprint
will be to focus on features for the 3.0 release (OGC API - Records support, JSON backend
support, custom transformations, etc.).&lt;/p&gt;

&lt;p&gt;More information on the sprint can be found on the &lt;a href=&quot;https://github.com/geopython/pycsw/wiki/Code-Sprint-2022-05&quot;&gt;pycsw wiki&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Looking forward to seeing you there!&lt;/p&gt;
</description>
				
				<pubDate>Mon, 18 Apr 2022 14:14:49 -0400</pubDate>
				
				<link>https://pycsw.org/2022/04/18/pycsw-may-2022-codesprint.html</link>
				<guid isPermaLink="true">https://pycsw.org/2022/04/18/pycsw-may-2022-codesprint.html</guid>
			</item>
		
			<item>
				<title>pycsw turns 10!</title>
				<description>&lt;h2 id=&quot;10-years--happy-birthday-pycsw-&quot;&gt;10 years – Happy birthday pycsw! 🎉&lt;/h2&gt;

&lt;p&gt;This year (02 December) marks the 10th anniversary of the pycsw project.  From
the &lt;a href=&quot;https://github.com/geopython/pycsw/commit/2025ff4b5a00ef97ffadb9f53075df84bf03e697&quot;&gt;initial commit&lt;/a&gt;
on &lt;a href=&quot;https://sourceforge.net/projects/pycsw/&quot;&gt;SourceForge&lt;/a&gt;, and subsequent
&lt;a href=&quot;https://kralidis.ca/blog/2011/02/04/help-wanted-baking-a-csw-server-in-python&quot;&gt;announcement&lt;/a&gt;,
of the project, pycsw has evolved into a stable, production ready and core
spatial data infrastructure (SDI) component for disseminating metadata via the
OGC CSW specification.&lt;/p&gt;

&lt;p&gt;pycsw powers numerous high profile open data / SDI activities, including US
Data.gov, LINZ, Geodata.gov.gr, IOOS, NOAA, WMO WOUDC, UN WFP, Copernicus and
GEOSS.  The flexible nature of the project has also resulted in integration
with leading open data management systems such as CKAN and GeoNode.&lt;/p&gt;

&lt;p&gt;From day one, pycsw has always strived to be OGC Compliant.  The project
continues to be a leading OGC Reference Implementation of CSW.  In addition,
pycsw continues as a long standing OSGeo project and a core component of the
growing ecosystem of &lt;a href=&quot;https://geopython.github.io&quot;&gt;geopython&lt;/a&gt; projects for the
open source geospatial community.&lt;/p&gt;

&lt;h2 id=&quot;future-plans&quot;&gt;Future plans&lt;/h2&gt;

&lt;p&gt;The project will continue to evolve into the future.  pycsw’s flexible nature
will continue to support new metadata formats, as well as integration with
downstream applications.  To support OGC CSW as a baseline OGC web service
specification, as well as the evolving OGC API efforts to modernize web service
APIs, pycsw will continue to support CSW 2/3, as well as the emerging
OGC API - Records specification.&lt;/p&gt;

&lt;p&gt;Thank you to the pycsw community, OSGeo, OGC and beyond for your support
and use of our lightweight, flexible and OGC compliant metadata catalogue
server – happy birthday pycsw!&lt;/p&gt;

&lt;p&gt;Sincerly&lt;/p&gt;

&lt;p&gt;The pycsw &lt;a href=&quot;https://pycsw.org/community/psc.html&quot;&gt;Project Steering Committee&lt;/a&gt;&lt;/p&gt;
</description>
				
				<pubDate>Mon, 07 Dec 2020 05:34:39 -0500</pubDate>
				
				<link>https://pycsw.org/2020/12/07/pycsw-turns-10.html</link>
				<guid isPermaLink="true">https://pycsw.org/2020/12/07/pycsw-turns-10.html</guid>
			</item>
		
			<item>
				<title>pycsw 2.6.0 released</title>
				<description>&lt;p&gt;The pycsw team announces the release of pycsw 2.6.0.&lt;/p&gt;

&lt;p&gt;This release brings various enhancements to OpenSearch temporal support, cloud
enhancements, and 12 factor support.  This release also drops all Python 2
support given the &lt;a href=&quot;https://pythonclock.org&quot;&gt;Python 2 end of life&lt;/a&gt; which occured
on 01 January 2020.  Users are strongly encouraged to update their deployments
to Python 3 as soon as possible.&lt;/p&gt;

&lt;h2 id=&quot;source-and-binary-downloads&quot;&gt;Source and binary downloads:&lt;/h2&gt;

&lt;p&gt;The source code is available at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pycsw.org/download&quot;&gt;https://pycsw.org/download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PyPI packages are available at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pypi.org/project/pycsw&quot;&gt;https://pypi.org/project/pycsw&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;version-260-2020-12-05&quot;&gt;Version 2.6.0 (2020-12-05):&lt;/h2&gt;

&lt;p&gt;[Bulleted list of enhancements / bug fixes]&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;fix GetRecords startposition empty parameter fixes&lt;/li&gt;
  &lt;li&gt;update OpenSearch temporal extent query support&lt;/li&gt;
  &lt;li&gt;add 12 factor support&lt;/li&gt;
  &lt;li&gt;support environment variables in configuration&lt;/li&gt;
  &lt;li&gt;add kubernetes and helm configurations&lt;/li&gt;
  &lt;li&gt;fix quoting for PostgreSQL backends&lt;/li&gt;
  &lt;li&gt;add logging switch to pycsw-admin.py CLI to stdout&lt;/li&gt;
  &lt;li&gt;safeguard XML as bytes to unicode&lt;/li&gt;
  &lt;li&gt;update core model xml column to Unicode on repository creation&lt;/li&gt;
  &lt;li&gt;handle different formats for CRS code input&lt;/li&gt;
  &lt;li&gt;add test for invalid gml:posList geometry&lt;/li&gt;
  &lt;li&gt;drop all Python 2 support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Testers and developers are welcome.&lt;/p&gt;

&lt;p&gt;The pycsw developer team.
&lt;a href=&quot;https://pycsw.org&quot;&gt;https://pycsw.org&lt;/a&gt;&lt;/p&gt;
</description>
				
				<pubDate>Sat, 05 Dec 2020 08:47:00 -0500</pubDate>
				
				<link>https://pycsw.org/2020/12/05/pycsw-260-released.html</link>
				<guid isPermaLink="true">https://pycsw.org/2020/12/05/pycsw-260-released.html</guid>
			</item>
		
			<item>
				<title>pycsw 2.4.0 released</title>
				<description>&lt;p&gt;The pycsw team announces the release of pycsw 2.4.0.&lt;/p&gt;

&lt;p&gt;Note that though pycsw works with Python 2 and 3, we have turned
off Python 2 testing given the &lt;a href=&quot;https://pythonclock.org&quot;&gt;Python 2 end of life&lt;/a&gt;
scheduled for 01 January 2020.  Users are strongly encouraged to update
their deployments to Python 3 as soon as possible.&lt;/p&gt;

&lt;h2 id=&quot;source-and-binary-downloads&quot;&gt;Source and binary downloads:&lt;/h2&gt;

&lt;p&gt;The source code is available at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pycsw.org/download&quot;&gt;https://pycsw.org/download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PyPI packages are available at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://pypi.org/project/pycsw&quot;&gt;https://pypi.org/project/pycsw&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;version-240-2019-05-17&quot;&gt;Version 2.4.0 (2019-05-17):&lt;/h2&gt;

&lt;p&gt;[Bulleted list of enhancements / bug fixes]&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;fix CAT 3.0 schema locations&lt;/li&gt;
  &lt;li&gt;fix to handle plugin loading across various operating systems&lt;/li&gt;
  &lt;li&gt;bump of requirements&lt;/li&gt;
  &lt;li&gt;new project logos&lt;/li&gt;
  &lt;li&gt;safeguard WKT exceptions against newer versions of Shapely&lt;/li&gt;
  &lt;li&gt;updated Chinese translations&lt;/li&gt;
  &lt;li&gt;enhancements and fixes to large metadata harvesting workflows&lt;/li&gt;
  &lt;li&gt;safeguard async naming for Python 3.7&lt;/li&gt;
  &lt;li&gt;OpenSearch description document updates&lt;/li&gt;
  &lt;li&gt;startposition fixes to for GetRecords workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Testers and developers are welcome.&lt;/p&gt;

&lt;p&gt;We would like to thank &lt;a href=&quot;https://osgeo.org&quot;&gt;OSGeo&lt;/a&gt; and the &lt;a href=&quot;https://wiki.osgeo.org/wiki/OSGeo_Community_Sprint_2019&quot;&gt;2019 Minneapolis Code Sprint&lt;/a&gt; organizers and sponsors for their support.&lt;/p&gt;

&lt;p&gt;The pycsw developer team.
&lt;a href=&quot;https://pycsw.org/&quot;&gt;https://pycsw.org/&lt;/a&gt;&lt;/p&gt;
</description>
				
				<pubDate>Fri, 17 May 2019 13:34:41 -0500</pubDate>
				
				<link>https://pycsw.org/2019/05/17/pycsw-240-released.html</link>
				<guid isPermaLink="true">https://pycsw.org/2019/05/17/pycsw-240-released.html</guid>
			</item>
		
			<item>
				<title>pycsw 2.2.0 released</title>
				<description>&lt;p&gt;The pycsw team announces the release of pycsw 2.2.0.&lt;/p&gt;

&lt;p&gt;The 2.2.0 release adds WMS 1.3.0 and WPS process harvesting as well as plugin support enhancements.&lt;/p&gt;

&lt;h2 id=&quot;source-and-binary-downloads&quot;&gt;Source and binary downloads:&lt;/h2&gt;

&lt;p&gt;The source code is available at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pycsw.org/download&quot;&gt;http://pycsw.org/download&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;version-220-2018-03-20&quot;&gt;Version 2.2.0 (2018-03-20):&lt;/h2&gt;

&lt;p&gt;[Bulleted list of enhancements / bug fixes]&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Support overriding PYCSW_ROOT via environment variable&lt;/li&gt;
  &lt;li&gt;handle malformed basic service options&lt;/li&gt;
  &lt;li&gt;support Python import for plugins&lt;/li&gt;
  &lt;li&gt;support WMS 1.3.0 harvesting&lt;/li&gt;
  &lt;li&gt;implement CQL to Filter transforms&lt;/li&gt;
  &lt;li&gt;implement WPS process harvesting&lt;/li&gt;
  &lt;li&gt;fix CQL literals with spaces&lt;/li&gt;
  &lt;li&gt;include dct:alternative in CSW3 full output&lt;/li&gt;
  &lt;li&gt;update testing framework to py.test&lt;/li&gt;
  &lt;li&gt;implement OGC filter parsing as Python dict for easy parsing by repository plugins&lt;/li&gt;
  &lt;li&gt;do not silence exceptions on custom plugins&lt;/li&gt;
  &lt;li&gt;support CQL WKT ENVELOPE syntax&lt;/li&gt;
  &lt;li&gt;check forwarded ip address when pycsw is behind a proxy&lt;/li&gt;
  &lt;li&gt;add official Docker implementation&lt;/li&gt;
  &lt;li&gt;fix CSW service / version support (optional in 3.0.0)&lt;/li&gt;
  &lt;li&gt;fix CSW 3 GetRecords POST handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Testers and developers are welcome.&lt;/p&gt;

&lt;p&gt;We would like to thank &lt;a href=&quot;https://osgeo.org&quot;&gt;OSGeo&lt;/a&gt; and the &lt;a href=&quot;https://wiki.osgeo.org/wiki/OSGeo_Code_Sprint_2018&quot;&gt;2018 Bonn Code Sprint&lt;/a&gt; organizers and sponsors for their
support.&lt;/p&gt;

&lt;p&gt;The pycsw developer team.
&lt;a href=&quot;http://pycsw.org/&quot;&gt;http://pycsw.org/&lt;/a&gt;&lt;/p&gt;

</description>
				
				<pubDate>Tue, 20 Mar 2018 06:08:22 -0400</pubDate>
				
				<link>https://pycsw.org/2018/03/20/pycsw-220-released.html</link>
				<guid isPermaLink="true">https://pycsw.org/2018/03/20/pycsw-220-released.html</guid>
			</item>
		
			<item>
				<title>pycsw Security Releases</title>
				<description>&lt;p&gt;The pycsw team announces the release of pycsw 2.0.2, 1.10.5 and 1.8.6.&lt;/p&gt;

&lt;p&gt;This is a security release to mitigate an SQL injection vulnerability
when using CQL or SRU mode queries (&lt;a href=&quot;https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-8640&quot;&gt;CVE-2016-8640&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;You are strongly recommended to update pycsw to the latest stable
releases in the 2.0.x, 1.10.x and 1.8.x release lines.&lt;/p&gt;

</description>
				
				<pubDate>Mon, 14 Nov 2016 07:05:44 -0400</pubDate>
				
				<link>https://pycsw.org/2016/11/14/pycsw-security-releases.html</link>
				<guid isPermaLink="true">https://pycsw.org/2016/11/14/pycsw-security-releases.html</guid>
			</item>
		
			<item>
				<title>pycsw 2.0.0 "Doug" released</title>
				<description>&lt;p&gt;12 July 2016&lt;/p&gt;

&lt;p&gt;The pycsw team proudly announces the release of pycsw 2.0.0 “Doug”.&lt;/p&gt;

&lt;p&gt;The 2.0.0 “Doug” release brings major features, enhancements and fixes to the codebase, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.opengeospatial.org/pressroom/pressreleases/2445&quot;&gt;CSW 3&lt;/a&gt; support (OGC Reference Implementation)&lt;/li&gt;
  &lt;li&gt;Python 3 support&lt;/li&gt;
  &lt;li&gt;WMTS harvesting (thanks @jfdickens)&lt;/li&gt;
  &lt;li&gt;JSON output improvements&lt;/li&gt;
  &lt;li&gt;XML output improvements&lt;/li&gt;
  &lt;li&gt;GM03 support for Swiss metadata&lt;/li&gt;
  &lt;li&gt;add temporal extent support to WMS layer harvesting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full list of enhancements and bug fixes is available at &lt;a href=&quot;https://github.com/geopython/pycsw/milestone/8&quot;&gt;https://github.com/geopython/pycsw/milestone/8&lt;/a&gt;.  Users are strongly advised to review the &lt;a href=&quot;http://docs.pycsw.org/en/2.0.0/migration-guide.html#pycsw-1-x-to-2-0-migration&quot;&gt;migration guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The 2.0.0 release is codenamed “Doug” in honour of &lt;a href=&quot;http://www.opengeospatial.org/blog/2038&quot;&gt;Doug Nebert&lt;/a&gt; of the FGDC. Doug was internationally recognized as a champion of metadata, discovery and interoperability.  Involved in numerous international standards bodies and spatial data infrastructure initiatives, Doug was one of the editors of the CSW 3.0 specification and encouraged pycsw developers to adopt and implement CSW 3.0 as part of US &lt;a href=&quot;https://data.gov&quot;&gt;data.gov&lt;/a&gt; efforts. Doug’s vision and expertise will always be remembered and appreciated by the pycsw development team.&lt;/p&gt;

&lt;p&gt;pycsw is an OGC CSW server implementation written in Python.&lt;/p&gt;

&lt;p&gt;pycsw fully implements the OpenGIS Catalogue Service Implementation Specification (Catalogue Service for the Web). Initial development started in 2010 (more formally announced in 2011). The project is certified OGC Compliant, and is an OGC Reference Implementation. Since 2015, pycsw is an official OSGeo Project.&lt;/p&gt;

&lt;p&gt;pycsw allows for the publishing and discovery of geospatial metadata. Existing repositories of geospatial metadata can also be exposed via numerous APIs (CSW 2/CSW 3, OpenSearch, OAI-PMH, SRU), providing a standards-based metadata and catalogue component of spatial data infrastructures.&lt;/p&gt;

&lt;p&gt;pycsw is Open Source, released under an MIT license, and runs on all major platforms (Windows, Linux, Mac OS X).&lt;/p&gt;

&lt;h2 id=&quot;source-and-binary-downloads&quot;&gt;Source and binary downloads&lt;/h2&gt;
&lt;p&gt;The source code is available at:
&lt;a href=&quot;http://pycsw.org/download&quot;&gt;http://pycsw.org/download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Testers and developers are welcome.&lt;/p&gt;

&lt;p&gt;The pycsw developer team.
&lt;a href=&quot;http://pycsw.org/&quot;&gt;http://pycsw.org/&lt;/a&gt;&lt;/p&gt;

</description>
				
				<pubDate>Tue, 12 Jul 2016 13:13:43 +0000</pubDate>
				
				<link>https://pycsw.org/2016/07/12/pycsw-200-doug-released.html</link>
				<guid isPermaLink="true">https://pycsw.org/2016/07/12/pycsw-200-doug-released.html</guid>
			</item>
		
	</channel>
</rss>

