{"id":1454,"date":"2026-10-26T08:02:56","date_gmt":"2026-10-26T08:02:56","guid":{"rendered":"https:\/\/helpwithmygisassignment.com\/blog\/?p=1454"},"modified":"2026-10-26T08:02:56","modified_gmt":"2026-10-26T08:02:56","slug":"setting-up-an-ogc-compliant-metadata-catalog-with-pycsw","status":"publish","type":"post","link":"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/","title":{"rendered":"Setting Up an OGC-Compliant Metadata Catalog with PyCSW"},"content":{"rendered":"<div><\/div>\n<div>\n<div>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Setting_Up_an_OGC-Compliant_Metadata_Catalog_with_PyCSW\" >Setting Up an OGC-Compliant Metadata Catalog with PyCSW<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Introduction\" >Introduction<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#1_System_Prerequisites_and_Architecture_for_setting_up_an_OGC-Compliant_metadata_catalog_with_PyCSW\" >1. System Prerequisites and Architecture for setting up an OGC-Compliant metadata catalog with PyCSW<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Recommended_architecture\" >Recommended architecture<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Software_requirements\" >Software requirements<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#2_Step_One_Install_PyCSW\" >2. Step One: Install PyCSW<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#3_Step_Two_Configure_the_PyCSW_Metadata_Server\" >3. Step Two: Configure the PyCSW Metadata Server<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Configure_the_server\" >Configure the server<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Configure_metadata_provider_information\" >Configure metadata provider information<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Configure_the_repository\" >Configure the repository<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Protect_catalog_transactions\" >Protect catalog transactions<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#4_Step_Three_Initialize_the_Metadata_Repository\" >4. Step Three: Initialize the Metadata Repository<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#5_Step_Four_Prepare_and_Ingest_XML_Metadata_Records\" >5. Step Four: Prepare and Ingest XML Metadata Records<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Organize_the_metadata_directory\" >Organize the metadata directory<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Load_the_records\" >Load the records<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Validate_metadata_before_publication\" >Validate metadata before publication<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#6_Step_Five_Start_the_Catalog_Service\" >6. Step Five: Start the Catalog Service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#7_Step_Six_Test_the_OGC_CSW_Endpoints\" >7. Step Six: Test the OGC CSW Endpoints<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Test_GetCapabilities\" >Test GetCapabilities<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Test_GetRecords\" >Test GetRecords<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Test_GetRecordById\" >Test GetRecordById<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#8_Step_Seven_Connect_the_Catalog_to_QGIS_MetaSearch\" >8. Step Seven: Connect the Catalog to QGIS MetaSearch<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Configure_the_catalog_connection\" >Configure the catalog connection<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#9_Integrate_with_GeoNode_and_Other_SDI_Portals\" >9. Integrate with GeoNode and Other SDI Portals<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#10_Security_Maintenance_and_Operational_Best_Practices\" >10. Security, Maintenance, and Operational Best Practices<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#11_SEO_Interlinking_and_Further_Reading\" >11. SEO Interlinking and Further Reading<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"Setting_Up_an_OGC-Compliant_Metadata_Catalog_with_PyCSW\"><\/span>Setting Up an OGC-Compliant Metadata Catalog with PyCSW<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"Introduction\"><\/span>Introduction<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A Spatial Data Infrastructure (SDI) is more than a collection of spatial databases and web maps. It also needs a reliable way for people and applications to discover what datasets exist, understand their characteristics, evaluate their quality, and locate the resources required to access them.<\/p>\n<p>Without a metadata catalog, an organization may maintain hundreds of valuable datasets across PostgreSQL databases, file servers, remote sensing repositories, and web mapping services, yet users have no consistent mechanism for finding them.<\/p>\n<p>The Open Geospatial Consortium (OGC) addresses this problem through standards for discovering and querying metadata. The <strong>Catalogue Service for the Web (CSW)<\/strong> defines interfaces through which applications can search catalog records and retrieve descriptions of geospatial resources. These interfaces support interoperable discovery across GIS software, institutional catalogs, and regional or international data infrastructures. See the <a href=\"https:\/\/www.ogc.org\/standards\/cat\/\" target=\"_blank\" rel=\"noopener\">official OGC Catalogue Service standard<\/a>.<\/p>\n<p><a href=\"https:\/\/pycsw.org\/\" target=\"_blank\" rel=\"noopener\">PyCSW<\/a> is an open-source Python implementation of the CSW standard. It publishes metadata records through HTTP endpoints and supports metadata formats and profiles used in geospatial information management, including Dublin Core, FGDC, and ISO metadata profiles.<\/p>\n<p>In this guide, we will deploy a PyCSW metadata server, configure a repository, ingest XML metadata records, test the service, and connect the catalog to QGIS. The result is a reusable foundation for publishing searchable geospatial metadata without building a catalog engine from scratch.<\/p>\n<p><strong>Version note:<\/strong> PyCSW&#8217;s released 2.6.x series uses <code>default.cfg<\/code> and commands such as <code>pycsw-admin.py -c setup_db -f default.cfg<\/code>. The newer 3.0 development documentation uses YAML configuration and updated command names. This guide follows the established <code>default.cfg<\/code> workflow and identifies the newer syntax where it differs. Check the <a href=\"https:\/\/github.com\/geopython\/pycsw\/releases\" target=\"_blank\" rel=\"noopener\">PyCSW releases<\/a> before deploying, and do not mix commands and configuration files from different versions.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"1_System_Prerequisites_and_Architecture_for_setting_up_an_OGC-Compliant_metadata_catalog_with_PyCSW\"><\/span>1. System Prerequisites and Architecture for setting up an OGC-Compliant metadata catalog with PyCSW<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A basic PyCSW deployment requires four components:<\/p>\n<ol start=\"1\">\n<li><strong>PyCSW application:<\/strong> Processes catalog requests and returns metadata responses.<\/li>\n<li><strong>Metadata repository:<\/strong> Stores indexed records and their searchable properties.<\/li>\n<li><strong>Web server or WSGI server:<\/strong> Exposes the application over HTTP.<\/li>\n<li><strong>GIS clients:<\/strong> Discover and query catalog records, for example through QGIS MetaSearch.<\/li>\n<\/ol>\n<h3><span class=\"ez-toc-section\" id=\"Recommended_architecture\"><\/span>Recommended architecture<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1641\" src=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_4byuvo4byuvo4byu-1024x572.jpg\" alt=\"System architecture diagram illustrating PyCSW metadata server parsing XML records from PostGIS and serving OGC CSW endpoints to QGIS and web map portals.\" width=\"1024\" height=\"572\" srcset=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_4byuvo4byuvo4byu-1024x572.jpg 1024w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_4byuvo4byuvo4byu-300x167.jpg 300w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_4byuvo4byuvo4byu-768x429.jpg 768w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_4byuvo4byuvo4byu.jpg 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>For development, SQLite is a convenient repository because it does not require a separate database server. For a larger institutional SDI, PostgreSQL with <a href=\"https:\/\/helpwithmygisassignment.com\/blog\/spatial-window-functions-recursive-ctes-postgis\/\">PostGIS<\/a> can support a more scalable deployment and spatial database integration.<\/p>\n<p>&lt;escape&gt;[Image 1: Architecture diagram of PyCSW catalog server connecting databases to web\/desktop clients]&lt;\/escape&gt;<\/p>\n<p><strong>Alt text:<\/strong> System architecture diagram illustrating PyCSW metadata server parsing XML records from PostGIS and serving OGC CSW endpoints to QGIS and web map portals.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Software_requirements\"><\/span>Software requirements<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<table>\n<tbody>\n<tr>\n<th>Component<\/th>\n<th>Purpose<\/th>\n<\/tr>\n<tr>\n<td>Python 3.x<\/td>\n<td>Runs PyCSW and its supporting libraries<\/td>\n<\/tr>\n<tr>\n<td>PyCSW<\/td>\n<td>Implements the metadata catalog service<\/td>\n<\/tr>\n<tr>\n<td>SQLite or PostgreSQL\/PostGIS<\/td>\n<td>Stores searchable metadata records<\/td>\n<\/tr>\n<tr>\n<td>WSGI server or Apache<\/td>\n<td>Serves the application over HTTP<\/td>\n<\/tr>\n<tr>\n<td>QGIS with MetaSearch<\/td>\n<td>Searches catalog records from a desktop GIS<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The <a href=\"https:\/\/docs.pycsw.org\/en\/2.6.2\/installation.html\" target=\"_blank\" rel=\"noopener\">PyCSW installation documentation<\/a> provides additional information about the supported Python environment and deployment models.<\/p>\n<p>For this tutorial, the main workflow uses a Linux environment, a Python virtual environment, the PyCSW source distribution, and SQLite. The same metadata and request-testing principles also apply to a PostGIS-backed service.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"2_Step_One_Install_PyCSW\"><\/span>2. Step One: Install PyCSW<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Create a directory for the application and prepare an isolated Python environment.<\/p>\n<pre><code>sudo mkdir -p \/opt\/pycsw\r\nsudo chown \"$USER\":\"$USER\" \/opt\/pycsw\r\ncd \/opt\/pycsw\r\n\r\npython3 -m venv .venv\r\nsource .venv\/bin\/activate<\/code><\/pre>\n<p>Download the PyCSW source for a specific release. This provides the sample configuration and WSGI entry point alongside the application code.<\/p>\n<pre><code>git clone --branch 2.6.3 \\\r\n  https:\/\/github.com\/geopython\/pycsw.git source\r\n\r\ncd source\r\n\r\npip install -e .\r\npip install -r requirements-standalone.txt<\/code><\/pre>\n<p>If you deploy a different release, confirm that its source, dependencies, and administration commands match the configuration used here. Pinning a tested release helps prevent unexpected changes during deployment.<\/p>\n<p>Create a writable directory for the repository and copy the sample configuration.<\/p>\n<pre><code>mkdir -p \/opt\/pycsw\/data\r\n\r\ncp default-sample.cfg default.cfg<\/code><\/pre>\n<p>This gives you a working configuration template rather than requiring you to reconstruct every supported setting manually.<\/p>\n<p>For a straightforward PyPI-based installation, you can also install a released package with <code>pip install pycsw<\/code>. In that case, obtain the matching configuration template from the corresponding release and ensure that your WSGI deployment can locate it.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"3_Step_Two_Configure_the_PyCSW_Metadata_Server\"><\/span>3. Step Two: Configure the PyCSW Metadata Server<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The <code>default.cfg<\/code> file defines the service URL, logging settings, metadata profiles, organization details, repository connection, and transaction permissions.<\/p>\n<p>Open it in a text editor:<\/p>\n<pre><code>nano default.cfg<\/code><\/pre>\n<p>Update the main sections with values appropriate for your organization.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Configure_the_server\"><\/span>Configure the server<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<pre><code>[server]\r\nhome=\/opt\/pycsw\/source\r\nurl=http:\/\/localhost:8000\/\r\nmimetype=application\/xml; charset=UTF-8\r\nencoding=UTF-8\r\nlanguage=en-GB\r\nmaxrecords=100\r\nprofiles=apiso\r\nloglevel=INFO<\/code><\/pre>\n<p>The settings have different roles:<\/p>\n<ul>\n<li><code>home<\/code> points to the PyCSW source directory in this deployment.<\/li>\n<li><code>url<\/code> defines the advertised service URL. It must match the address through which clients actually access the service.<\/li>\n<li><code>language<\/code> identifies the service language and country.<\/li>\n<li><code>maxrecords<\/code> limits the number of records returned in a response.<\/li>\n<li><code>profiles=apiso<\/code> enables the ISO metadata application profile for compatible CSW requests.<\/li>\n<li><code>loglevel<\/code> controls the amount of diagnostic information recorded.<\/li>\n<\/ul>\n<p>For production, replace the localhost URL with the public HTTPS endpoint, such as <code>https:\/\/catalog.example.org\/csw<\/code>, and configure the web server routing to match.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Configure_metadata_provider_information\"><\/span>Configure metadata provider information<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The catalog itself should have meaningful service-level metadata so that clients can identify the organization responsible for the service.<\/p>\n<pre><code>[metadata:main]\r\nidentification_title=Institutional Geospatial Metadata Catalog\r\nidentification_abstract=Searchable catalog of institutional geospatial datasets and services\r\nidentification_keywords=GIS, geospatial data, metadata, SDI\r\nidentification_keywords_type=theme\r\n\r\nprovider_name=Example Mapping Agency\r\nprovider_url=https:\/\/catalog.example.org\r\n\r\ncontact_name=Geospatial Data Administrator\r\ncontact_position=SDI Administrator\r\ncontact_email=gis@example.org\r\ncontact_country=Kenya\r\ncontact_role=pointOfContact<\/code><\/pre>\n<p>Replace these example values with real institutional information. Use a contact mailbox that will remain valid when personnel change.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Configure_the_repository\"><\/span>Configure the repository<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>For the local SQLite installation, set:<\/p>\n<pre><code>[repository]\r\ndatabase=sqlite:\/\/\/\/opt\/pycsw\/data\/records.db\r\ntable=records<\/code><\/pre>\n<p>The four slashes in <code>sqlite:\/\/\/\/opt\/pycsw\/data\/records.db<\/code> are intentional: this is an absolute Unix filesystem path encoded as a SQLAlchemy connection URL.<\/p>\n<p>PostgreSQL is another option:<\/p>\n<pre><code>[repository]\r\ndatabase=postgresql:\/\/catalog_user:YOUR_PASSWORD@localhost:5432\/pycsw\r\ntable=records<\/code><\/pre>\n<p>Create the database and account separately, grant only the necessary privileges, and avoid storing production credentials in a publicly accessible configuration file. Use an environment-specific configuration or protected secret management instead.<\/p>\n<p>For PostGIS deployments, enable the PostGIS extension before initializing the PyCSW repository if native PostGIS geometry support is required. Consult the <a href=\"https:\/\/docs.pycsw.org\/en\/2.6.2\/administration.html\" target=\"_blank\" rel=\"noopener\">PyCSW administration documentation<\/a> for database-specific details.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Protect_catalog_transactions\"><\/span>Protect catalog transactions<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>The sample configuration normally disables metadata transactions.<\/p>\n<pre><code>[manager]\r\ntransactions=false\r\nallowed_ips=127.0.0.1<\/code><\/pre>\n<p>Keep transactions disabled unless clients genuinely need to insert, update, or delete records remotely. Enabling them introduces additional security and operational considerations.<\/p>\n<p>For production, the default configuration should be treated as a starting point rather than a complete security policy. Restrict database access, protect application files, and ensure that the web server cannot serve <code>default.cfg<\/code> as a downloadable document.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"4_Step_Three_Initialize_the_Metadata_Repository\"><\/span>4. Step Three: Initialize the Metadata Repository<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A catalog repository stores more than the original XML. PyCSW extracts searchable properties, maintains record identifiers, and makes metadata available through its supported query interfaces.<\/p>\n<p>From the PyCSW source directory, activate the intended Python environment and initialize the database.<\/p>\n<pre><code>cd \/opt\/pycsw\/source\r\nsource \/opt\/pycsw\/.venv\/bin\/activate\r\n\r\npycsw-admin.py -c setup_db -f default.cfg<\/code><\/pre>\n<p>The command creates the required repository structures and indexes for the configured database.<\/p>\n<p>If initialization fails, check the following:<\/p>\n<ul>\n<li>The database directory exists and is writable.<\/li>\n<li>The active Python environment contains the correct PyCSW installation.<\/li>\n<li>The configuration file references the intended database.<\/li>\n<li>PostgreSQL credentials and permissions are correct, if applicable.<\/li>\n<li>You are not accidentally pointing at an already initialized repository.<\/li>\n<\/ul>\n<p>A repository setup command is not an everyday refresh operation. Back up any existing records before rebuilding or replacing repository structures.<\/p>\n<p>The newer PyCSW 3.0 development documentation uses the updated equivalent:<\/p>\n<pre><code>pycsw-admin.py setup-repository --config default.yml<\/code><\/pre>\n<p>This is a different command and configuration format; use it only when following the matching newer release workflow.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"5_Step_Four_Prepare_and_Ingest_XML_Metadata_Records\"><\/span>5. Step Four: Prepare and Ingest XML Metadata Records<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Once the repository exists, populate it with XML metadata files.<\/p>\n<p>PyCSW supports metadata records based on established formats, including:<\/p>\n<ul>\n<li><strong>ISO 19115 \/ ISO 19139:<\/strong> Detailed descriptions of geospatial datasets, including identification, extent, quality, lineage, and responsible parties.<\/li>\n<li><strong>FGDC CSDGM:<\/strong> A metadata standard historically used by many United States geospatial agencies.<\/li>\n<li><strong>Dublin Core:<\/strong> A general-purpose descriptive metadata vocabulary that can support resource discovery.<\/li>\n<\/ul>\n<p>Compatibility depends on the metadata schema, the enabled profile, and the type of request made by the client. For ISO-oriented discovery through CSW 2.0.2, the <code>apiso<\/code> profile is especially relevant.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Organize_the_metadata_directory\"><\/span>Organize the metadata directory<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>For example:<\/p>\n<pre><code>metadata\/\r\n\u251c\u2500\u2500 administrative_boundaries.xml\r\n\u251c\u2500\u2500 roads_network.xml\r\n\u251c\u2500\u2500 landcover_2025.xml\r\n\u2514\u2500\u2500 elevation_model.xml<\/code><\/pre>\n<p>Each file should be well-formed XML and contain a valid, unique record identifier. Metadata should describe the resource accurately, include appropriate spatial or temporal information, and provide valid links to data or related services when available.<\/p>\n<p>A catalog record does not automatically publish the underlying raster, vector dataset, or web map service. It makes the resource discoverable and can contain links through which clients access the resource.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Load_the_records\"><\/span>Load the records<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Run the following command:<\/p>\n<pre><code>pycsw-admin.py -c load_records \\\r\n  -f default.cfg \\\r\n  -p \/opt\/pycsw\/source\/metadata \\\r\n  -r<\/code><\/pre>\n<p>In this example, change the final directory to the actual location of your metadata XML files.<\/p>\n<p>The <code>-r<\/code> option processes subdirectories recursively. To load a single file, pass that file&#8217;s path instead. The <code>-y<\/code> option can be used to overwrite existing records with matching identifiers, but use it only when an update is intended.<\/p>\n<p>After ingestion, review the console output and logs for malformed XML documents or records that could not be parsed.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Validate_metadata_before_publication\"><\/span>Validate metadata before publication<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>A successful import is not a substitute for metadata quality assurance.<\/p>\n<p>Check that each record has a meaningful title, an abstract or description, a responsible organization, a unique identifier, appropriate keywords, and the correct geographic extent. Validate ISO metadata against the intended schema or profile, particularly when records will be harvested by external catalogs.<\/p>\n<p>For an institutional SDI, you can implement automated metadata generation and ISO standards compliance with Python upstream so that newly published spatial datasets arrive with consistent descriptions and identifiers.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"6_Step_Five_Start_the_Catalog_Service\"><\/span>6. Step Five: Start the Catalog Service<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>For an initial test, PyCSW&#8217;s included WSGI entry point can run a small server on port 8000.<\/p>\n<pre><code>cd \/opt\/pycsw\/source\r\nsource \/opt\/pycsw\/.venv\/bin\/activate\r\n\r\npython pycsw\/wsgi.py<\/code><\/pre>\n<p>If successful, the application reports that it is serving requests on port 8000.<\/p>\n<p>This development server is suitable for initial testing, not direct production exposure. In production, use a properly configured WSGI server such as Gunicorn or Apache <code>mod_wsgi<\/code>, usually behind a reverse proxy providing HTTPS, request logging, and other operational controls.<\/p>\n<p>For example, with Gunicorn installed in the same environment:<\/p>\n<pre><code>pip install gunicorn\r\n\r\nexport PYCSW_CONFIG=\/opt\/pycsw\/source\/default.cfg\r\n\r\ngunicorn pycsw.wsgi:application \\\r\n  --bind 127.0.0.1:8000 \\\r\n  --workers 2<\/code><\/pre>\n<p>This makes the WSGI application available locally for a reverse proxy to expose at the intended public path. Verify the public endpoint and the <code>server.url<\/code> setting before allowing external clients to use it.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"7_Step_Six_Test_the_OGC_CSW_Endpoints\"><\/span>7. Step Six: Test the OGC CSW Endpoints<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The next step is to confirm that PyCSW responds correctly to standard catalog requests. These tests check the HTTP service and whether indexed records can be discovered.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Test_GetCapabilities\"><\/span>Test GetCapabilities<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><code>GetCapabilities<\/code> returns information about the service, its operations, supported formats, and capabilities.<\/p>\n<pre><code>curl -G \"http:\/\/localhost:8000\/\" \\\r\n  --data-urlencode \"service=CSW\" \\\r\n  --data-urlencode \"version=2.0.2\" \\\r\n  --data-urlencode \"request=GetCapabilities\"<\/code><\/pre>\n<p>Inspect the XML response. Confirm that the operation names appear correctly and that the service advertises the expected endpoint and metadata profile.<\/p>\n<p>A successful HTTP response alone does not establish complete standards conformance. The XML structure, supported operations, profile declarations, and behavior under representative requests must also be checked.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Test_GetRecords\"><\/span>Test GetRecords<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Use <code>GetRecords<\/code> to search the catalog.<\/p>\n<pre><code>curl -G \"http:\/\/localhost:8000\/\" \\\r\n  --data-urlencode \"service=CSW\" \\\r\n  --data-urlencode \"version=2.0.2\" \\\r\n  --data-urlencode \"request=GetRecords\" \\\r\n  --data-urlencode \"resultType=results\" \\\r\n  --data-urlencode \"typeNames=csw:Record\" \\\r\n  --data-urlencode \"elementSetName=summary\" \\\r\n  --data-urlencode \"maxRecords=10\"<\/code><\/pre>\n<p>The response should contain matching records and basic descriptive fields. If no records are returned, confirm that ingestion succeeded, the request targets the right repository, and the requested record type and profile are supported.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Test_GetRecordById\"><\/span>Test GetRecordById<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To retrieve one complete record, use its actual identifier from the metadata source.<\/p>\n<pre><code>curl -G \"http:\/\/localhost:8000\/\" \\\r\n  --data-urlencode \"service=CSW\" \\\r\n  --data-urlencode \"version=2.0.2\" \\\r\n  --data-urlencode \"request=GetRecordById\" \\\r\n  --data-urlencode \"id=YOUR_METADATA_IDENTIFIER\" \\\r\n  --data-urlencode \"elementSetName=full\"<\/code><\/pre>\n<p>Replace <code>YOUR_METADATA_IDENTIFIER<\/code> with a real identifier rather than the title or filename unless that is explicitly the record&#8217;s identifier.<\/p>\n<p>The full response lets you inspect the metadata elements returned to clients and confirm that the record contains useful information.<\/p>\n<p>For formal testing, use the <a href=\"https:\/\/cite.ogc.org\/te2\/\" target=\"_blank\" rel=\"noopener\">OGC compliance and conformance resources<\/a>, including the applicable CSW test suite. Standards compliance should be verified against the specific CSW version and profile required by your organization.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"8_Step_Seven_Connect_the_Catalog_to_QGIS_MetaSearch\"><\/span>8. Step Seven: Connect the Catalog to QGIS MetaSearch<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1643\" src=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_b5mb7ab5mb7ab5mb-1-1024x572.jpg\" alt=\"\" width=\"1024\" height=\"572\" srcset=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_b5mb7ab5mb7ab5mb-1-1024x572.jpg 1024w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_b5mb7ab5mb7ab5mb-1-300x167.jpg 300w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_b5mb7ab5mb7ab5mb-1-768x429.jpg 768w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_b5mb7ab5mb7ab5mb-1.jpg 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>QGIS includes the MetaSearch catalog client, which can interact with OGC CSW services and supported OGC API &#8211; Records services.<\/p>\n<p>&lt;escape&gt;[Image 2: QGIS MetaSearch plugin connecting to live PyCSW metadata catalog]&lt;\/escape&gt;<\/p>\n<p><strong>Alt text:<\/strong> Screen capture of QGIS MetaSearch plugin querying and discovering spatial datasets live from an OGC-compliant PyCSW catalog endpoint.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Configure_the_catalog_connection\"><\/span>Configure the catalog connection<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol start=\"1\">\n<li>Open QGIS and enable MetaSearch through the Plugin Manager if it is not already available.<\/li>\n<li>Navigate to the MetaSearch interface, usually under the <strong>Web<\/strong> menu.<\/li>\n<li>Open the <strong>Services<\/strong> tab and select <strong>New<\/strong>.<\/li>\n<li>Enter a descriptive service name, such as <code>Institutional PyCSW Catalog<\/code>.<\/li>\n<li>Enter the base service URL, for example <code>https:\/\/catalog.example.org\/csw<\/code>, and select <strong>OGC CSW 2.0.2<\/strong>.<\/li>\n<li>Save the connection, select it, and use the Search tab to query records.<\/li>\n<\/ol>\n<p>For a CSW 2.0.2 connection, QGIS generally requires the base catalog URL rather than a complete <code>GetCapabilities<\/code> request URL. See the <a href=\"https:\/\/docs.qgis.org\/latest\/en\/docs\/user_manual\/plugins\/core_plugins\/plugins_metasearch.html\" target=\"_blank\" rel=\"noopener\">official QGIS MetaSearch documentation<\/a>.<\/p>\n<p>Search using a dataset title, theme keyword, or another supported query property. Inspect the results and confirm that returned records provide appropriate descriptions, extents, and resource links.<\/p>\n<p>If the connection fails, test the endpoint with <code>GetCapabilities<\/code> first. Then check the public URL, reverse-proxy path, HTTPS certificate, firewall configuration, and any access restrictions. A server that responds locally may still be inaccessible to remote desktop clients.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"9_Integrate_with_GeoNode_and_Other_SDI_Portals\"><\/span>9. Integrate with GeoNode and Other SDI Portals<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>PyCSW can also participate in broader metadata discovery infrastructures.<\/p>\n<p>GeoNode uses PyCSW as a catalog component, enabling discovery of geospatial metadata associated with the platform. In the standard GeoNode configuration, this integration is managed by GeoNode itself; a separate standalone PyCSW server is not necessarily required.<\/p>\n<p>See the <a href=\"https:\/\/docs.pycsw.org\/en\/latest\/geonode.html\" target=\"_blank\" rel=\"noopener\">PyCSW GeoNode integration documentation<\/a>.<\/p>\n<p>For an existing SDI, distinguish between two architectures:<\/p>\n<ul>\n<li><strong>Standalone PyCSW:<\/strong> Metadata is imported into a dedicated PyCSW repository.<\/li>\n<li><strong>Integrated catalog:<\/strong> PyCSW exposes metadata managed by another application, such as GeoNode, using the supported repository mapping or integration mechanism.<\/li>\n<\/ul>\n<p>Do not create an independent duplicate catalog unless there is a clear operational need. Duplicate repositories introduce synchronization issues when metadata changes in the source system.<\/p>\n<p>For federation, configure approved remote catalog endpoints and consider how identifiers, access permissions, response times, and duplicated records will be managed. Distributed discovery can extend a local catalog&#8217;s reach, but it does not guarantee that remote datasets are current or accessible.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"10_Security_Maintenance_and_Operational_Best_Practices\"><\/span>10. Security, Maintenance, and Operational Best Practices<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A metadata catalog can be publicly searchable without making its management functions publicly writable.<\/p>\n<p><strong>Protect configuration files.<\/strong> Keep database credentials and service configuration outside publicly served directories. Explicitly deny HTTP access to <code>.cfg<\/code> files and other sensitive deployment files.<\/p>\n<p><strong>Restrict metadata transactions.<\/strong> Leave transactions disabled unless a controlled publishing workflow requires them. If writes are enabled, use authentication and network restrictions appropriate to the deployment.<\/p>\n<p><strong>Use HTTPS in production.<\/strong> Terminate TLS at the reverse proxy or web server, and ensure that the advertised <code>server.url<\/code> uses the correct public HTTPS endpoint.<\/p>\n<p><strong>Back up the repository and metadata sources.<\/strong> SQLite deployments need consistent database backups; PostgreSQL deployments should follow a tested database backup and restoration plan. Keep source XML files so that the catalog can be rebuilt when necessary.<\/p>\n<p><strong>Monitor logs and response behavior.<\/strong> Watch for failed metadata imports, database connectivity problems, malformed requests, long-running searches, and unexpected response sizes.<\/p>\n<p><strong>Maintain stable identifiers.<\/strong> Metadata identifiers should persist across revisions of the same resource where appropriate. Duplicate or inconsistent identifiers complicate record updates and cross-catalog harvesting.<\/p>\n<p><strong>Control record growth.<\/strong> Review the need for database optimization and index maintenance as the catalog expands. PyCSW&#8217;s administration utilities include commands for optimizing certain supported database backends and rebuilding database indexes.<\/p>\n<p><strong>Revalidate after upgrades.<\/strong> Test <code>GetCapabilities<\/code>, <code>GetRecords<\/code>, <code>GetRecordById<\/code>, profile-specific queries, and client interoperability whenever the application, database, or reverse-proxy configuration changes.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"11_SEO_Interlinking_and_Further_Reading\"><\/span>11. SEO Interlinking and Further Reading<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Suggested internal links:<\/p>\n<ul>\n<li><a href=\"https:\/\/chatgpt.com\/guides\/automated-metadata-generation-python\/\" target=\"_blank\" rel=\"noopener\">Automated Geospatial Metadata Generation with Python<\/a> \u2014 for generating standardized metadata records as part of publishing pipelines.<\/li>\n<li><a href=\"https:\/\/chatgpt.com\/guides\/docker-gis-deployment\/\" target=\"_blank\" rel=\"noopener\">Docker-Based GIS Infrastructure Deployment<\/a> \u2014 for containerized deployment, service orchestration, and reproducible environments.<\/li>\n<li><a href=\"https:\/\/chatgpt.com\/guides\/postgis-database-security\/\" target=\"_blank\" rel=\"noopener\">Spatial Database Security with PostgreSQL and PostGIS<\/a> \u2014 for account privileges, connection management, and database hardening.<\/li>\n<\/ul>\n<p>Replace these suggested paths with the actual URLs on your website.<\/p>\n<p>Recommended external resources:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.pycsw.org\/en\/2.6.2\/\" target=\"_blank\" rel=\"noopener\">PyCSW Documentation<\/a> \u2014 installation, configuration, administration, and profile support.<\/li>\n<li><a href=\"https:\/\/github.com\/geopython\/pycsw\/releases\" target=\"_blank\" rel=\"noopener\">PyCSW Releases<\/a> \u2014 current release information and upgrade reference.<\/li>\n<li><a href=\"https:\/\/www.ogc.org\/standards\/cat\/\" target=\"_blank\" rel=\"noopener\">OGC Catalogue Service Standard<\/a> \u2014 formal catalog interoperability standards.<\/li>\n<li><a href=\"https:\/\/docs.qgis.org\/latest\/en\/docs\/user_manual\/plugins\/core_plugins\/plugins_metasearch.html\" target=\"_blank\" rel=\"noopener\">QGIS MetaSearch Documentation<\/a> \u2014 client setup and catalog discovery.<\/li>\n<li><a href=\"https:\/\/cite.ogc.org\/te2\/\" target=\"_blank\" rel=\"noopener\">OGC Conformance Testing<\/a> \u2014 test resources for validating supported standards.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1644\" src=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_qi7r55qi7r55qi7r-1024x572.jpg\" alt=\"\" width=\"1024\" height=\"572\" srcset=\"https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_qi7r55qi7r55qi7r-1024x572.jpg 1024w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_qi7r55qi7r55qi7r-300x167.jpg 300w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_qi7r55qi7r55qi7r-768x429.jpg 768w, https:\/\/helpwithmygisassignment.com\/blog\/wp-content\/uploads\/2026\/10\/Gemini_Generated_Image_qi7r55qi7r55qi7r.jpg 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>PyCSW provides a practical foundation for an OGC CSW metadata catalog within a Spatial Data Infrastructure. By configuring the service endpoint, initializing SQLite or PostGIS storage, ingesting valid XML metadata, and testing standard CSW requests, GIS administrators can make institutional datasets discoverable through compatible applications and portals.<\/p>\n<p>A successful deployment involves more than getting the server to respond. Records must be meaningful and consistently identified, metadata profiles must match client expectations, configuration files must be protected, and the public endpoint must be correctly advertised.<\/p>\n<p><strong>The key maintenance principle is to treat the catalog as an operational SDI service, not a one-time installation.<\/strong> Automate metadata creation, validate incoming records, monitor repository health, test interoperability after updates, and keep the service aligned with the OGC standards required by your users.<\/p>\n<\/div>\n<div>\n<div>\n<div>Add a complete sample metadata recordFix the deployment path consistency<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Setting Up an OGC-Compliant Metadata Catalog with PyCSW Introduction A Spatial Data Infrastructure (SDI) is more than a collection of spatial databases and web maps. It also needs a reliable way for people and applications to discover what datasets exist, understand their characteristics, evaluate their quality, and locate the resources required to access them. Without &#8230; <a title=\"Setting Up an OGC-Compliant Metadata Catalog with PyCSW\" class=\"read-more\" href=\"https:\/\/helpwithmygisassignment.com\/blog\/setting-up-an-ogc-compliant-metadata-catalog-with-pycsw\/\" aria-label=\"Read more about Setting Up an OGC-Compliant Metadata Catalog with PyCSW\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":1641,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,4],"tags":[],"class_list":["post-1454","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","category-gis-articles"],"_links":{"self":[{"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/posts\/1454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/comments?post=1454"}],"version-history":[{"count":5,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/posts\/1454\/revisions"}],"predecessor-version":[{"id":1645,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/posts\/1454\/revisions\/1645"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/media\/1641"}],"wp:attachment":[{"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/media?parent=1454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/categories?post=1454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helpwithmygisassignment.com\/blog\/wp-json\/wp\/v2\/tags?post=1454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}