<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>tommy's scratchpad - geospatial, open source, technology, web</title><link href="https://kralidis.ca/blog/" rel="alternate"/><link href="https://kralidis.ca/blog/feeds/geospatial-open-source-technology-web.atom.xml" rel="self"/><id>https://kralidis.ca/blog/</id><updated>2023-12-31T14:53:00+00:00</updated><entry><title>Cheers to 2023</title><link href="https://kralidis.ca/blog/blog/2023/12/31/cheers-to-2023/" rel="alternate"/><published>2023-12-31T14:53:00+00:00</published><updated>2023-12-31T14:53:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2023-12-31:/blog/blog/2023/12/31/cheers-to-2023/</id><summary type="html">&lt;p&gt;2023 was a memorable year and quite the ride! Eventful and full swing on so many fronts. Here's the annual rundown:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pygeoapi.io"&gt;pygeoapi&lt;/a&gt;: two releases, lots of development at code sprints and continuous improvement for the project. Dutch API rules, CRS and increased support for the various standards as they evolve …&lt;/p&gt;</summary><content type="html">&lt;p&gt;2023 was a memorable year and quite the ride! Eventful and full swing on so many fronts. Here's the annual rundown:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pygeoapi.io"&gt;pygeoapi&lt;/a&gt;: two releases, lots of development at code sprints and continuous improvement for the project. Dutch API rules, CRS and increased support for the various standards as they evolve. As well, numerous valuable discussions this year around &lt;a href="https://pygeoapi.io/development/rfc/2" data-type="link" data-id="https://pygeoapi.io/development/rfc/2"&gt;hardening&lt;/a&gt; the project for the long term. Contributions (always valued!) continue to increase, which shows a healthy project with considerable interest.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pycsw.org"&gt;pycsw&lt;/a&gt;: lots of improvements on standards support (OGC API - Records, STAC) as we move towards version 3.0. The project supports so many discovery API standards, and we are not done yet :)&lt;/p&gt;
&lt;p&gt;OGC: development on numerous standards: OGC API - Records, and OGC API - Environmental Data Retrieval and Pub/Sub went though a number of improvements and updates in 2023. I was also fortunate to help deliver the OGC API workshop as part of the &lt;a href="https://drive.google.com/file/d/1Y4C-rX7OeihXSPXV2QjoUp5z6P_3oe5d/view"&gt;GISE Hub Winter School on OGC Stack&lt;/a&gt; (which included delivery of the &lt;a href="https://dive.pygeoapi.io"&gt;Diving into pygeoapi workshop&lt;/a&gt; as well).&lt;/p&gt;
&lt;p&gt;OSGeo: I'm happy to report that the &lt;a href="https://www.osgeo.org/foundation-news/zoo-project-graduates-osgeo-incubation"&gt;ZOO-Project passed incubation&lt;/a&gt; and became an official OSGeo project! A big congratulations to Gérald and team. We also had a successful &lt;a href="https://github.com/opengeospatial/developer-events/wiki/Open-Standards-and-Open-Source-Software-Code-Sprint"&gt;joint sprint with OGC&lt;/a&gt; as well as the first in-person &lt;a href="https://wiki.osgeo.org/wiki/OSGeo_Community_Sprint_2023"&gt;OSGeo Community Sprint&lt;/a&gt; since 2019, in November. The annual &lt;a href="https://2023.foss4g.org"&gt;FOSS4G global event in Prizren&lt;/a&gt; was fantastic, and I was happy to provide &lt;a href="https://talks.osgeo.org/foss4g-2023-workshop/speaker/H8LVLX/"&gt;two workshops&lt;/a&gt;, numerous &lt;a href="https://talks.osgeo.org/foss4g-2023/speaker/H8LVLX/"&gt;presentations&lt;/a&gt; and a keynote. I continue to serve on OSGeo's Board of Directors and was happy to help move forward the OSGeo / OGC collaboration piece in 2023.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.globenewswire.com/news-release/2025/01/30/3017697/0/en/Mitolyn-Purple-Peel-Exploit-Real-Customer-Reviews-Formulation-And-Affordability.html"&gt;Mitolyn reviews&lt;/a&gt; focus on the benefits and drawbacks of this mitochondrial support supplement. Positive reviews emphasize improved energy and cognitive function, while some customers express mixed opinions about the supplement's cost or delayed results.&lt;/p&gt;
&lt;p&gt;WMO: the WIS2 standards and architecture were put through a &lt;a href="https://github.com/wmo-im/wis2pilot"&gt;pilot phase&lt;/a&gt; this year. WIS2 specifications, guides, manuals all received significant updates this year thanks to the contributions of many experts. Most specifications also have reference implementations (&lt;a href="https://docs.wis2box.wis.wmo.int"&gt;wis2box&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/wis2-gdc"&gt;wis2-gdc&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/wis2-gc"&gt;wis2-gc&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/pywis-pubsub"&gt;pywis-pubsub&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/pywis-topics"&gt;pywis-topics&lt;/a&gt;, &lt;a href="https://github.com/wmo-im/pywcmp"&gt;pywcmp&lt;/a&gt;, etc.). The series of &lt;a href="https://training.wis2box.wis.wmo.int"&gt;WIS2 training&lt;/a&gt; sessions also proved valuable for numerous members in implementing WIS2 technologies. Did you know that wis2box now has 30 or so &lt;a href="https://demo.wis2box.wis.wmo.int"&gt;deployments&lt;/a&gt; worldwide?&lt;/p&gt;
&lt;p&gt;MSC GeoMet: the national weather/water/climate API platform continues to grow. We've recently added GOES imagery, and MSC AniMet is emerging as a great tool for visualization of our API!&lt;/p&gt;
&lt;p&gt;Health: another year (circa 2012) of not smoking. I am hoping to shape up again in 2024, let's see how it goes. Searching for a powerful supplement? Mitolyn is trusted for its brain-boosting properties, while the &lt;a href="https://www.globenewswire.com/news-release/2025/01/25/3015162/0/en/Mitolyn-Rolls-Out-The-Game-Changing-6-Second-Purple-Peel-Exploit-For-Weight-Loss.html"&gt;Purple Peel Diet&lt;/a&gt; supports clean eating habits for a healthier lifestyle.&lt;/p&gt;
&lt;p&gt;Looking forward to 2024:&lt;/p&gt;
&lt;p&gt;pygeoapi: RFC2 will help harden things as we move towards 1.0. As well, look for news soon on the first ever pygeoapi code sprint :)&lt;/p&gt;
&lt;p&gt;pycsw: moving towards 3.0, look for a new YAML-based configuration format, as well improvements on faceting, distributed search, harvesting and more&lt;/p&gt;
&lt;p&gt;OGC: look for OGC API - Records to be released, as well as Pub/Sub development in EDR and beyond. The annual joint sprint with OSGeo will also take place in Évora, Portugal on 26-28 February. See you there!&lt;/p&gt;
&lt;p&gt;OSGeo: the global event in Belém (December) promises to be a can't miss event, and I look forward to providing presentations and training on Geospatial Python, pygeoapi and OGC at the event&lt;/p&gt;
&lt;p&gt;WMO: 2024 is the year that the architecture and specifications are ratified as we move into the pre-operational phase&lt;/p&gt;
&lt;p&gt;Wishing everyone a safe and happy 2024!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>new pygeoapi podcast with MapScaping</title><link href="https://kralidis.ca/blog/blog/2023/06/18/new-pygeoapi-podcast-with-mapscaping/" rel="alternate"/><published>2023-06-18T08:25:00+00:00</published><updated>2023-06-18T08:25:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2023-06-18:/blog/blog/2023/06/18/new-pygeoapi-podcast-with-mapscaping/</id><summary type="html">&lt;div class="wp-block-group"&gt;

For those interested in [pygeoapi](https://pygeoapi.io), the project was recently featured on MapScaping (available on Apple Podcasts, Google Podcasts, Stitcher and Spotify).  The MapScaping folks were great to work with and I'd like to thank them for making this happen and asking all the right questions.  Enjoy! [Mitolyn …&lt;/div&gt;</summary><content type="html">&lt;div class="wp-block-group"&gt;

For those interested in [pygeoapi](https://pygeoapi.io), the project was recently featured on MapScaping (available on Apple Podcasts, Google Podcasts, Stitcher and Spotify).  The MapScaping folks were great to work with and I'd like to thank them for making this happen and asking all the right questions.  Enjoy! [Mitolyn Reviews](https://www.globenewswire.com/news-release/2025/01/30/3017697/0/en/Mitolyn-Purple-Peel-Exploit-Real-Customer-Reviews-Formulation-And-Affordability.html): Customers praise Mitolyn for its effectiveness and quality. Many report improved energy and overall well-being. Try it today and experience the benefits!

[pygeoapi - A Python Geospatial Server](https://mapscaping.com/podcast/pygeoapi-a-python-geospaital-server/)

&lt;/div&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>GeoUsage: Log Analyzer for OGC Web Services</title><link href="https://kralidis.ca/blog/blog/2018/01/30/geousage-log-analyzer-for-ogc-web-services/" rel="alternate"/><published>2018-01-30T09:17:00+00:00</published><updated>2018-01-30T09:17:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2018-01-30:/blog/blog/2018/01/30/geousage-log-analyzer-for-ogc-web-services/</id><summary type="html">&lt;p&gt;Continuing on the UNIX philosophy, another little tool to help with your OWS workflows.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geopython/GeoUsage"&gt;GeoUsage&lt;/a&gt; attempts to support the use case of metrics and analysis of OWS service usage.  How many users are hitting your OWS?  Which layers/projections are the most popular?  How much bandwidth?  How many maps vs …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Continuing on the UNIX philosophy, another little tool to help with your OWS workflows.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geopython/GeoUsage"&gt;GeoUsage&lt;/a&gt; attempts to support the use case of metrics and analysis of OWS service usage.  How many users are hitting your OWS?  Which layers/projections are the most popular?  How much bandwidth?  How many maps vs. data downloads?&lt;/p&gt;
&lt;p&gt;A pure Python package, GeoUsage doesn’t have strong opinions beyond OWS-specific parsing and analysis of web server logs.  GeoUsage is composable, i.e. frequency, log management, and storage of results is totally up to the user.  Having said this, a simple and beautiful command line interface is available for eyeballing results.&lt;/p&gt;
&lt;p&gt;As always, GeoUsage is free and open source.&lt;/p&gt;
&lt;p&gt;It’s early days, so feedback, bug reports, suggestions are appreciated.  Contributors are most welcome!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>GeoHealthCheck support on Gitter</title><link href="https://kralidis.ca/blog/blog/2016/06/13/geohealthcheck-support-on-gitter/" rel="alternate"/><published>2016-06-13T17:47:00+00:00</published><updated>2016-06-13T17:47:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2016-06-13:/blog/blog/2016/06/13/geohealthcheck-support-on-gitter/</id><summary type="html">&lt;p&gt;It's been almost two years since GeoHealthCheck was initially developed (en route to FOSS4G in PDX).  Since then, GHC has been deployed in numerous environments in support of monitoring of (primarily) OGC services (canonical demo at http://geohealthcheck.osgeo.org). If you really want to support the progress and improvement …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's been almost two years since GeoHealthCheck was initially developed (en route to FOSS4G in PDX).  Since then, GHC has been deployed in numerous environments in support of monitoring of (primarily) OGC services (canonical demo at http://geohealthcheck.osgeo.org). If you really want to support the progress and improvement of your health and your physical condition, first of all you should visit &lt;a href="https://www.firstpost.com/health/phenq-reviews-what-is-the-truth-behind-this-fat-burners-fame-10753581.html/"&gt;firstpost.com/&lt;/a&gt; and find out about the best natural dietary formula that you and your body can try.Taking care of your sexual health is important for your overall physical and mental well-being.  Regular STI testing and using contraception can reduce the risk of contracting or spreading infections. Addressing sexual concerns with your healthcare provider can also improve your sexual health and satisfaction like using male enhancement pills.&lt;/p&gt;
&lt;p&gt;Project communications have been relatively low key, with GitHub issues being the main discussion.  The project has setup a Gitter channel as a means to discuss GeoHealthCheck in a public forum more easily.  It's open and anyone can join. Come join us on https://gitter.im/geopython/GeoHealthCheck! Many vegans and vegetarians use &lt;a href="https://www.trueprotein.com.au/products/plant-protein"&gt;plant-based protein powder&lt;/a&gt; to supplement their diet and ensure they meet their protein needs.&lt;/p&gt;
&lt;p&gt;Do not forget to always be aware of your body's health status checkups, but if you want to lose weight almost instantly you should visit &lt;a href="https://www.amny.com/sponsored/exipure-reviews/"&gt;https://www.amny.com/sponsored/exipure-reviews/&lt;/a&gt; and find out about the pill that will change not only your body but also your entire life.&lt;/p&gt;
&lt;p&gt;As your body is important Im sure your sexual life is also important so if you are having troubles with that because of you are overweight you should try &lt;a href="https://www.timesofisrael.com/spotlight/best-male-enhancement-pills/"&gt;&lt;span sheets-value="{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;over the counter male enhancement pills&amp;quot;}" sheets-userformat="{&amp;quot;2&amp;quot;:12867,&amp;quot;3&amp;quot;:{&amp;quot;1&amp;quot;:0},&amp;quot;4&amp;quot;:{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:16777215},&amp;quot;9&amp;quot;:0,&amp;quot;12&amp;quot;:0,&amp;quot;15&amp;quot;:&amp;quot;\&amp;quot;Helvetica Neue\&amp;quot;, Helvetica, Arial, sans-serif&amp;quot;,&amp;quot;16&amp;quot;:11}" sheets-hyperlink="https://app.ahrefs.com/keywords-explorer/google/us/overview?keyword=over%20the%20counter%20male%20enhancement%20pills"&gt;over the counter male enhancement pills&lt;/span&gt;&lt;/a&gt;&lt;span sheets-value="{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:&amp;quot;over the counter male enhancement pills&amp;quot;}" sheets-userformat="{&amp;quot;2&amp;quot;:12867,&amp;quot;3&amp;quot;:{&amp;quot;1&amp;quot;:0},&amp;quot;4&amp;quot;:{&amp;quot;1&amp;quot;:2,&amp;quot;2&amp;quot;:16777215},&amp;quot;9&amp;quot;:0,&amp;quot;12&amp;quot;:0,&amp;quot;15&amp;quot;:&amp;quot;\&amp;quot;Helvetica Neue\&amp;quot;, Helvetica, Arial, sans-serif&amp;quot;,&amp;quot;16&amp;quot;:11}" sheets-hyperlink="https://app.ahrefs.com/keywords-explorer/google/us/overview?keyword=over%20the%20counter%20male%20enhancement%20pills"&gt;  &lt;/span&gt;that may help with sexual problems, such as erectile dysfunction, premature ejaculation, or low sex drive.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>CSW Client Library for JavaScript: the Adventure Begins</title><link href="https://kralidis.ca/blog/blog/2014/04/28/csw-client-library-for-javascript-the-adventure-begins/" rel="alternate"/><published>2014-04-28T17:59:00+00:00</published><updated>2014-04-28T17:59:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2014-04-28:/blog/blog/2014/04/28/csw-client-library-for-javascript-the-adventure-begins/</id><summary type="html">&lt;p&gt;CSW has a good presence on the server side (&lt;a href="http://pycsw.org" title="pycsw"&gt;pycsw&lt;/a&gt;, GeoNetwork Opensource, deegree, ESRI Geoportal are some FOSS packages).  From the client side, &lt;a href="http://geopython.github.io/OWSLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; is the go to library for Python folks.  QGIS has &lt;a href="http://geopython.github.io/MetaSearch" title="MetaSearch"&gt;MetaSearch&lt;/a&gt; (which uses OWSLib).&lt;/p&gt;
&lt;p&gt;In a world where obesity rates are on the rise and the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;CSW has a good presence on the server side (&lt;a href="http://pycsw.org" title="pycsw"&gt;pycsw&lt;/a&gt;, GeoNetwork Opensource, deegree, ESRI Geoportal are some FOSS packages).  From the client side, &lt;a href="http://geopython.github.io/OWSLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; is the go to library for Python folks.  QGIS has &lt;a href="http://geopython.github.io/MetaSearch" title="MetaSearch"&gt;MetaSearch&lt;/a&gt; (which uses OWSLib).&lt;/p&gt;
&lt;p&gt;In a world where obesity rates are on the rise and the quest for effective weight loss solutions never-ending, Rybelsus has emerged as a potential game-changer. This medication, originally developed for type 2 diabetes management, has garnered attention for its ability to aid weight loss. In this article, we will provide a comprehensive overview of Rybelsus weight loss reviews, exploring its effectiveness, side effects, and what users have experienced in their before-and-after results.&lt;/p&gt;
&lt;p&gt;Understanding Rybelsus&lt;/p&gt;
&lt;p&gt;Redefining Weight Loss&lt;/p&gt;
&lt;p&gt;Rybelsus, also known by its generic name semaglutide, belongs to a class of drugs called GLP-1 receptor agonists. It was initially developed to help manage blood sugar levels in people with type 2 diabetes. However, it has since been found to have a significant impact on weight loss. This discovery has led to its increasing use as an off-label weight loss treatment.&lt;/p&gt;
&lt;p&gt;Rybelsus Weight Loss Reviews: The Verdict&lt;/p&gt;
&lt;p&gt;Efficacy and User Experiences&lt;/p&gt;
&lt;p&gt;Rybelsus has gained popularity primarily due to its impressive weight loss results. Many users report substantial reductions in body weight when incorporating this medication into their daily routine. However, it's important to note that individual results can vary.&lt;/p&gt;
&lt;p&gt;Before-and-After Results&lt;/p&gt;
&lt;p&gt;Transformation Stories&lt;/p&gt;
&lt;p&gt;One of the most compelling aspects of Rybelsus weight loss reviews is the before-and-after stories shared by users. These testimonials provide real-world insights into the medication's potential. Users often highlight their journey, detailing the challenges they faced before starting Rybelsus and the remarkable transformations they achieved afterward.&lt;/p&gt;
&lt;p&gt;Common Side Effects&lt;/p&gt;
&lt;p&gt;Balancing Benefits and Risks&lt;/p&gt;
&lt;p&gt;Like any medication, Rybelsus is not without side effects. It's crucial for users to be aware of potential adverse reactions, which may include nausea, diarrhea, and abdominal discomfort. These side effects are usually mild and temporary, but it's essential to discuss them with a healthcare provider.&lt;/p&gt;
&lt;p&gt;The Safer Alternative News&lt;/p&gt;
&lt;p&gt;Balancing Safety and Effectiveness&lt;/p&gt;
&lt;p&gt;While Rybelsus shows promise as a weight loss aid, it's essential to remember that it is an off-label use of the drug. As such, there may be safety concerns and uncertainties about its long-term effects. Always consult a healthcare professional before starting any medication for weight loss.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.outlookindia.com/outlook-spotlight/rybelsus-weight-loss-reviews-side-effects-before-and-after-results-and-safer-alternative-news-303759"&gt;Rybelsus weight loss&lt;/a&gt; reviews offer a glimpse into a potential solution for those looking to shed excess pounds. The medication has shown significant promise in helping individuals achieve their weight loss goals. However, it is essential to approach its use with caution, ensuring you have all the necessary information and guidance from a healthcare provider. While the before-and-after stories are inspiring, it's crucial to remember that individual results can vary, and the safest path to weight loss always involves a holistic approach that includes a balanced diet and regular physical activity.&lt;/p&gt;
&lt;p&gt;Beyond symptom relief, reviews may mention how &lt;a href="https://www.outlookindia.com/outlook-spotlight/prostadine-reviews-fake-or-legit-prostate-supplement-customer-complaints-news-253303"&gt;Prostadine&lt;/a&gt; has positively impacted users' overall quality of life. Improved sleep, reduced anxiety about prostate health, and the ability to engage in daily activities without interruptions are often highlighted.&lt;/p&gt;
&lt;p&gt;At the same time, it's been awhile since I've delved into deep JavaScript.  These days, we have things like &lt;a href="http://nodejs.org" title="Javascript on the server"&gt;JavaScript on the sever&lt;/a&gt;, more emphasis on testing, building/packaging, and so on.  You can do it all with JavaScript if you want.&lt;/p&gt;
&lt;p&gt;Wouldn't it be great to have a generic CSW JavaScript client?  There are &lt;a href="http://demo.pycsw.org/viewer" title="many"&gt;many&lt;/a&gt; out there, implemented / bundled within an application context or for a specific use case.  But what about a generic lib?  Kind of like OWSLib, but for JavaScript.&lt;/p&gt;
&lt;p&gt;Say hello to &lt;a href="https://github.com/tomkralidis/csw4js" title="csw4js"&gt;csw4js&lt;/a&gt;.  The main goal here is to build an agnostic CSW client for JavaScript that can work with/feed:&lt;/p&gt;
&lt;p&gt;- geospatial libs like OpenLayers, Leaflet&lt;/p&gt;
&lt;p&gt;- web frameworks like jQuery, AngularJS, and so on&lt;/p&gt;
&lt;p&gt;- browser applications, node.js, etc.&lt;/p&gt;
&lt;p&gt;Todo:&lt;/p&gt;
&lt;p&gt;- Unit tests (&lt;a href="http://qunitjs.com" title="QUnit"&gt;QUnit&lt;/a&gt;?)&lt;/p&gt;
&lt;p&gt;- Build routines (using &lt;a href="http://gruntjs.com" title="Grunt"&gt;Grunt&lt;/a&gt; initially)&lt;/p&gt;
&lt;p&gt;- JavaScript muscle for namespacing, structure, etc.&lt;/p&gt;
&lt;p&gt;csw4js is still early days (thanks to &lt;a href="https://github.com/bartvde" title="Bart"&gt;Bart&lt;/a&gt; and others for advice), so it's a good time to rewire things before getting deeper.  Interested in helping out?  Get in touch!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Mapping pycsw Deployments</title><link href="https://kralidis.ca/blog/blog/2013/06/08/mapping-pycsw-deployments/" rel="alternate"/><published>2013-06-08T17:55:00+00:00</published><updated>2013-06-08T17:55:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2013-06-08:/blog/blog/2013/06/08/mapping-pycsw-deployments/</id><summary type="html">&lt;p&gt;As the number of &lt;a href="http://pycsw.org" title="pycsw"&gt;pycsw&lt;/a&gt; deployments increase, we've started to keep a living document of &lt;a href="https://github.com/geopython/pycsw/wiki/Live-Deployments" title="live deployments"&gt;live deployments&lt;/a&gt; on the pycsw wiki. Being a geogeek, naturally I said to myself, "hmm, would be cool to plot these all on a map".  Embedding maps has become easier than ever, and projects like …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As the number of &lt;a href="http://pycsw.org" title="pycsw"&gt;pycsw&lt;/a&gt; deployments increase, we've started to keep a living document of &lt;a href="https://github.com/geopython/pycsw/wiki/Live-Deployments" title="live deployments"&gt;live deployments&lt;/a&gt; on the pycsw wiki. Being a geogeek, naturally I said to myself, "hmm, would be cool to plot these all on a map".  Embedding maps has become easier than ever, and projects like &lt;a href="http://mapserver.org" title="MapServer"&gt;MapServer&lt;/a&gt; and &lt;a href="http://geoserver.org" title="GeoServer"&gt;GeoServer&lt;/a&gt; have cool maps right on their homepages, which demo their maps against a theme like the next &lt;a href="http://2013.foss4g.org" title="FOSS4g"&gt;FOSS4G&lt;/a&gt; conference, etc.&lt;/p&gt;
&lt;p&gt;The quest for effective weight loss solutions has led many individuals to explore various supplements and products, including Mounjaro. Marketed as a weight loss aid, Mounjaro has gained attention due to its alleged fat-burning properties. However, it's essential to be aware of the potential risks associated with Mounjaro and consider safer alternatives to achieve your weight loss goals.&lt;/p&gt;
&lt;p&gt;Mounjaro: What is it?&lt;/p&gt;
&lt;p&gt;Mounjaro is a dietary supplement promoted for its ability to accelerate weight loss. It is often marketed as a natural and powerful fat burner. The supplement typically contains a combination of herbal extracts and ingredients designed to boost metabolism and suppress appetite.&lt;/p&gt;
&lt;p&gt;The Dangers of Mounjaro&lt;/p&gt;
&lt;p&gt;While Mounjaro may promise quick results, it is not without its risks. Here are some of the potential dangers associated with this weight loss supplement:&lt;/p&gt;
&lt;p&gt;Unknown Ingredients: The precise composition of Mounjaro supplements can vary between brands and manufacturers. This lack of transparency makes it challenging to assess the safety and effectiveness of the product.&lt;/p&gt;
&lt;p&gt;Adverse Side Effects: Users have reported various side effects, including increased heart rate, high blood pressure, digestive issues, anxiety, and insomnia. These side effects can be especially problematic for individuals with underlying health conditions.&lt;/p&gt;
&lt;p&gt;Lack of Scientific Evidence: Many claims made about Mounjaro's effectiveness lack rigorous scientific support. The absence of clinical trials and peer-reviewed studies raises questions about its legitimacy as a weight loss solution.&lt;/p&gt;
&lt;p&gt;Safety Concerns: The safety of long-term use of Mounjaro is uncertain. Prolonged or excessive use of supplements with unknown ingredients can pose serious health risks.&lt;/p&gt;
&lt;p&gt;Safe Mounjaro Alternatives&lt;/p&gt;
&lt;p&gt;If you're looking to shed pounds and improve your overall health, it's crucial to consider safer alternatives to &lt;a href="https://www.outlookindia.com/outlook-spotlight/mounjaro-weight-loss-dangerous-side-effects-and-safe-mounjaro-alternatives-news-302835/"&gt;Mounjaro weight loss&lt;/a&gt;. Here are some proven methods to achieve weight loss safely:&lt;/p&gt;
&lt;p&gt;Balanced Diet: Focus on a well-rounded, nutrient-dense diet that includes plenty of fruits, vegetables, lean proteins, and whole grains. Monitoring calorie intake and portion sizes can be effective for weight management.&lt;/p&gt;
&lt;p&gt;Regular Exercise: Incorporate regular physical activity into your routine. A combination of cardiovascular exercises and strength training can help you burn calories and build lean muscle. Playing pickleball is a great way to stay active and have fun while getting a good workout. To ensure the best experience, make sure to use the &lt;a href="https://pickleballmastery.com/"&gt;best indoor pickleball balls&lt;/a&gt; for optimal performance.&lt;/p&gt;
&lt;p&gt;Consult a Healthcare Professional: Before starting any weight loss program or using supplements, consult with a healthcare provider. They can offer personalized guidance and recommendations tailored to your specific needs and health status.&lt;/p&gt;
&lt;p&gt;Behavioral Changes: Consider addressing the psychological aspects of weight management through behavioral therapy or counseling. Emotional eating and unhealthy habits can often contribute to weight gain.&lt;/p&gt;
&lt;p&gt;Prescription Medications: In some cases, healthcare professionals may recommend prescription weight loss medications that are FDA-approved and have a proven track record of safety and effectiveness.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;Mounjaro may promise quick weight loss, but its potential dangers and lack of scientific evidence make it a risky choice. Instead of resorting to unverified supplements, focus on safe and proven methods for weight loss, such as a balanced diet, regular exercise, consulting healthcare professionals, and considering prescription medications when appropriate. Your health and well-being should always be the top priority when pursuing weight loss goals.&lt;/p&gt;
&lt;p&gt;pycsw is a bit different in that it doesn't do maps, but certainly catalogues them and makes them discoverable via OGC:CSW, OpenSearch and SRU.  And putting a sample GetRecords output on the website as a demo is boring.  So mapping live deployments seemed like a cool idea for a quick hack with reproducible workflow so it doesn't become a pain to keep things up to date.&lt;/p&gt;
&lt;p&gt;The pycsw website is managed using &lt;a href="http://docutils.sourceforge.net/rst.html" title="reStructuredText"&gt;reStructuredText&lt;/a&gt; and &lt;a href="http://sphinx-doc.org/" title="Sphinx"&gt;Sphinx&lt;/a&gt;; source code, issue tracker and wiki are hosted on &lt;a href="https://github.com/geopython/pycsw" title="GitHub"&gt;GitHub&lt;/a&gt;.  The first thing was to update each deployment on the wiki page with a lat/long pair (the lat/long pair being loosely based the location of the CSW itself, or the content of the CSW.  Aside: it would be cool if CSW Capabilities XML specified a BBOX like WMS does to give folks an idea of the location of records).&lt;/p&gt;
&lt;p&gt;After this, I wrote a Python &lt;a href="https://github.com/geopython/pycsw/blob/master/docs/build_map.py" title="script"&gt;script&lt;/a&gt; to fetch (and cache) the raw wiki page content.  Then, using &lt;a href="http://leafletjs.com/" title="Leaflet"&gt;Leaflet&lt;/a&gt;, setup a simple map and create markers foreach live deployment.&lt;/p&gt;
&lt;p&gt;So now I have a JavaScript snippet, now how do I add this to a page?  Using the Sphinx Makefile, I update the html target to &lt;a href="https://github.com/geopython/pycsw/blob/master/docs/Makefile#L57" title="run the Python script"&gt;run the Python script&lt;/a&gt; and save it to an area where I &lt;a href="https://raw.github.com/geopython/pycsw/master/docs/en/community.rst" title="embed"&gt;embed&lt;/a&gt; it using a rST &lt;a href="http://docutils.sourceforge.net/docs/ref/rst/directives.html#include" title="include"&gt;include&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That's pretty much it.  So now whenever the live deployment page is updated, a simple make clean &amp;amp;&amp;amp; make html will keep things up to date.  Reproducible workflow!&lt;/p&gt;
&lt;p&gt;I've published this to the pycsw &lt;a href="http://pycsw.org/community.html" title="community"&gt;community&lt;/a&gt; page.  Do you have a pycsw install?  Add it to &lt;a href="https://github.com/geopython/pycsw/wiki/Live-Deployments"&gt;https://github.com/geopython/pycsw/wiki/Live-Deployments&lt;/a&gt; and we'll put it on the map!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>pycsw performance improvements</title><link href="https://kralidis.ca/blog/blog/2011/10/09/pycsw-performance-improvements/" rel="alternate"/><published>2011-10-09T13:54:00+00:00</published><updated>2011-10-09T13:54:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2011-10-09:/blog/blog/2011/10/09/pycsw-performance-improvements/</id><summary type="html">&lt;p&gt;&lt;strong&gt;UPDATE 26 January 2012&lt;/strong&gt;: the benchmarks on the improvements below were done against my home dev server (2.8 GHz, 1GB RAM).  Benchmarking recently on a modern box yielded 3.6 seconds with maxrecords=10000 (!).&lt;/p&gt;
&lt;p&gt;Puravive has been making waves in the health and wellness industry with its unique approach …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;UPDATE 26 January 2012&lt;/strong&gt;: the benchmarks on the improvements below were done against my home dev server (2.8 GHz, 1GB RAM).  Benchmarking recently on a modern box yielded 3.6 seconds with maxrecords=10000 (!).&lt;/p&gt;
&lt;p&gt;Puravive has been making waves in the health and wellness industry with its unique approach to maintaining a healthy lifestyle. The Exotic Rice Method, as advertised by Puravive, has gained significant attention for its supposed benefits. However, as with any new health trend, skepticism and curiosity abound. In this article, we'll delve into Puravive reviews to determine whether the Exotic Rice Method is genuine or just another health fad. Gummies like &lt;a href="https://indacloud.co/product/orange-funta-dispensary-grade-delta-9-thc-gummies-200mg/"&gt;Indacloud Orange funta&lt;/a&gt; can be a delicious addition to your routine, supporting good health and wellness with their natural, calming effects. For those looking to enhance their wellness journey, making a thoughtful &lt;a href="https://d8superstore.com/product/big-chief-thca-thcp-disposable"&gt;purchase&lt;/a&gt; of trusted supplements can be a positive step forward. Brands like &lt;a href="https://cheefbotanicals.com/products/mint-7oh-tablets-80-mg"&gt;cheefbotanicals&lt;/a&gt; are known for their commitment to quality and natural ingredients, making them a reliable choice for wellness enthusiasts.&lt;/p&gt;
&lt;p&gt;The Exotic Rice Method: What Is It?&lt;/p&gt;
&lt;p&gt;The Exotic Rice Method is the flagship program offered by Puravive, a company that claims to harness the power of exotic rice varieties to improve health and well-being. According to Puravive, these rice varieties are sourced from far-flung regions and are exceptionally nutrient-dense. They are said to possess the potential to enhance metabolism, support weight loss, and boost overall health. Additionally, products like regulated &lt;a href="https://www.anabolicdirect.co/"&gt;Anavar 10&lt;/a&gt; can further support these health and fitness goals.&lt;/p&gt;
&lt;p&gt;Puravive offers this program in various formats, including dietary supplements, meal plans, and informational materials. The company suggests that by incorporating these unique rice varieties into your daily diet, you can experience numerous health benefits.&lt;/p&gt;
&lt;p&gt;Customer Reviews: The Real Story&lt;/p&gt;
&lt;p&gt;To get a better understanding of the Exotic Rice Method, we examined customer reviews from various sources. Here's what we found:&lt;/p&gt;
&lt;p&gt;Mixed Opinions&lt;br&gt;
Customer reviews are generally mixed. Some users report experiencing positive results, including improved energy levels, weight loss, and enhanced digestion after following the Exotic Rice Method. However, others express disappointment, claiming they didn't notice any significant changes.&lt;/p&gt;
&lt;p&gt;Weight Loss Claims&lt;br&gt;
A substantial portion of the customer reviews focuses on weight loss. Some individuals claim to have shed pounds successfully, attributing their success to &lt;a href="https://www.aktw.life/"&gt;tirzepatide&lt;/a&gt;. It's important to note, though, that individual results can vary widely, and factors such as overall diet, physical activity, and genetics also play a role in weight loss.&lt;/p&gt;
&lt;p&gt;Health Benefits&lt;br&gt;
Several users report improvements in their overall health, such as better digestion, more regular bowel movements, and increased energy levels. However, these claims are anecdotal and not supported by scientific studies.&lt;/p&gt;
&lt;p&gt;Skepticism&lt;br&gt;
While some users are enthusiastic about the Exotic Rice Method, others express skepticism about the product's effectiveness. Many people are cautious about the lack of scientific evidence and the high price of Puravive's offerings.&lt;/p&gt;
&lt;p&gt;Expert Opinions&lt;/p&gt;
&lt;p&gt;We also sought insights from nutrition and health experts to get a more balanced perspective on the Exotic Rice Method. Most experts caution against relying solely on exotic rice varieties for health benefits, emphasizing the importance of a balanced diet and a healthy lifestyle.&lt;/p&gt;
&lt;p&gt;Many nutritionists highlight the need for more research and scientific evidence to support the claims made by Puravive. The absence of such evidence raises concerns about the legitimacy of the Exotic Rice Method.&lt;/p&gt;
&lt;p&gt;The Verdict&lt;/p&gt;
&lt;p&gt;As of now, it is difficult to definitively label Puravive's Exotic Rice Method as either fake or legitimate. Customer reviews are mixed, and the lack of scientific evidence leaves room for skepticism.&lt;/p&gt;
&lt;p&gt;If you are considering trying the Exotic Rice Method or any of Puravive's products, it's essential to consult with a healthcare professional and conduct your own research. Keep in mind that no single product or dietary plan can guarantee success, and a balanced approach to nutrition and wellness is key.&lt;/p&gt;
&lt;p&gt;In conclusion, while the Exotic Rice Method may offer some potential benefits, its effectiveness and legitimacy are still open to debate. It's always wise to approach such health trends with caution and to consult experts for personalized advice on maintaining a healthy lifestyle.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write 5 articles on it&lt;br&gt;
ChatGPT&lt;br&gt;
Sure, I can provide you with the headlines and brief summaries for five articles on various topics. Please let me know which topics you'd like to explore further, and I can provide you with full articles.&lt;/p&gt;
&lt;p&gt;Title: "The Future of Sustainable Energy: Exploring Innovative Technologies"&lt;/p&gt;
&lt;p&gt;Summary: This article delves into cutting-edge technologies that are reshaping the landscape of sustainable energy. From advanced solar panels to energy storage solutions, we explore how these innovations are revolutionizing the way we generate and use clean energy.&lt;/p&gt;
&lt;p&gt;Title: "The Mental Health Revolution: How Technology Is Transforming Therapy"&lt;/p&gt;
&lt;p&gt;Summary: With the increasing prevalence of mental health issues, this article discusses how technology is making therapy more accessible and effective. It delves into online therapy platforms, AI-driven mental health apps, and the impact of virtual reality on mental health treatment.&lt;/p&gt;
&lt;p&gt;Title: "The Rise of Veganism: A Sustainable Diet for the Planet"&lt;/p&gt;
&lt;p&gt;Summary: Veganism is on the rise worldwide, and this article explores the reasons behind this trend. It looks at the environmental impact of vegan diets, the health benefits, and the ethical considerations that are driving people to embrace plant-based lifestyles.&lt;/p&gt;
&lt;p&gt;Title: "Exploring the Universe: The Next Frontier in Space Exploration"&lt;/p&gt;
&lt;p&gt;Summary: Space exploration has been capturing the world's imagination. In this article, we discuss upcoming missions to Mars, the study of exoplanets, the potential for asteroid mining, and the latest advancements in rocket technology.&lt;/p&gt;
&lt;p&gt;Title: "The Art of Mindfulness: A Path to Stress Reduction and Well-Being"&lt;/p&gt;
&lt;p&gt;Summary: Mindfulness has become a popular practice for managing stress and improving overall well-being. This article explores the benefits of mindfulness meditation, techniques for incorporating it into daily life, and its positive impact on mental health.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write we details&lt;br&gt;
ChatGPT&lt;/p&gt;
&lt;p&gt;3 / 3&lt;/p&gt;
&lt;p&gt;Certainly! Here are more detailed versions of the five article topics:&lt;/p&gt;
&lt;p&gt;1. The Future of Sustainable Energy: Exploring Innovative Technologies&lt;/p&gt;
&lt;p&gt;As the world grapples with climate change and the need to reduce our carbon footprint, sustainable energy solutions have become increasingly important. This article delves into the latest innovations that are reshaping the landscape of sustainable energy.&lt;/p&gt;
&lt;p&gt;From advanced solar panels that are more efficient and affordable to energy storage solutions like lithium-ion batteries, we explore how these cutting-edge technologies are revolutionizing the way we generate and use clean energy. Additionally, we discuss the potential of emerging technologies like fusion power and their implications for the future of global energy production.&lt;/p&gt;
&lt;p&gt;2. The Mental Health Revolution: How Technology Is Transforming Therapy&lt;/p&gt;
&lt;p&gt;Mental health issues affect millions of people around the world, and technology is playing a crucial role in making therapy more accessible and effective. This article investigates how the digital age is transforming the field of mental health treatment.&lt;/p&gt;
&lt;p&gt;We explore the rise of online therapy platforms, which connect individuals with licensed therapists via video chat or messaging. Additionally, we discuss the impact of AI-driven mental health apps that offer personalized support and coping strategies. Furthermore, we examine the potential of virtual reality therapy in treating various mental health conditions and its promise in providing immersive and effective treatment experiences.&lt;/p&gt;
&lt;p&gt;3. The Rise of Veganism: A Sustainable Diet for the Planet&lt;/p&gt;
&lt;p&gt;Veganism is experiencing a surge in popularity, driven by concerns over environmental sustainability, health, and ethical considerations. In this article, we take an in-depth look at the factors contributing to the rise of veganism and the potential benefits of adopting a plant-based diet.&lt;/p&gt;
&lt;p&gt;We discuss the environmental impact of vegan diets, including reduced greenhouse gas emissions and land use. Furthermore, we examine the health benefits associated with a well-balanced vegan diet, such as reduced risk of chronic diseases. Lastly, we explore the ethical considerations that are compelling more people to embrace plant-based lifestyles and the diverse range of vegan food options available.&lt;/p&gt;
&lt;p&gt;4. Exploring the Universe: The Next Frontier in Space Exploration&lt;/p&gt;
&lt;p&gt;Space exploration has entered an exciting new era with plans for missions to Mars, the study of exoplanets, and potential asteroid mining on the horizon. This article delves into the latest developments and innovations in space exploration.&lt;/p&gt;
&lt;p&gt;We discuss upcoming missions to Mars, including NASA's Artemis program and SpaceX's ambitious plans for the Red Planet. We explore the hunt for exoplanets, planets located outside our solar system, and how they could hold the key to understanding extraterrestrial life. We also look at the potential for asteroid mining and its role in securing vital resources for future space endeavors. Additionally, we touch on the latest advancements in rocket technology that are making space travel more accessible and efficient.&lt;/p&gt;
&lt;p&gt;5. The Art of Mindfulness: A Path to Stress Reduction and Well-Being&lt;/p&gt;
&lt;p&gt;In a fast-paced and often stressful world, mindfulness has gained recognition as a powerful practice for managing stress and improving overall well-being. This article takes a deep dive into the art of mindfulness.&lt;/p&gt;
&lt;p&gt;We explore the benefits of mindfulness meditation, including stress reduction, improved focus, and enhanced emotional regulation. Readers will gain insights into different mindfulness techniques, such as body scan, loving-kindness meditation, and mindful breathing, and learn how to incorporate them into their daily lives. Additionally, we discuss the scientific evidence supporting the positive impact of mindfulness on mental health and well-being, making a compelling case for its inclusion in one's self-care routine.&lt;/p&gt;
&lt;p&gt;User&lt;br&gt;
write 5 article on puravive-reviews-fake-or-legit-what-customers-have-to-say-about-exotic-rice-method--news&lt;br&gt;
ChatGPT&lt;/p&gt;
&lt;p&gt;2 / 2&lt;/p&gt;
&lt;p&gt;Certainly! Here are five articles exploring the topic of Puravive Reviews, focusing on whether the Exotic Rice Method is genuine or not, based on customer feedback and the latest news.&lt;/p&gt;
&lt;p&gt;1. "Puravive Reviews: Unveiling the Truth about the Exotic Rice Method"&lt;/p&gt;
&lt;p&gt;In this in-depth investigation, we delve into the Puravive Exotic Rice Method. We examine customer reviews and feedback to determine if this innovative approach to health and wellness is truly effective or merely a passing trend. From weight loss claims to health benefits, we separate the fact from fiction and offer a balanced perspective.&lt;/p&gt;
&lt;p&gt;2. "&lt;a href="https://www.state-journal.com/sponsored/puravive-reviews---fak-hyped-weight-loss-pills-or-real-customer-results/article_f456982c-746d-11ee-a0dc-5f43017b439d.html"&gt;Puravive&lt;/a&gt; Exotic Rice Method: What Are Customers Really Saying?"&lt;/p&gt;
&lt;p&gt;This article focuses on the voices of Puravive customers. We take a closer look at the firsthand experiences of individuals who have tried the Exotic Rice Method. By presenting both success stories and concerns, we offer a comprehensive overview of the diverse array of opinions surrounding this unique health program.&lt;/p&gt;
&lt;p&gt;3. "Science vs. Claims: Does Puravive's Exotic Rice Method Hold Up?"&lt;/p&gt;
&lt;p&gt;In this piece, we explore the scientific aspects of the Puravive Exotic Rice Method. We examine whether the claims made by Puravive regarding the benefits of exotic rice varieties are supported by scientific research. By consulting experts and studies, we aim to provide clarity on the credibility of the program.&lt;/p&gt;
&lt;p&gt;4. "Puravive Exotic Rice Method: Price vs. Performance"&lt;/p&gt;
&lt;p&gt;One of the key factors that consumers consider is the cost-effectiveness of health programs. This article scrutinizes the cost of Puravive's Exotic Rice Method and evaluates whether the results it claims to deliver are commensurate with the price. By analyzing the value proposition, we help readers make informed decisions.&lt;/p&gt;
&lt;p&gt;5. "Latest News: Puravive's Exotic Rice Method and the Health &amp;amp; Wellness Industry"&lt;/p&gt;
&lt;p&gt;In this article, we explore the recent developments and news surrounding Puravive and its Exotic Rice Method. We discuss any updates, controversies, or regulatory actions that might impact the company's reputation and the public's perception of its products. Stay informed about the latest developments in the health and wellness industry.&lt;/p&gt;
&lt;p&gt;These articles will help provide a well-rounded view of the Puravive Exotic Rice Method, enabling readers to make informed decisions and judgments based on customer reviews, scientific analysis, and the latest news.&lt;/p&gt;
&lt;p&gt;Is this conversation helpful so far?&lt;/p&gt;
&lt;p&gt;The allure of Rolex watches is undeniable. Renowned for their precision, luxury, and timeless style, Rolex has become a symbol of status and success. However, owning a genuine Rolex watch comes with a hefty price tag, making it unattainable for many watch enthusiasts. This is where Rolex replica watches come into play. In recent years, high-quality Rolex replicas have gained immense popularity for their exceptional craftsmanship and resemblance to the real deal. In this article, we'll explore the world of Rolex replica watches, where to find the best super clone 1:1 copies, and what you should consider before making a purchase.&lt;/p&gt;
&lt;p&gt;The Rise of Rolex Replica Watches&lt;/p&gt;
&lt;p&gt;The demand for Rolex replica watches has grown steadily over the years. These replicas have become more than just imitations; they are often referred to as "super clones" due to their astonishing accuracy in replicating the original Rolex design, movement, and functionality. The rise of super clone Rolex watches can be attributed to several factors:&lt;/p&gt;
&lt;p&gt;Affordability: Authentic Rolex watches come with a price tag that often exceeds the budget of the average consumer. &lt;a href="https://www.riverfronttimes.com/sponsored/rolex-replica-watches-best-place-to-buy-replica-rolex-super-clone-1-1-copy-41062305"&gt;Rolex replica&lt;/a&gt;s, on the other hand, offer a cost-effective alternative for those who desire the prestige of a Rolex without breaking the bank.&lt;/p&gt;
&lt;p&gt;Quality Improvements: Advances in manufacturing techniques and materials have enabled replica watchmakers to produce highly detailed and meticulously crafted super clones that are almost indistinguishable from the genuine Rolex timepieces.&lt;/p&gt;
&lt;p&gt;Accessibility: With the advent of e-commerce, it has become easier than ever to find Rolex replica watches online. Numerous websites and sellers cater to this growing market.&lt;/p&gt;
&lt;p&gt;Where to Find the Best Super Clone Rolex 1:1 Copies&lt;/p&gt;
&lt;p&gt;While there are numerous sources for Rolex replica watches, it's essential to exercise caution when making a purchase. Counterfeit products and low-quality imitations are abundant in the market, so it's crucial to do your research and buy from reputable sources. Here are some tips to help you find the best super clone Rolex 1:1 copies:&lt;/p&gt;
&lt;p&gt;Reputable Online Sellers: Several trusted online stores specialize in high-quality replica watches. Look for websites with a good reputation, customer reviews, and clear policies regarding the quality and authenticity of their products.&lt;/p&gt;
&lt;p&gt;Ask for Recommendations: Seek advice from fellow watch enthusiasts who have experience with replica Rolex watches. They may recommend trustworthy sellers or websites.&lt;/p&gt;
&lt;p&gt;Study the Details: Pay close attention to the product descriptions, specifications, and high-resolution images provided by the seller. The best super clone Rolex watches will closely resemble the authentic models, down to the finest details.&lt;/p&gt;
&lt;p&gt;Reviews and Feedback: Read reviews and feedback from previous customers to gauge the quality and reliability of the seller. Genuine customer testimonials can provide valuable insights.&lt;/p&gt;
&lt;p&gt;Warranty and Return Policy: Ensure that the seller offers a warranty or return policy, as this indicates their confidence in the product's quality.&lt;/p&gt;
&lt;p&gt;Considerations Before Purchasing a Rolex Replica&lt;/p&gt;
&lt;p&gt;Before purchasing a Rolex replica watch, it's essential to consider the following:&lt;/p&gt;
&lt;p&gt;Legal and Ethical Considerations: Rolex is a protected trademark, and selling counterfeit Rolex watches is illegal in many jurisdictions. Ensure that you understand the laws in your area and the potential consequences of owning a replica watch.&lt;/p&gt;
&lt;p&gt;Your Motivation: Be clear about your reasons for buying a replica. If you're looking for a quality timepiece that emulates Rolex style, a super clone 1:1 copy may be a suitable choice. However, if your intention is to deceive or pass it off as an authentic Rolex, this is both unethical and potentially illegal.&lt;/p&gt;
&lt;p&gt;Maintenance and Care: Just like genuine Rolex watches, replicas require maintenance to ensure their longevity and accuracy. Be prepared to invest in regular servicing.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;Rolex replica watches, especially super clone 1:1 copies, have become a popular choice for watch enthusiasts who appreciate the elegance and craftsmanship of Rolex timepieces but may not have the financial means to own an authentic Rolex. While replica watches offer an affordable alternative, it's crucial to exercise caution, do thorough research, and buy from reputable sources to ensure you receive a high-quality product that meets your expectations. Keep in mind the legal and ethical considerations surrounding replica watches and enjoy your Rolex-inspired timepiece responsibly.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt; does a pretty good job of implementing &lt;a href="http://www.opengeospatial.org/standards/cat" title="OGC CSW"&gt;OGC CSW&lt;/a&gt;.  All CITE tests pass, configuration is painless, and performance is great.  To date, testing has been done on repositories of \&amp;lt; 5000 records.&lt;/p&gt;
&lt;p&gt;Recently, I had a use case which required a metadata repository of 400K records.  After loading the records, I found that doing GetRecords searches against 400K records brought things to a halt (Houston, we have a problem).  So off I went on a performance improvement adventure.&lt;/p&gt;
&lt;p&gt;pycsw stores XML metadata as a full record in a given database; that is, the XML is not parsed when inserted.  Queries are then done using XPath queries using lxml and called as embedded SQL functions (for SQLite, these are realized using connection.create_function(); for PostgreSQL, we declare the same functions via plpythonu.  &lt;a href="http://sqlalchemy.org/" title="SQLAlchemy"&gt;SQLAlchemy&lt;/a&gt; is used as the DB abstraction layer.&lt;/p&gt;
&lt;p&gt;Using &lt;a href="http://docs.python.org/library/profile.html" title="cProfile"&gt;cProfile&lt;/a&gt;, I found that most of the process was being taken up by the database query.  I started thinking that the Python functions being called from the database got expensive as volume scaled (init'ing an XML parser to evaluate and match on each and every row).&lt;/p&gt;
&lt;p&gt;At this point, I figured the first step would be to rework the database with an agnostic metadata model, to which ISO, DC, FGDC, and DIF could fit into, where elements can slot into the core (generic) model.  Each profile then maps the queryables to (instead of an XPath) a database column in the codebase.&lt;/p&gt;
&lt;p&gt;At this point, I loaded 16000 Dublin Core documents as a first test.  Results:&lt;/p&gt;
&lt;p&gt;- GetCapabilities and GetDomain were instant, and I mean instant (these use the underlying database as well)&lt;br&gt;
- GetRecords: I tried with and without filters.  Performance is improved (5 seconds to return 15700 records matching a query [title = '%Lor%'], presenting 5 records)&lt;/p&gt;
&lt;p&gt;This is a big improvement, but still I thought this would have been faster.  I profiled the code again.  The cost of the SQL fetch was reduced.&lt;/p&gt;
&lt;p&gt;I then ran tests without using sqlalchemy in the codebase (i.e. SQL scripting as opposed to the SQLAlchemy way).  I used the Python sqlite3 module, and that's it.  Queries got faster.&lt;/p&gt;
&lt;p&gt;Still, this was only 16000 records.  As well, I started thinking/worrying about taking away sqlalchemy; it does give us great abstraction into different underlying databases, and helps us greatly with transactional (insert/update/delete).&lt;/p&gt;
&lt;p&gt;Then I started thinking more about bottlenecks and the fetch of data.  How can we have fast queries and keep sqlalchemy for ease of interacting with the underlying repo??&lt;/p&gt;
&lt;p&gt;Looking deeper, when pycsw processes a GetRecords request (say 'select * from records;'), we do exactly this.  So say the DB has 100K records, sqlalchemy gets ALL 100K records.  When I bring them back from server/repository.py to server/server.py, that's an sqlalchemy object with 100K members we're working with.  Then, in that code, I page through the results using maxrecords and startposition as requested by the client / set by the server processing.&lt;/p&gt;
&lt;p&gt;The other issue here is that OGC CSW's are to report on total number of records matched, provide the total number returned (per maxrecords or server default), and present the returned records per the elementsetname (full/brief/summary).  So applying a paging approach without getting the number of records matched was not an option.&lt;/p&gt;
&lt;p&gt;So I tried the following: client request is to get all records, startposition=1 and maxrecords=5.&lt;/p&gt;
&lt;p&gt;I additionally pass startposition and maxrecords to &lt;a href="https://sourceforge.net/apps/trac/pycsw/browser/trunk/server/repository.py#L99" title="server/repository.py:query()"&gt;server/repository.py:query()&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In repository.query(), I then do &lt;strong&gt;two&lt;/strong&gt; queries:&lt;/p&gt;
&lt;p&gt;- one query which ONLY gets the COUNT of records which satisfy the query (i.e. 'select count(*) from records;'), this gives us back the total number of records matched.  This is instant&lt;br&gt;
- a second query which gets everything (not COUNT), but applies LIMIT (per maxrecords) and OFFSET (per startposition), (say 10 records)&lt;br&gt;
- return both (the count integer, and the results object) to loop over in &lt;a href="https://sourceforge.net/apps/trac/pycsw/browser/trunk/server/server.py#L738" title="server/server.py:getrecords()"&gt;server/server.py:getrecords()&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So the slicing is now done in the SQL which is more powerful.  So on 100K records, this approach only pushes back the results per LIMIT and OFFSET (10 records).&lt;/p&gt;
&lt;p&gt;Results come back in less than 1 second.  Of course, as you increase maxrecords, this is more work for the server to return the records.  But still good performance; even when maxrecords=5000, the response is 3 seconds.&lt;/p&gt;
&lt;p&gt;So the moral of the story is that smart paging saves us here.&lt;/p&gt;
&lt;p&gt;I also tried this paging approach with the XML 'as-is' as a full record, with the embedded query_xpath query approach (per trunk), but the results were very slow again.  So the embedded xpath queries were hurting us there too.&lt;/p&gt;
&lt;p&gt;At this point, the way forward was clearer:&lt;/p&gt;
&lt;p&gt;- keep using sqlalchemy for flexibility; yes, if we remove sqlalchemy it will improve performance, but I think the flexibility it gives us, as well as we still get good performance, makes sense for us to keep it at this point&lt;br&gt;
- update data model to deconstruct the XML and put into columns&lt;br&gt;
- use paging techniques to query and present results&lt;/p&gt;
&lt;p&gt;Other options:&lt;/p&gt;
&lt;p&gt;- XML databases: looking for a non-Java solution, I found &lt;a href="http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html" title="Berkeley DB XML"&gt;Berkeley DB XML&lt;/a&gt; to be interesting.  I haven't done enough pycsw integration yet to assess the pros/cons.  Supporting SQLite and PostgreSQL makes pycsw play nice for integration&lt;br&gt;
- Search servers: like &lt;a href="http://sphinxsearch.com/" title="Sphinx"&gt;Sphinx&lt;/a&gt;, the work here would be indexing the metadata mode.  Again, the flexibility of using an RDBMS and SQLAlchemy was still attractive&lt;/p&gt;
&lt;p&gt;Perhaps the above approaches could be supported as additional db stores.  Currently, pycsw code has some ties to what the underlying data model looks like.  We could add layer of abstraction between the DB model and the records object model.&lt;/p&gt;
&lt;p&gt;I think I've exhausted the approaches here for now.  These changes are committed to svn trunk.  None of these changes will impact end user configuration, just a bit more code behind the scenes.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>CSW and repository thoughts</title><link href="https://kralidis.ca/blog/blog/2011/05/06/csw-and-repository-thoughts/" rel="alternate"/><published>2011-05-06T09:19:00+00:00</published><updated>2011-05-06T09:19:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2011-05-06:/blog/blog/2011/05/06/csw-and-repository-thoughts/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; allows for querying various metadata models (e.g. Dublin Core, ISO).  In &lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt;, our current model is to manage one repository per metadata model (or 'typename' in CSW speak).  That said, we setup each repository to have one column per 'queryable' (as defined in CSW and application profiles), which …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; allows for querying various metadata models (e.g. Dublin Core, ISO).  In &lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt;, our current model is to manage one repository per metadata model (or 'typename' in CSW speak).  That said, we setup each repository to have one column per 'queryable' (as defined in CSW and application profiles), which we parse when loading metadata.  We also store the full metadata record as is (for GetRecords ElementSetName='full' requests).&lt;/p&gt;
&lt;p&gt;Complexity increases as we start thinking about support for more information models, and transforming to/from requested information models (via CSW GetRecords/GetRecordById 'outputSchema' parameter).  Having said this, I've started to think about a core, agnostic information model which any metadata format could map to (for lowest common denominator).  This way, pycsw will always know the core information model queryables, which could be stored in columns as we currently do now.  The underlying queries would always query against the queryable columns.  Aside: it would be great to have a GDAL for metadata (MDAL anyone?).&lt;/p&gt;
&lt;p&gt;But what about a unified repository where just the metadata is stored in full (&lt;a href="http://geonetwork-opensource.org/" title="GeoNetwork"&gt;GeoNetwork&lt;/a&gt; does it like this)?  In this scenario, we would need heavy use of XPath queries on the full XML document in realtime.  The advantage would be a.) less parsing on metadata loading b.) one repository is always loaded/queried c.) less configuration for the catalog administrator.&lt;/p&gt;
&lt;p&gt;I like the use of XPath, but wonder about how this scales as additional databases are supported.  We currently support SQLite, which is great for simplicity (and Python SQLite bindings allow for mapping Python functions).  SQLite has no XPath support (but we could support this with Python bindings).  PostgreSQL does (if you build with &lt;a href="http://xmlsoft.org/" title="libxml2"&gt;libxml2&lt;/a&gt;), as does MySQL.  As well, I'm not sure about the performance implications (and how deep XPath queries are in the database fetching, i.e. the entire XML document would have to be serialized before XPath queries are executed).&lt;/p&gt;
&lt;p&gt;Thoughts on a Friday morning.  Anyone have any advice/insight?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>validating XML requests with Python and lxml</title><link href="https://kralidis.ca/blog/blog/2011/04/21/validating-xml-requests-with-python-and-lxml/" rel="alternate"/><published>2011-04-21T08:44:00+00:00</published><updated>2011-04-21T08:44:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2011-04-21:/blog/blog/2011/04/21/validating-xml-requests-with-python-and-lxml/</id><summary type="html">&lt;p&gt;While working on &lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt;, we found that there was a significant amount of code involved in processing the HTTP POST requests coming across as XML.  Since &lt;a href="http://lxml.de/" title="lxml"&gt;lxml&lt;/a&gt; is used as for XML support, why not use its native XML validation facilities?  We &lt;a href="https://sourceforge.net/apps/trac/pycsw/browser/trunk/server/server.py#L1170" title="implemented"&gt;implemented&lt;/a&gt; this rather quickly, but found validation was …&lt;/p&gt;</summary><content type="html">&lt;p&gt;While working on &lt;a href="http://pycsw.org/" title="pycsw"&gt;pycsw&lt;/a&gt;, we found that there was a significant amount of code involved in processing the HTTP POST requests coming across as XML.  Since &lt;a href="http://lxml.de/" title="lxml"&gt;lxml&lt;/a&gt; is used as for XML support, why not use its native XML validation facilities?  We &lt;a href="https://sourceforge.net/apps/trac/pycsw/browser/trunk/server/server.py#L1170" title="implemented"&gt;implemented&lt;/a&gt; this rather quickly, but found validation was taking up to 10 seconds.  Why?&lt;/p&gt;
&lt;p&gt;In the quest for improved health and longevity, the world of supplements has seen remarkable advancements. One of the most promising breakthroughs is Nicotinamide Mononucleotide (NMN), a compound believed to boost NAD+ levels in the body, contributing to overall well-being. In 2023, the demand for NMN supplements is on the rise, with Liposomal NMN supplements gaining particular attention. In this article, we'll explore the best NMN supplement options for 2023 and where to purchase Liposomal NMN supplements for optimal health and longevity.&lt;/p&gt;
&lt;p&gt;Understanding NMN: A Key to Longevity&lt;/p&gt;
&lt;p&gt;Unlocking the Fountain of Youth&lt;/p&gt;
&lt;p&gt;Nicotinamide Mononucleotide, or NMN, is a naturally occurring compound found in our cells. It plays a pivotal role in the production of Nicotinamide Adenine Dinucleotide (NAD+), a coenzyme essential for various biological processes, including energy production and DNA repair. As we age, NAD+ levels decline, leading to various age-related health issues. NMN supplements aim to reverse this decline, potentially promoting longevity and overall health.&lt;/p&gt;
&lt;p&gt;The Rise of Liposomal NMN Supplements&lt;/p&gt;
&lt;p&gt;Enhancing Bioavailability&lt;/p&gt;
&lt;p&gt;Liposomal NMN supplements have gained popularity for their improved bioavailability. Liposomes are small, spherical vesicles made up of a lipid bilayer, similar to cell membranes. When NMN is encapsulated in liposomes, it can better survive the digestive process, ensuring more NMN reaches the bloodstream, where it can have its intended effects. This enhanced bioavailability makes Liposomal &lt;a href="https://www.outlookindia.com/outlook-spotlight/best-nmn-supplement-2023-where-to-buy-liposomal-nmn-supplements-for-optimal-health-and-longevity-news-309352"&gt;nmn supplement&lt;/a&gt; a preferred choice for many.&lt;/p&gt;
&lt;p&gt;Where to Find the Best NMN Supplements in 2023&lt;/p&gt;
&lt;p&gt;1. Life Extension NMN&lt;/p&gt;
&lt;p&gt;Life Extension is a renowned brand in the world of longevity supplements. Their NMN supplement is highly rated for its purity and potency. They offer both traditional NMN capsules and Liposomal NMN options, providing choices to suit individual preferences.&lt;/p&gt;
&lt;p&gt;2. Elysium Basis&lt;/p&gt;
&lt;p&gt;Elysium Basis combines NMN with another longevity-promoting compound, Pterostilbene. Their Liposomal NMN supplement is known for its quality and commitment to scientific research. Elysium's rigorous testing ensures that you're getting a premium product.&lt;/p&gt;
&lt;p&gt;3. Tru Niagen&lt;/p&gt;
&lt;p&gt;Tru Niagen offers Niagen, a form of NMN that has undergone extensive clinical research. Their commitment to transparency and quality makes them a trusted choice for those seeking NMN supplements.&lt;/p&gt;
&lt;p&gt;Where to Buy Liposomal NMN Supplements for Optimal Health&lt;/p&gt;
&lt;p&gt;1. Amazon&lt;/p&gt;
&lt;p&gt;Amazon is a convenient and widely accessible platform to purchase Liposomal NMN supplements. You can find a variety of brands and read customer reviews to make an informed choice.&lt;/p&gt;
&lt;p&gt;2. Official Websites&lt;/p&gt;
&lt;p&gt;Many reputable NMN supplement brands have official websites where you can purchase their products directly. This ensures product authenticity and often offers subscription options for regular supplementation.&lt;/p&gt;
&lt;p&gt;3. Health and Supplement Stores&lt;/p&gt;
&lt;p&gt;Local health food stores and supplement retailers may carry Liposomal NMN supplements from trusted brands. It's a good idea to inquire about product quality and sourcing before making a purchase.&lt;/p&gt;
&lt;p&gt;Conclusion&lt;/p&gt;
&lt;p&gt;As we navigate the ever-evolving landscape of health and longevity supplements in 2023, NMN stands out as a promising compound. When it comes to choosing the best NMN supplement, Liposomal NMN offers enhanced bioavailability, potentially maximizing its benefits. Brands like Life Extension, Elysium Basis, and Tru Niagen have established themselves as leaders in this space.&lt;/p&gt;
&lt;p&gt;Whether you prefer to shop on Amazon, through official websites, or at local health stores, the key is to prioritize quality and transparency in your NMN supplement selection. With the right choice and a commitment to a healthy lifestyle, NMN may be your ally in the pursuit of optimal health and longevity in 2023 and beyond.&lt;/p&gt;
&lt;p&gt;In lxml, you have to specify an XML Schema to parse against, even if it is specified in xsi:schemaLocation.  Being a purist, I set this to fetch the &lt;a href="http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd" title="schema"&gt;schema&lt;/a&gt; on the fly from http://schemas.opengis.net.  The fetch was causing much of the bottleneck, so I decided to download all required OGC CSW schemas locally and have them as part of the implementation.  That should work right?  Validation was down to about 6 seconds.&lt;/p&gt;
&lt;p&gt;The issue here was that even though the schemas were local, many xs:import definitions within them were pointing back to absolute URLs at schemas.opengis.net.  After modifying the schemas to point to relative locations, validation was extremely fast (way under a second).&lt;/p&gt;
&lt;p&gt;Lesson learned: just because XML schemas are local, doesn't mean they don't point to remote URLs (though I'm not exactly sure why one would build a schema with non-local imports if they don't have to).&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>help wanted: baking a CSW server in Python</title><link href="https://kralidis.ca/blog/blog/2011/02/04/help-wanted-baking-a-csw-server-in-python/" rel="alternate"/><published>2011-02-04T09:50:00+00:00</published><updated>2011-02-04T09:50:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2011-02-04:/blog/blog/2011/02/04/help-wanted-baking-a-csw-server-in-python/</id><summary type="html">&lt;p&gt;Seemingly buried in geospatial metadata and discovery, I've been developing a my share of CSW/ISO/Dublin Core parsers, generators and clients.  &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; is able to interact with &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; servers, handling &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/csw.py#L480" title="csw:Record"&gt;csw:Record&lt;/a&gt;, &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/iso.py" title="ISO 19139:2007"&gt;ISO 19139:2007&lt;/a&gt;, as well as &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/dif.py" title="DIF"&gt;DIF&lt;/a&gt;.  OWSLib is also the underlying library used by the &lt;a href="http://nextgis.ru/" title="NextGIS"&gt;NextGIS …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Seemingly buried in geospatial metadata and discovery, I've been developing a my share of CSW/ISO/Dublin Core parsers, generators and clients.  &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; is able to interact with &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; servers, handling &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/csw.py#L480" title="csw:Record"&gt;csw:Record&lt;/a&gt;, &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/iso.py" title="ISO 19139:2007"&gt;ISO 19139:2007&lt;/a&gt;, as well as &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/dif.py" title="DIF"&gt;DIF&lt;/a&gt;.  OWSLib is also the underlying library used by the &lt;a href="http://nextgis.ru/" title="NextGIS"&gt;NextGIS&lt;/a&gt; folks in developing a QGIS CSW Client (big thanks to Maxim and Alex for contributing the code back to &lt;a href="http://sourceforge.net/apps/trac/qgiscommunitypl/wiki/qgcsw" title="qgcsw"&gt;qgcsw&lt;/a&gt;).  I've also used genshi to generate ISO 19139:2007 and &lt;a href="http://webstore.ansi.org/RecordDetail.aspx?sku=INCITS+453-2009" title="North American Profile"&gt;North American Profile&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a well-rounded perspective on &lt;a href="https://www.outlookindia.com/outlook-spotlight/power-bite-reviews-truth-exposed-is-powerbite-dental-mineral-complex-legit-and-really-works--news-310570"&gt;power bite reviews&lt;/a&gt; Dental Mineral Complex, I suggest exploring their official website, where you'll uncover a treasure trove of user narratives, clinical data, and an exploration of the science behind its purported benefits.&lt;/p&gt;
&lt;p&gt;Part of this adventure has involved testing these metadata within various OGC CSW server implementations.  What I quickly noticed is that many foss4g CSW servers are written in Java.  Wouldn't it be great to have a trimmer CSW server in Python?  Which can be used easily with an existing Apache install type of thing?&lt;/p&gt;
&lt;p&gt;Enter &lt;a href="https://sourceforge.net/apps/trac/pycsw" title="pycsw"&gt;pycsw&lt;/a&gt;.  I started with the following goals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lightweight and easy to stand up: a standalone catalogue, no GUI or metadata editing front end, designed for the use case of exposing ready-to-go metadata (files or in existing DB) through a CSW interface, with as little heavy lifting as possible.  Plug and play&lt;/li&gt;
&lt;li&gt;extensible: the ability to add metadata formats and mapping them to a common information model and core / additional queryables&lt;/li&gt;
&lt;li&gt;OGC compliant: against the &lt;a href="http://cite.opengeospatial.org/" title="CITE"&gt;CITE&lt;/a&gt; test assertions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Technology bits (thanks to Sean for the &lt;a href="http://sgillies.net/blog/488/diving-into-python/" title="initial inspiration"&gt;initial inspiration&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python: code is written as CGI for now.  Welcome to ideas for WSGI, etc.&lt;/li&gt;
&lt;li&gt;Database:  &lt;a href="http://www.sqlite.org/" title="SQLite3"&gt;SQLite3&lt;/a&gt; is used as the underlying database.  No reason why things couldn't be abstracted enough to handle other DB's&lt;/li&gt;
&lt;li&gt;DB API: &lt;a href="http://www.sqlalchemy.org/" title="SQLAlchemy"&gt;SQLAlchemy&lt;/a&gt; makes it easy to bind database models to Python classes, and especially easy to do transparent queries&lt;/li&gt;
&lt;li&gt;XML: &lt;a href="http://codespeak.net/lxml/" title="lxml"&gt;lxml&lt;/a&gt; is used to parse requests, traverse XPath nodes and marshall responses.  lxml's Schematron support will make it easy for Harvest/Transaction operations / validation&lt;/li&gt;
&lt;li&gt;Spatial predicates: I originally supported ogc:BBOX, which is easy enough to code by hand.  &lt;a href="http://trac.gispython.org/lab/wiki/Shapely" title="Shapely"&gt;Shapely&lt;/a&gt; gives access to the full suite of predicates, and will be the way forward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Progress: I'm using the OGC CITE tests here as the benchmark.  So far it passes 91/103 assertions.&lt;/p&gt;
&lt;p&gt;Todo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fully pass the CITE assertions&lt;/li&gt;
&lt;li&gt;support of ISO Application Profile&lt;/li&gt;
&lt;li&gt;firm up core information model to allow easier extensibility&lt;/li&gt;
&lt;li&gt;fix spatial queries to fully use Shapely&lt;/li&gt;
&lt;li&gt;harmonize GetRecords and GetRecordById response handler (for writing out csw:Record)&lt;/li&gt;
&lt;li&gt;documentation: install / setup / configuration / testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://sourceforge.net/apps/trac/pycsw" title="pycsw"&gt;pycsw&lt;/a&gt; is up on Sourceforge and is open source.  It would be great to have more hands here.  If you are interested, and enjoy contributing to foss4g, don't hesitate and get in touch!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>OWSLib CSW action</title><link href="https://kralidis.ca/blog/blog/2010/10/14/owslib-csw-action/" rel="alternate"/><published>2010-10-14T12:01:00+00:00</published><updated>2010-10-14T12:01:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-10-14:/blog/blog/2010/10/14/owslib-csw-action/</id><content type="html">&lt;p&gt;(sorry, I've been &lt;a href="/blog/wedding/" title="busy"&gt;busy&lt;/a&gt; in the last few months, hence no blogposts)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: almost at the same time I originally posted this, Sean set me up on the &lt;a href="http://gispython.org/" title="http://gispython.org/"&gt;http://gispython.org&lt;/a&gt; blog, so I've moved this post &lt;a href="http://gispython.org/2010/10/owslib-csw-action/" title="there"&gt;there&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Geoprocessing with OGR and PyWPS</title><link href="https://kralidis.ca/blog/blog/2010/06/25/geoprocessing-with-ogr-and-pywps/" rel="alternate"/><published>2010-06-25T14:14:00+00:00</published><updated>2010-06-25T14:14:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-06-25:/blog/blog/2010/06/25/geoprocessing-with-ogr-and-pywps/</id><summary type="html">&lt;p&gt;&lt;a href="http://pywps.wald.intevation.org/" title="PyWPS"&gt;PyWPS&lt;/a&gt; is a neat Python package supporting the OGC &lt;a href="http://www.opengeospatial.org/standards/wps" title="Web Processing Service"&gt;Web Processing Service&lt;/a&gt; standard.  Basic setup and configuration can be found in the documentation, or Tim's useful &lt;a href="http://linfiniti.com/2009/09/a-quick-quide-to-getting-up-and-running-with-pywps/" title="post"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've been working on a demo to expose the OGR Python bindings for geoprocessing (buffer, centroid, etc.).&lt;/p&gt;
&lt;p&gt;Here's an example process to buffer …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://pywps.wald.intevation.org/" title="PyWPS"&gt;PyWPS&lt;/a&gt; is a neat Python package supporting the OGC &lt;a href="http://www.opengeospatial.org/standards/wps" title="Web Processing Service"&gt;Web Processing Service&lt;/a&gt; standard.  Basic setup and configuration can be found in the documentation, or Tim's useful &lt;a href="http://linfiniti.com/2009/09/a-quick-quide-to-getting-up-and-running-with-pywps/" title="post"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've been working on a demo to expose the OGR Python bindings for geoprocessing (buffer, centroid, etc.).&lt;/p&gt;
&lt;p&gt;Here's an example process to buffer a geometry (input as WKT), and output either GML, JSON, or WKT:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pywps.Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WPSProcess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osgeo.ogr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ogr&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WPSProcess&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
 &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;WPSProcess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;buffer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buffer generator&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://www.kralidis.ca/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;OGR / GEOS geoprocessing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;abstract&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buffer generator&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;storeSupported&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;statusSupported&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wkt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLiteralInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wkt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Well Known Text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLiteralInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Output format&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLiteralInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;buffer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buffer Value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addLiteralOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;output&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
  &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Buffered Feature&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;string&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

 &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ogr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateGeometryFromWkt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;   
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wkt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_genOutputFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getValue&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
  &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Destroy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

 &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_setNamespace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; xmlns:&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_genOutputFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;gml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_setNamespace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExportToGML&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;gml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   
    &lt;span class="s1"&gt;&amp;#39;http://www.opengis.net/gml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExportToJson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wkt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;geom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExportToWkt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;_setNamespace is a workaround, as OGR's ExportToGML doesn't declare a namespace prefix / uri in the output, which would make the ExecuteResponse XML choke parsers&lt;/li&gt;
&lt;li&gt;_genOutputFormat is a utility method, which can be applied to any OGR geometry object&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see, very easy to pull off, integrates and extends easy.  Kudos to the OGR and PyWPS teams!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Displaying GRIB data with MapServer</title><link href="https://kralidis.ca/blog/blog/2010/06/04/displaying-grib-data-with-mapserver/" rel="alternate"/><published>2010-06-04T19:02:00+00:00</published><updated>2010-06-04T19:02:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-06-04:/blog/blog/2010/06/04/displaying-grib-data-with-mapserver/</id><summary type="html">&lt;p&gt;I recently had the opportunity to prototype WMS visualization of &lt;a href="http://dd.weatheroffice.ec.gc.ca/model_gem_regional/high_resolution/grib1/00/" title="meteorological data"&gt;meteorological data&lt;/a&gt;.  MapServer, GDAL and Python to the rescue!  Here are the steps I took to make it happen.&lt;/p&gt;
&lt;p&gt;Welcome to the captivating realm of luxury timepieces, where sophistication meets craftsmanship and exclusivity reigns supreme. In this guide, we will …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I recently had the opportunity to prototype WMS visualization of &lt;a href="http://dd.weatheroffice.ec.gc.ca/model_gem_regional/high_resolution/grib1/00/" title="meteorological data"&gt;meteorological data&lt;/a&gt;.  MapServer, GDAL and Python to the rescue!  Here are the steps I took to make it happen.&lt;/p&gt;
&lt;p&gt;Welcome to the captivating realm of luxury timepieces, where sophistication meets craftsmanship and exclusivity reigns supreme. In this guide, we will take you on an exhilarating journey through the mesmerizing world of &lt;a href="https://www.outlookindia.com/outlook-spotlight/richard-mille-replica-watches-where-to-buy-best-selling-fake-richard-mille-super-clones-news-313685"&gt;Richard Mille replica&lt;/a&gt; watches – a parallel universe where impeccable designs and intricate details intertwine with affordability. Brace yourself as we unveil the hidden gems that mimic these iconic timepieces flawlessly, alongside revealing the best-kept secrets on where to find these sought-after fakes. Whether you're an aficionado looking to expand your collection or simply curious about the artistry behind high-end replicas, prepare to be captivated by a dazzling array of horological wonders that redefine what it truly means to own a prestigious Richard Mille watch.&lt;/p&gt;
&lt;p&gt;The data, (&lt;a href="http://en.wikipedia.org/wiki/GRIB" title="GRIB"&gt;GRIB&lt;/a&gt;), is a GDAL supported &lt;a href="http://www.gdal.org/frmt_grib.html" title="format"&gt;format&lt;/a&gt;, so MapServer can handle processing as a result.  The goal here was to create a &lt;a href="http://mapserver.org/mapfile/layer.html" title="LAYER"&gt;LAYER&lt;/a&gt; object.  First thing was to figure out the projection, then figure out the band pixel values/ranges and correlate to MapServer classes (in this case I just used a simple greyscale approach).&lt;/p&gt;
&lt;p&gt;Here's the hack:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osgeo.gdal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;gdal&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osgeo.osr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;osr&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Usage: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; &amp;lt;file&amp;gt; &amp;lt;numclasses&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
 &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cvr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;  &lt;span class="c1"&gt;# range of RGB values&lt;/span&gt;
&lt;span class="n"&gt;numclasses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# number of classifiers&lt;/span&gt;

&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gdal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# get proj4 def and write out PROJECTION object&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;osr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SpatialReference&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImportFromWkt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetProjection&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ExportToProj4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;  PROJECTION&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;   &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;  END&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# get band pixel data ranges and classify&lt;/span&gt;
&lt;span class="n"&gt;band&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRasterBand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetMinimum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetMaximum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# compute automagically&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;band&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ComputeRasterMinMax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# calculate range of pixel values&lt;/span&gt;
&lt;span class="n"&gt;pixel_value_range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# calculate the intervals of values based on classes specified&lt;/span&gt;
&lt;span class="n"&gt;pixel_interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pixel_value_range&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;numclasses&lt;/span&gt;
&lt;span class="c1"&gt;# calculate the intervals of color values&lt;/span&gt;
&lt;span class="n"&gt;color_interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pixel_interval&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;pixel_value_range&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numclasses&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
 &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;  CLASS&lt;/span&gt;
&lt;span class="s1"&gt;  NAME &amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt; to &lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s1"&gt;  EXPRESSION ([pixel] &amp;gt;= &lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt; AND [pixel] &amp;lt; &lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt;)&lt;/span&gt;
&lt;span class="s1"&gt;  STYLE&lt;/span&gt;
&lt;span class="s1"&gt;   COLOR &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;
&lt;span class="s1"&gt;  END&lt;/span&gt;
&lt;span class="s1"&gt; END&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;pixel_interval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;pixel_interval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cvr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="nb"&gt;min&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;pixel_interval&lt;/span&gt;
 &lt;span class="n"&gt;cvr&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color_interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Running this script outputs various bits for MapServer mapfile configuration.  Passing more classes to the script creates more &lt;a href="http://www.mapserver.org/mapfile/class.html" title="CLASS"&gt;CLASS&lt;/a&gt; objects, resulting in a smoother looking image.&lt;/p&gt;
&lt;p&gt;Here's an example GetMap request:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kralidis.ca/blog/blog/wp-content/uploads/2010/06/gem_model.png"&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2010/06/gem_model.png" title="Meteorological data in GRIB format via MapServer WMS" class="size-full wp-image-487 alignleft" style="border: 1px solid black;" width="502" height="299" alt="Meteorological data in GRIB format via MapServer WMS" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Users can query to obtain pixel values (water temperature in this case) via GetFeatureInfo.  Given that these are produced frequently, we can use the WMS GetMap TIME parameter to create time series maps of the models.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>OWSLib CSW Updates and Implementation Thoughts</title><link href="https://kralidis.ca/blog/blog/2010/05/07/owslib-csw-updates-and-implementation-thoughts/" rel="alternate"/><published>2010-05-07T21:34:00+00:00</published><updated>2010-05-07T21:34:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-05-07:/blog/blog/2010/05/07/owslib-csw-updates-and-implementation-thoughts/</id><summary type="html">&lt;p&gt;I've had some time to work on CSW support in &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; in the last few days.  Some thoughts and updates:&lt;/p&gt;
&lt;h3&gt;FGDC Support Added&lt;/h3&gt;
&lt;p&gt;Some CSW endpoints out there serve up GetRecords responses in &lt;a href="http://www.fgdc.gov/metadata/csdgm/index_html" title="FGDC CSDGM"&gt;FGDC CSDGM&lt;/a&gt; format.  This has now been &lt;a href="http://trac.gispython.org/lab/ticket/223" title="added"&gt;added&lt;/a&gt; to &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/fgdc.py" title="trunk"&gt;trunk&lt;/a&gt; (mandatory elements + eainfo).  Note that csw:Record …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've had some time to work on CSW support in &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt; in the last few days.  Some thoughts and updates:&lt;/p&gt;
&lt;h3&gt;FGDC Support Added&lt;/h3&gt;
&lt;p&gt;Some CSW endpoints out there serve up GetRecords responses in &lt;a href="http://www.fgdc.gov/metadata/csdgm/index_html" title="FGDC CSDGM"&gt;FGDC CSDGM&lt;/a&gt; format.  This has now been &lt;a href="http://trac.gispython.org/lab/ticket/223" title="added"&gt;added&lt;/a&gt; to &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/fgdc.py" title="trunk"&gt;trunk&lt;/a&gt; (mandatory elements + eainfo).  Note that csw:Record (DMCI + ows:BoundingBox) and ISO 19139 are already supported.  One tricky bit here is that FGDC was/is mostly implemented without a namespace, which CSW requires as an outputSchema parameter value.  I've used http://www.fgdc.gov for now.&lt;/p&gt;
&lt;p&gt;Both FGDC and ISO (moreso ISO) have deep and complex content models, so if there are elements that you don't see supported in OWSLib, please file an feature request ticket in trac, and I'll make sure to implement (and add to the doctests).&lt;/p&gt;
&lt;h3&gt;Metadata Identifiers are Important!&lt;/h3&gt;
&lt;p&gt;When parsing GetRecords requests, we store records in a Python dict, using /gmd:MD_Metadata/gmd:fileIdentifier (for ISO), /csw:Record/dc:identifier (for CSW's baseline) or /metadata/idinfo/datasetid (for FGDC).  Some responses return metadata without these ids for whatever reason.  This sets the dict key to Python's None type, which ends up overwriting the dict key's entry.  Not good.  I &lt;a href="http://trac.gispython.org/lab/ticket/219" title="implemented"&gt;implemented&lt;/a&gt; a &lt;a href="http://trac.gispython.org/lab/changeset/1629" title="fix"&gt;fix&lt;/a&gt; to set a random, non-persistent identifier so as not to lose data.&lt;/p&gt;
&lt;p&gt;Of course, the best solution here would be for providers to set identifiers accordingly from the start.  Then again, what happens when CSW endpoints harvest other CSWs and identifiers are the same?  Perhaps a namespace of some sort for the CSW would help.  This would be an interesting interoperability experiment.&lt;/p&gt;
&lt;h3&gt;Harvest Support Added&lt;/h3&gt;
&lt;p&gt;I &lt;a href="http://trac.gispython.org/lab/ticket/221" title="implemented"&gt;implemented&lt;/a&gt; a &lt;a href="http://trac.gispython.org/lab/changeset/1630" title="first pass"&gt;first pass&lt;/a&gt; of supporting Harvest operations.  CSW endpoints usually require authentication here, which may vary by the implementation.  Therefore, I've left this logic out of OWSLib as it's not part of the standard per se.&lt;/p&gt;
&lt;h3&gt;Transaction Support Coming&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://opengeo.org/about/team/sebastian.benthall/" title="Sebastian Benthall"&gt;Sebastian Benthall&lt;/a&gt; of &lt;a href="http://www.opengeo.org/" title="OpenGeo"&gt;OpenGeo&lt;/a&gt; has indicated that they are using OWSLib's CSW support for some of their projects (awesome!), and has kindly submitted a &lt;a href="http://trac.gispython.org/lab/ticket/218" title="patch"&gt;patch&lt;/a&gt; for an optional element issue (thanks Sebastian!).  He also indicated that Transaction support would be of interest, so I've &lt;a href="http://trac.gispython.org/lab/ticket/222" title="started"&gt;started&lt;/a&gt; to think about this one.  As with the Harvest operation, Transaction support also requires some sort of authentication, which we'll leave to the client implementation.  Most of the work will be with marshalling the request, as response handling is very similar to Harvest responses.&lt;/p&gt;
&lt;p&gt;Give it a go, submit bugs and enhancements to the &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib trac"&gt;OWSLib trac&lt;/a&gt;.  Enjoy!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>GeoScript</title><link href="https://kralidis.ca/blog/blog/2010/02/19/geoscript/" rel="alternate"/><published>2010-02-19T15:01:00+00:00</published><updated>2010-02-19T15:01:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2010-02-19:/blog/blog/2010/02/19/geoscript/</id><content type="html">&lt;p&gt;&lt;a href="http://geoscript.org/" title="GeoScript"&gt;GeoScript&lt;/a&gt; looks like a neat effort to leverage GeoTools into Python (an increasingly widely used language for GIS scripting) and JavaScript.&lt;/p&gt;
&lt;p&gt;I love this for JavaScript, and I wonder how this relates to the other Python work out there (like &lt;a href="http://trac.gispython.org/lab/wiki/Shapely" title="Shapely"&gt;Shapely&lt;/a&gt; and &lt;a href="http://trac.gispython.org/lab/wiki/WorldMill" title="WorldMill"&gt;WorldMill&lt;/a&gt;); &lt;a href="http://sgillies.net/blog/" title="Sean"&gt;Sean&lt;/a&gt;?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Python, KML and Parishes</title><link href="https://kralidis.ca/blog/blog/2009/09/16/python-kml-and-parishes/" rel="alternate"/><published>2009-09-16T08:51:00+00:00</published><updated>2009-09-16T08:51:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-09-16:/blog/blog/2009/09/16/python-kml-and-parishes/</id><summary type="html">&lt;p&gt;When looking for phone numbers for various &lt;a href="http://www.gocanada.org/parishdirectory/index.htm" title="churches"&gt;churches&lt;/a&gt;, I thought wouldn't it be neat to put the locations on a map?&lt;/p&gt;
&lt;p&gt;Python to the rescue.  After some scraping to generate a CSV listing, I geocoded the addresses, then I used the OGR to convert into a KML document, using the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;When looking for phone numbers for various &lt;a href="http://www.gocanada.org/parishdirectory/index.htm" title="churches"&gt;churches&lt;/a&gt;, I thought wouldn't it be neat to put the locations on a map?&lt;/p&gt;
&lt;p&gt;Python to the rescue.  After some scraping to generate a CSV listing, I geocoded the addresses, then I used the OGR to convert into a KML document, using the same approach I previously &lt;a href="/blog/2007/12/28/two-milk-no-sugar/" title="blogged"&gt;blogged&lt;/a&gt; about.  Nice!&lt;/p&gt;
&lt;p&gt;Looking deeper, I wanted to have more exhaustive content within the \&amp;lt;description&amp;gt; element.  Turns out ogr2ogr has a -dsco DescriptionField=fieldname option, but I wanted more than that.  So I decided to hack the original CSV:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib2&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;greek_churches_canada.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kml&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nsmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://www.opengis.net/kml/2.2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://maps.google.com/maps/geo?output=csv&amp;amp;q=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote_plus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#print url&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accuracy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#print status, accuracy, lat, lon&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;200&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Placemark&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;p&amp;gt;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;a href=&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;gt;Website&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;a href=&amp;quot;mailto:&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;quot;&amp;gt;Email&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CDATA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Point&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;coordinates&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subsubnode3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubnode2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubnode3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xml_declaration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;UTF-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pretty_print&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I wonder whether an OGR -dsco DescriptionTemplate=foo.txt, where foo.txt would look like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;table&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;City&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;[&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;]&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Province&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;[&lt;/span&gt;&lt;span class="n"&gt;province&lt;/span&gt;&lt;span class="o"&gt;]&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;table&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Or anything the user specified, for that matter.  Then OGR would then use for each feature's \&amp;lt;description&amp;gt; element.&lt;/p&gt;
&lt;p&gt;Anyways, here's the resulting &lt;a href="http://maps.google.com/?q=http://www.kralidis.ca/gocanada/parishdirectory2.kml" title="map"&gt;map&lt;/a&gt;.  Cool!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Friday Metadata Thoughts</title><link href="https://kralidis.ca/blog/blog/2009/06/12/friday-metadata-thoughts/" rel="alternate"/><published>2009-06-12T14:00:00+00:00</published><updated>2009-06-12T14:00:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-06-12:/blog/blog/2009/06/12/friday-metadata-thoughts/</id><summary type="html">&lt;p&gt;Not the most exciting topic, but I've found myself knee deep in metadata standards as they pertain to CSW in the last &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/csw.py" title="couple"&gt;couple&lt;/a&gt; of &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/iso.py" title="weeks"&gt;weeks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've made some &lt;a href="/blog/2009/02/05/ows-metadata-matters/" title="recommendations"&gt;recommendations&lt;/a&gt; in the past for OWS metadata, which have helped in established publishing requirements for cataloguing.&lt;/p&gt;
&lt;p&gt;Starting to look at ISO metadata …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Not the most exciting topic, but I've found myself knee deep in metadata standards as they pertain to CSW in the last &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/csw.py" title="couple"&gt;couple&lt;/a&gt; of &lt;a href="http://trac.gispython.org/lab/browser/OWSLib/trunk/owslib/iso.py" title="weeks"&gt;weeks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I've made some &lt;a href="/blog/2009/02/05/ows-metadata-matters/" title="recommendations"&gt;recommendations&lt;/a&gt; in the past for OWS metadata, which have helped in established publishing requirements for cataloguing.&lt;/p&gt;
&lt;p&gt;Starting to look at ISO metadata (&lt;a href="http://www.iso.org/iso/catalogue_detail.htm?csnumber=26020" title="data"&gt;data&lt;/a&gt;, &lt;a href="http://www.iso.org/iso/catalogue_detail.htm?csnumber=39890" title="service"&gt;service&lt;/a&gt;) makes you quickly realize the pros and cons which come with making a standard flexible and exhaustive.  Let's take 19139; almost everything in the schema is optional.  I think this is where profiles (such as ISO North American Profile) start to become especially important.&lt;/p&gt;
&lt;p&gt;19119 is in the same boat.  Aside: then you start to wonder about the overlap between 19119 and OWS Capabilities metadata.  Wouldn't it be nice if GetCapabiilties returned a 19119 document instead?  Which could plop nicely in a CSW query response as well. Oh wait, it already does.  But then try to validate the document instance.  You'll find that OGC CSW and ISO &lt;a href="http://schemas.opengis.net/iso/19139/20060504/srv/srv.xsd" title="use"&gt;use&lt;/a&gt; &lt;a href="http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd" title="different"&gt;different&lt;/a&gt; &lt;a href="http://schemas.opengis.net/iso/19139/20070417/gmd/gmd.xsd" title="versions"&gt;versions&lt;/a&gt; of GML (follow the refs in the .xsd's you'll see them soon enough), yet apply them to the same namespace.  So validation fails.  Harmonization required!&lt;/p&gt;
&lt;p&gt;Having said this, this is very complicated metadata which can be addressed by intelligent tools.  Tools that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;integrate with GIS systems which can automagically populate by:&lt;/li&gt;
&lt;li&gt;fetching spatial extents&lt;/li&gt;
&lt;li&gt;fetching reference system definitions&lt;/li&gt;
&lt;li&gt;establish hierarchy (this would be tough as it would be tied to the data management of the system)&lt;/li&gt;
&lt;li&gt;fetch contact information from a given user profile (how about getting this from the network's email / global address book against the logged in user?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then again, what about &lt;a href="http://newgeography.net/wp/?p=3" title="keeping it simple"&gt;keeping it simple&lt;/a&gt; and &lt;a href="http://newgeography.net/wp/?p=1" title="mainstream"&gt;mainstream&lt;/a&gt; friendly?  The toughest part is metadata creation, so let's make it as easy as possible to do so!&lt;/p&gt;
&lt;p&gt;How do your activities try to make metadata easier to create?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>new stuff in OWSLib</title><link href="https://kralidis.ca/blog/blog/2009/06/03/new-stuff-in-owslib/" rel="alternate"/><published>2009-06-03T18:29:00+00:00</published><updated>2009-06-03T18:29:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-06-03:/blog/blog/2009/06/03/new-stuff-in-owslib/</id><summary type="html">&lt;p&gt;I've been spending alot of time lately doing a &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; client library in python, which was committed today to &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt;.  CSW requests can be tricky to construct correctly, so this contribution attempts to provide an easy enough entry point to querying OGC Catalogues.&lt;/p&gt;
&lt;p&gt;At this point, you can query your …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been spending alot of time lately doing a &lt;a href="http://www.opengeospatial.org/standards/cat" title="CSW"&gt;CSW&lt;/a&gt; client library in python, which was committed today to &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt;.  CSW requests can be tricky to construct correctly, so this contribution attempts to provide an easy enough entry point to querying OGC Catalogues.&lt;/p&gt;
&lt;p&gt;At this point, you can query your favourite CSW server with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;owslib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csw&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://example.org/csw&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetCapabilities&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# constructs XML request, in c.request&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# HTTP call.  Result in c.response&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRecords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dataset&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;birds&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;152&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# birds datasets in Canada       &lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRecords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;service&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;frog&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# look for services with frogs, anywhere&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That's pretty much all there is to it.  There's also support for DescribeRecord, GetRecordById and GetDomain for the adventurous.&lt;/p&gt;
&lt;p&gt;I hope this will be a valuable addition.  Because CSW uses &lt;a href="http://www.opengeospatial.org/standards/filter" title="Filter"&gt;Filter&lt;/a&gt;, I broke things out into a module per standard, so that other code can reuse, say, filter for request building and response parsing.  A colleague is using this functionality to write a &lt;a href="http://www.qgis.org/" title="QGIS"&gt;QGIS&lt;/a&gt; CSW &lt;a href="http://lists.osgeo.org/pipermail/qgis-user/2009-June/005538.html" title="search plugin"&gt;search plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My next goal will be to put in some response handling.  This will be tricky given the various outputSchema's a given CSW advertises.  For now, I will concentrate on the default csw:Record (a glorified Dublin Core with ows:BoundingBox).&lt;/p&gt;
&lt;p&gt;So try it out;  comments, feedback and suggestions would be most valued.&lt;/p&gt;
&lt;p&gt;Oh ya, thank you &lt;a href="http://docs.python.org/library/xml.etree.elementtree.html" title="etree"&gt;etree&lt;/a&gt;!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer 5.4.0 released</title><link href="https://kralidis.ca/blog/blog/2009/04/23/mapserver-540-released/" rel="alternate"/><published>2009-04-23T06:26:00+00:00</published><updated>2009-04-23T06:26:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-04-23:/blog/blog/2009/04/23/mapserver-540-released/</id><content type="html">&lt;p&gt;&lt;a href="http://lists.osgeo.org/pipermail/mapserver-users/2009-April/061037.html" title="Announced yesterday"&gt;Announced yesterday&lt;/a&gt;, this release closes 92 bugs, and adds some new goodies.&lt;/p&gt;
&lt;p&gt;Next stop: MapServer 6.0&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Creating sitemap files for GeoNetwork</title><link href="https://kralidis.ca/blog/blog/2009/04/15/creating-sitemap-files-for-geonetwork/" rel="alternate"/><published>2009-04-15T18:44:00+00:00</published><updated>2009-04-15T18:44:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-04-15:/blog/blog/2009/04/15/creating-sitemap-files-for-geonetwork/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.sitemaps.org/" title="Sitemaps"&gt;Sitemaps&lt;/a&gt; are a valuable way to index your content for web crawlers.  &lt;a href="http://geonetwork-opensource.org/" title="GeoNetwork"&gt;GeoNetwork&lt;/a&gt; is a great tool for metadata management and a portal environment for discovery.  I wanted to push out all metadata resources out as a sitemap so that content can be found by web crawlers.  Python to the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.sitemaps.org/" title="Sitemaps"&gt;Sitemaps&lt;/a&gt; are a valuable way to index your content for web crawlers.  &lt;a href="http://geonetwork-opensource.org/" title="GeoNetwork"&gt;GeoNetwork&lt;/a&gt; is a great tool for metadata management and a portal environment for discovery.  I wanted to push out all metadata resources out as a sitemap so that content can be found by web crawlers.  Python to the rescue:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;
&lt;span class="normal"&gt;51&lt;/span&gt;
&lt;span class="normal"&gt;52&lt;/span&gt;
&lt;span class="normal"&gt;53&lt;/span&gt;
&lt;span class="normal"&gt;54&lt;/span&gt;
&lt;span class="normal"&gt;55&lt;/span&gt;
&lt;span class="normal"&gt;56&lt;/span&gt;
&lt;span class="normal"&gt;57&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;


&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;MySQLdb&lt;/span&gt;


&lt;span class="c1"&gt;# connect to db&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MySQLdb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;geonetwork&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;# print out XML header&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;&amp;lt;urlset&lt;/span&gt;

&lt;span class="s2"&gt; xmlns=&amp;quot;http://www.sitemaps.org/schemas/sitemap/0.9&amp;quot;&lt;/span&gt;

&lt;span class="s2"&gt; xmlns:geo=&amp;quot;http://www.google.com/geo/schemas/sitemap/1.0&amp;quot;&lt;/span&gt;

&lt;span class="s2"&gt; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&lt;/span&gt;

&lt;span class="s2"&gt; xsi:schemaLocation=&amp;quot;http://www.sitemaps.org/schemas/sitemap/0.9&lt;/span&gt;

&lt;span class="s2"&gt; http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd&amp;quot;&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# fetch all metadata&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;select id, schemaId, changeDate from Metadata where isTemplate = &amp;#39;n&amp;#39;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;store_result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# write out a url element&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;fgdc-std&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://devgeo.cciw.ca/geonetwork/srv/en/fgdc.xml&amp;#39;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;iso19139&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://devgeo.cciw.ca/geonetwork/srv/en/iso19139.xml&amp;#39;&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot; &amp;lt;url&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;  &amp;lt;loc&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;?id=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/loc&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;  &amp;lt;lastmod&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/lastmod&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;  &amp;lt;geo:geo&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;   &amp;lt;geo:format&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/geo:format&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt;  &amp;lt;/geo:geo&amp;gt;&lt;/span&gt;

&lt;span class="s2"&gt; &amp;lt;/url&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;/urlset&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Done!  It would be great if this were an out-of-the-box feature of GeoNetwork.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer Disaster: you have got to be kidding me</title><link href="https://kralidis.ca/blog/blog/2009/04/01/mapserver-disaster-you-have-got-to-be-kidding-me/" rel="alternate"/><published>2009-04-01T15:27:00+00:00</published><updated>2009-04-01T15:27:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-04-01:/blog/blog/2009/04/01/mapserver-disaster-you-have-got-to-be-kidding-me/</id><content type="html">&lt;p&gt;&lt;a href="http://n2.nabble.com/FW%3A-MapServer-enhancements-refactoring-project-td2571268.html"&gt;http://n2.nabble.com/FW%3A-MapServer-enhancements-refactoring-project-td2571268.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm beyond words at this point.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Less Than 4 Hours</title><link href="https://kralidis.ca/blog/blog/2009/03/12/less-than-4-hours/" rel="alternate"/><published>2009-03-12T09:30:00+00:00</published><updated>2009-03-12T09:30:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-03-12:/blog/blog/2009/03/12/less-than-4-hours/</id><content type="html">&lt;p&gt;A benefit of open source.&lt;/p&gt;
&lt;p&gt;\&amp;lt; 4 hours.  That's how long it took to address a &lt;a href="http://trac.osgeo.org/mapserver/ticket/2935" title="MapServer bug in WMS 1.3.0"&gt;MapServer bug in WMS 1.3.0&lt;/a&gt;.  Having been on the other side of these many times, it's gratifying to bang out quick fixes as well.&lt;/p&gt;
&lt;p&gt;Committing often :)&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer Code Sprint Progress</title><link href="https://kralidis.ca/blog/blog/2009/03/10/mapserver-code-sprint-progress/" rel="alternate"/><published>2009-03-10T16:22:00+00:00</published><updated>2009-03-10T16:22:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-03-10:/blog/blog/2009/03/10/mapserver-code-sprint-progress/</id><summary type="html">&lt;p&gt;MapServer action from the &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repository &lt;a href="http://trac.osgeo.org/mapserver/timeline?from=03%2F09%2F09&amp;amp;daysback=2&amp;amp;changeset=on&amp;amp;update=Update" title="changes"&gt;changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;all trac &lt;a href="http://trac.osgeo.org/mapserver/timeline?from=03%2F09%2F09&amp;amp;daysback=3&amp;amp;milestone=on&amp;amp;ticket=on&amp;amp;ticket_details=on&amp;amp;changeset=on&amp;amp;wiki=on&amp;amp;update=Update" title="activity"&gt;activity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Paul has full details on his blog (&lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-1.html" title="day 1"&gt;day 1&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-2.html" title="day 2"&gt;day 2&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-3.html" title="day 3"&gt;day 3&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-4.html" title="day 4"&gt;day 4&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/toronto-code-sprint-lessons.html" title="post-mortem"&gt;post-mortem&lt;/a&gt;).  More details from Chris (&lt;a href="http://crschmidt.net/blog/374/toronto-code-sprint-day-1/" title="day 1"&gt;day 1&lt;/a&gt;, &lt;a href="http://crschmidt.net/blog/376/toronto-code-sprint-day-2/" title="day 2"&gt;day 2&lt;/a&gt;, &lt;a href="http://crschmidt.net/blog/380/code-sprint-day-3/" title="day 3"&gt;day 3&lt;/a&gt;, day 4).  Also check out some &lt;a href="http://www.flickr.com/search/?q=tosprint" title="pictures"&gt;pictures&lt;/a&gt; from the event.&lt;/p&gt;
&lt;p&gt;Personally …&lt;/p&gt;</summary><content type="html">&lt;p&gt;MapServer action from the &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;repository &lt;a href="http://trac.osgeo.org/mapserver/timeline?from=03%2F09%2F09&amp;amp;daysback=2&amp;amp;changeset=on&amp;amp;update=Update" title="changes"&gt;changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;all trac &lt;a href="http://trac.osgeo.org/mapserver/timeline?from=03%2F09%2F09&amp;amp;daysback=3&amp;amp;milestone=on&amp;amp;ticket=on&amp;amp;ticket_details=on&amp;amp;changeset=on&amp;amp;wiki=on&amp;amp;update=Update" title="activity"&gt;activity&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Paul has full details on his blog (&lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-1.html" title="day 1"&gt;day 1&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-2.html" title="day 2"&gt;day 2&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-3.html" title="day 3"&gt;day 3&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/sprint-day-4.html" title="day 4"&gt;day 4&lt;/a&gt;, &lt;a href="http://blog.cleverelephant.ca/2009/03/toronto-code-sprint-lessons.html" title="post-mortem"&gt;post-mortem&lt;/a&gt;).  More details from Chris (&lt;a href="http://crschmidt.net/blog/374/toronto-code-sprint-day-1/" title="day 1"&gt;day 1&lt;/a&gt;, &lt;a href="http://crschmidt.net/blog/376/toronto-code-sprint-day-2/" title="day 2"&gt;day 2&lt;/a&gt;, &lt;a href="http://crschmidt.net/blog/380/code-sprint-day-3/" title="day 3"&gt;day 3&lt;/a&gt;, day 4).  Also check out some &lt;a href="http://www.flickr.com/search/?q=tosprint" title="pictures"&gt;pictures&lt;/a&gt; from the event.&lt;/p&gt;
&lt;p&gt;Personally, I was happy to bang out fixes for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;optionally disabling SLD for WMS (&lt;a href="http://trac.osgeo.org/mapserver/ticket/1395" title="#1395"&gt;#1395&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;support for resultType=hits for WFS (&lt;a href="http://trac.osgeo.org/mapserver/ticket/2907" title="#2907"&gt;#2907&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;working code for WFS spatial filters against the new GEOS thread safe C API (&lt;a href="http://trac.osgeo.org/mapserver/ticket/2929" title="#2929"&gt;#2929&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;WFS 1.1.0 supporting OWS Common 1.0.0 instead of 1.1.0 (&lt;a href="http://trac.osgeo.org/mapserver/ticket/2925" title="#2925"&gt;#2925&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The beginnings of support for correct axis ordering for WFS 1.1.0 (&lt;a href="http://trac.osgeo.org/mapserver/ticket/2899" title="#2899"&gt;#2899&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Good times!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; 12 March 2009: here's a &lt;a href="http://mapfishblog.blogspot.com/2009/03/camtpocamp-at-toronto-code-sprint.html" title="Camptocamp report"&gt;Camptocamp report&lt;/a&gt; of the event.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>TO Code Sprint is upon us</title><link href="https://kralidis.ca/blog/blog/2009/03/05/to-code-sprint-is-upon-us/" rel="alternate"/><published>2009-03-05T07:33:00+00:00</published><updated>2009-03-05T07:33:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-03-05:/blog/blog/2009/03/05/to-code-sprint-is-upon-us/</id><content type="html">&lt;p&gt;The &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="code sprint"&gt;code sprint&lt;/a&gt; starts Saturday, and there's a good turnout of folks from the various OSGeo projects.&lt;/p&gt;
&lt;p&gt;If you'd like to participate, you can join us on IRC at &lt;a href="irc://irc.freenode.net/tosprint" title="#tosprint"&gt;#tosprint&lt;/a&gt; and be there &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009#Present_in_spirit" title="in spirit"&gt;in spirit&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer 5.4.0-beta1 is out</title><link href="https://kralidis.ca/blog/blog/2009/02/19/mapserver-540-beta1-is-out/" rel="alternate"/><published>2009-02-19T07:04:00+00:00</published><updated>2009-02-19T07:04:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-02-19:/blog/blog/2009/02/19/mapserver-540-beta1-is-out/</id><content type="html">&lt;p&gt;&lt;a href="http://www.mapserver.org/download.html" title="Check it out"&gt;Check it out&lt;/a&gt;.  A few &lt;a href="http://lists.osgeo.org/pipermail/mapserver-users/2009-February/060005.html" title="RFCs addressed"&gt;RFCs addressed&lt;/a&gt;, among them OGC WMS 1.3.0 server support.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>WMS 1.3.0 now in MapServer trunk</title><link href="https://kralidis.ca/blog/blog/2009/02/12/wms-130-now-in-mapserver-trunk/" rel="alternate"/><published>2009-02-12T19:33:00+00:00</published><updated>2009-02-12T19:33:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-02-12:/blog/blog/2009/02/12/wms-130-now-in-mapserver-trunk/</id><content type="html">&lt;p&gt;Fresh in &lt;a href="http://trac.osgeo.org/mapserver/changeset/8544" title="svn trunk"&gt;svn trunk&lt;/a&gt;, MapServer now has WMS 1.3.0 Server support and will be part of the forthcoming 5.4 release.&lt;/p&gt;
&lt;p&gt;It will interesting to see the use WMS 1.3.0 gets, given the significant changes from 1.1.1.&lt;/p&gt;
&lt;p&gt;Great work Assefa!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Fun with CGDI Services, OpenLayers and jQuery</title><link href="https://kralidis.ca/blog/blog/2009/02/01/fun-with-cgdi-services-openlayers-and-jquery/" rel="alternate"/><published>2009-02-01T17:27:00+00:00</published><updated>2009-02-01T17:27:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-02-01:/blog/blog/2009/02/01/fun-with-cgdi-services-openlayers-and-jquery/</id><summary type="html">&lt;p&gt;For years in the &lt;a href="http://www.cgdi.ca/" title="CGDI"&gt;CGDI&lt;/a&gt;, we've had various 'common' services; basic XML over HTTP / OGC-ish web services which allow a user to lookup and geocode based on different Canadian spatial identifiers, or keywords.  In their first life (mid 1990s), these existed as embedded lookup tools to facilitate searching and publishing …&lt;/p&gt;</summary><content type="html">&lt;p&gt;For years in the &lt;a href="http://www.cgdi.ca/" title="CGDI"&gt;CGDI&lt;/a&gt;, we've had various 'common' services; basic XML over HTTP / OGC-ish web services which allow a user to lookup and geocode based on different Canadian spatial identifiers, or keywords.  In their first life (mid 1990s), these existed as embedded lookup tools to facilitate searching and publishing in the &lt;a href="http://geodiscover.cgdi.ca/" title="GeoConnections Discovery Portal"&gt;GeoConnections Discovery Portal&lt;/a&gt; (GDP), then called Canadian Earth Observation Network (CEONet).&lt;/p&gt;
&lt;p&gt;CEONet started to publish reusable components (RUCs), which allowed a developer to create an HTML template with special tags to embed these RUCs so as to spatially enable their applications.  Because of the JavaScript security model, the developer passed the template to the CEONet RUC server, which slurped the template and served it up from its own domain.&lt;/p&gt;
&lt;p&gt;In both iterations, the backends were driven by database or HTML scrapes which outputted CSV-ish type output.&lt;/p&gt;
&lt;p&gt;Since v3, (2001-ish) and the rise of Web Services, these RUCs became services themselves, thereby eliminating the need to go through GDP.&lt;/p&gt;
&lt;p&gt;If I had a dime every time someone asked about middleware tools to be able to interact with these services, well....At any rate, the typical approach was as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;setup HTML form with input parameters&lt;/li&gt;
&lt;li&gt;send request to middleware&lt;/li&gt;
&lt;li&gt;middleware invokes web services request, gets result, spits back HTML accordingly to the user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I've done these in many different languages.  For awhile, one of our projects had bundled a spatial clients .war which Java developers can plop into their webapps.&lt;/p&gt;
&lt;p&gt;These days, using OpenLayers and jQuery lets you develop light, interactive ways of accomplishing this without server side middleware.  Trying this against the &lt;a href="http://geoservices.cgdi.ca/NTS/" title="CGDI NTS Lookup Service"&gt;CGDI NTS Lookup Service&lt;/a&gt; provides a neat example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ntsForm&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;action&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;javascript:zoomToNTS();&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nts&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;NTS&lt;span class="w"&gt; &lt;/span&gt;Mapsheet:&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;

&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nts&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;nts&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;size=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;6&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;maxlength=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;6&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And now the JavaScript:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;zoomToNTS&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// build request URL&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mapbuilder&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// simple proxy script&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//geoservices.cgdi.ca/NTS/NTSLookup?&amp;#39;) +&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m m-Double"&gt;1.1.0&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;GetMapsheet&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;mapsheet&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;nts&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// send and process result&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,{},&lt;/span&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// get the bbox of the result&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;gml&lt;/span&gt;&lt;span class="err"&gt;\\&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;boundedBy&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;xml&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nx"&gt;gml&lt;/span&gt;&lt;span class="err"&gt;\\&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;coordinates&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zoomToExtent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Bounds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That's it!  That will get your OpenLayers map zoomed in based on the NTS boundaries.  Notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you'll need a proxy script to deal with remote URLs&lt;/li&gt;
&lt;li&gt;you need to escape namespace'd XML elements/attributes per above, possibly wrapping into a function for reuse.  Same goes for elements seperated with '.' (like \&amp;lt;foo.bar&amp;gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyone have suggestions on improving the example above?  Or any similar snippets?  It would be nice to build up plugins like this for gazetteers, catalogs, and the like.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Really Easy Coordinate Transformation</title><link href="https://kralidis.ca/blog/blog/2009/01/04/really-easy-coordinate-transformation/" rel="alternate"/><published>2009-01-04T13:29:00+00:00</published><updated>2009-01-04T13:29:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2009-01-04:/blog/blog/2009/01/04/really-easy-coordinate-transformation/</id><summary type="html">&lt;p&gt;One of the most frequent questions I get from clients is how to transform lat/long to LCC coordinates in a very lightweight fashion, in their webapps.  There are many solutions and approaches under the &lt;a href="http://wiki.osgeo.org/wiki/MetaCRS" title="MetaCRS"&gt;MetaCRS&lt;/a&gt; umbrella to choose from, depending on your requirements.&lt;/p&gt;
&lt;p&gt;Here's a super lightweight way to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of the most frequent questions I get from clients is how to transform lat/long to LCC coordinates in a very lightweight fashion, in their webapps.  There are many solutions and approaches under the &lt;a href="http://wiki.osgeo.org/wiki/MetaCRS" title="MetaCRS"&gt;MetaCRS&lt;/a&gt; umbrella to choose from, depending on your requirements.&lt;/p&gt;
&lt;p&gt;Here's a super lightweight way to do it with &lt;a href="http://trac.osgeo.org/proj4js/" title="proj4js"&gt;proj4js&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://svn.osgeo.org/metacrs/proj4js/trunk/lib/proj4js-compressed.js&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://svn.osgeo.org/metacrs/proj4js/trunk/lib/defs/EPSG42304.js&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

...

var&lt;span class="w"&gt; &lt;/span&gt;x&lt;span class="w"&gt; &lt;/span&gt;=&lt;span class="w"&gt; &lt;/span&gt;-75.0;
var&lt;span class="w"&gt; &lt;/span&gt;y&lt;span class="w"&gt; &lt;/span&gt;=&lt;span class="w"&gt; &lt;/span&gt;45.0;
var&lt;span class="w"&gt; &lt;/span&gt;p&lt;span class="w"&gt; &lt;/span&gt;=&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;Proj4js.Point(x,y);
Proj4js.transform(new&lt;span class="w"&gt; &lt;/span&gt;Proj4js.Proj(&amp;quot;EPSG:4326&amp;quot;),&lt;span class="w"&gt; &lt;/span&gt;new&lt;span class="w"&gt; &lt;/span&gt;Proj4js.Proj(&amp;quot;EPSG:42304&amp;quot;),&lt;span class="w"&gt; &lt;/span&gt;p);
alert(p.x&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;&lt;span class="w"&gt; &lt;/span&gt;+&lt;span class="w"&gt; &lt;/span&gt;p.y);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Done!  Kudos to &lt;a href="http://wiki.osgeo.org/wiki/User:Madair" title="Mike Adair"&gt;Mike Adair&lt;/a&gt; et. al.!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Shiny New MapServer Website</title><link href="https://kralidis.ca/blog/blog/2008/12/29/shiny-new-mapserver-website/" rel="alternate"/><published>2008-12-29T18:12:00+00:00</published><updated>2008-12-29T18:12:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-12-29:/blog/blog/2008/12/29/shiny-new-mapserver-website/</id><content type="html">&lt;p&gt;Check out the new &lt;a href="http://www.mapserver.org/" title="MapServer"&gt;MapServer&lt;/a&gt; website.  Based on &lt;a href="http://sphinx.pocoo.org/" title="Sphinx"&gt;Sphinx&lt;/a&gt;, the website now has a glossary, full PDF documentation, and a snazzy front page demo to boot.  I think this will result in a much more manageable and up-to-date website for the community.&lt;/p&gt;
&lt;p&gt;Kudos to hobu for an amazing job!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Coding Fun in the T Dot</title><link href="https://kralidis.ca/blog/blog/2008/12/09/coding-fun-in-the-t-dot/" rel="alternate"/><published>2008-12-09T09:22:00+00:00</published><updated>2008-12-09T09:22:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-12-09:/blog/blog/2008/12/09/coding-fun-in-the-t-dot/</id><summary type="html">&lt;p&gt;I've been helping &lt;a href="http://blog.cleverelephant.ca/2008/12/toronto-code-sprint.html" title="Paul"&gt;Paul&lt;/a&gt; with setting up the &lt;a href="http://www.osgeo.org/" title="OSGeo"&gt;OSGeo&lt;/a&gt; &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt; event here in Toronto in March.&lt;/p&gt;
&lt;p&gt;This promises to be an effective and fun event, to have many developers from the various OSGeo projects in one place for a few days.&lt;/p&gt;
&lt;p&gt;Check it out, and hope to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been helping &lt;a href="http://blog.cleverelephant.ca/2008/12/toronto-code-sprint.html" title="Paul"&gt;Paul&lt;/a&gt; with setting up the &lt;a href="http://www.osgeo.org/" title="OSGeo"&gt;OSGeo&lt;/a&gt; &lt;a href="http://wiki.osgeo.org/wiki/Toronto_Code_Sprint_2009" title="Toronto Code Sprint 2009"&gt;Toronto Code Sprint 2009&lt;/a&gt; event here in Toronto in March.&lt;/p&gt;
&lt;p&gt;This promises to be an effective and fun event, to have many developers from the various OSGeo projects in one place for a few days.&lt;/p&gt;
&lt;p&gt;Check it out, and hope to see you there!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>new Open Source Geospatial Book</title><link href="https://kralidis.ca/blog/blog/2008/11/02/new-open-source-geospatial-book/" rel="alternate"/><published>2008-11-02T18:22:00+00:00</published><updated>2008-11-02T18:22:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-11-02:/blog/blog/2008/11/02/new-open-source-geospatial-book/</id><content type="html">&lt;p&gt;Check out "&lt;a href="http://www.springer.com/geography/gis+cartography/book/978-3-540-74830-4" title="Open Source Approaches to Spatial Data Handling"&gt;Open Source Approaches in Spatial Data Handling&lt;/a&gt;" by Hall, Leahy et. al. (disclosure: I did chapter 1).  An interesting read covering many facets and tools of open source geospatial.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Clear Skies with Python and Tag Clouds</title><link href="https://kralidis.ca/blog/blog/2008/10/13/clear-skies-with-python-and-tag-clouds/" rel="alternate"/><published>2008-10-13T08:36:00+00:00</published><updated>2008-10-13T08:36:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-10-13:/blog/blog/2008/10/13/clear-skies-with-python-and-tag-clouds/</id><summary type="html">&lt;p&gt;I've been researching &lt;a href="http://en.wikipedia.org/wiki/Tag_cloud" title="tag clouds"&gt;tag clouds&lt;/a&gt; in the last few days. I think tag clouds can help geospatial search front ends in giving the user a "weighted list", to get them to what they want quickly and more efficiently.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://kralidis.ca/blog/blog/wp-content/uploads/2008/10/tag_cloud.jpg"&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/10/tag_cloud.jpg" title="tag_cloud" class="size-medium wp-image-180" width="292" height="109" alt="tag cloud example" /&gt;&lt;/a&gt;
&lt;figcaption&gt;tag cloud example&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The following Python script takes a list of terms …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've been researching &lt;a href="http://en.wikipedia.org/wiki/Tag_cloud" title="tag clouds"&gt;tag clouds&lt;/a&gt; in the last few days. I think tag clouds can help geospatial search front ends in giving the user a "weighted list", to get them to what they want quickly and more efficiently.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://kralidis.ca/blog/blog/wp-content/uploads/2008/10/tag_cloud.jpg"&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/10/tag_cloud.jpg" title="tag_cloud" class="size-medium wp-image-180" width="292" height="109" alt="tag cloud example" /&gt;&lt;/a&gt;
&lt;figcaption&gt;tag cloud example&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The following Python script takes a list of terms as input.  Such a list can be derived from many things, such as an existing taxonomy, analyzing an httpd log file for commonly used search terms, user votes, and so on.  In this (simple) example, we use comma separated input.&lt;/p&gt;
&lt;p&gt;By creating a term and count dictionary, this sets up the anatomy of a tag cloud.  From here, you can pass this for output to the web (i.e. font sizes, colours, etc.).  Here we output this to an &lt;a href="http://www.apml.org/" title="APML"&gt;APML&lt;/a&gt; document, which is &lt;a href="http://en.wikipedia.org/wiki/Tag_cloud#Visual_appearance" title="often used to represent tag clouds"&gt;often used to represent tag clouds&lt;/a&gt;.  You can then use tools such as &lt;a href="http://www.cluztr.com/" title="clutzr"&gt;cluztr&lt;/a&gt; to generate tag clouds with ease.&lt;/p&gt;
&lt;p&gt;Considerations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the script does a very simple job to assign values of 0.0 to 1.0 to weights&lt;/li&gt;
&lt;li&gt;It would be neat to apply these to searches against spatial identifiers (i.e. "Montreal"), and then map them accordingly&lt;/li&gt;
&lt;li&gt;It would be interesting to hear Cartographers' thoughts on the tag cloud concept&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;

&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;fileinput&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;

&lt;span class="c1"&gt;# term dictionary&lt;/span&gt;
&lt;span class="n"&gt;dTags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="n"&gt;tn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fileinput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="n"&gt;aTags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sTag&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;aTags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# if term is not in list, add&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sTag&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dTags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;dTags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sTag&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="c1"&gt;# else increment term count&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;dTags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sTag&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# output as APML document&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;APML&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nsmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://www.apml.org/apml-0.6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;version&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0.6&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;subnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Body&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;defaultprofile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;owscat&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;subsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;defaultprofile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Terms&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;subsubsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ImplicitData&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subsubsubsubnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Concepts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dTags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iteritems&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Concept&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;key&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;from&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;owscat&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;attrib&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;updated&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;subsubsubsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;termnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;subsubsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsubsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subsubnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xml_declaration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;UTF-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pretty_print&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>I heart this WMS</title><link href="https://kralidis.ca/blog/blog/2008/09/25/i-heart-this-wms/" rel="alternate"/><published>2008-09-25T17:00:00+00:00</published><updated>2008-09-25T17:00:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-09-25:/blog/blog/2008/09/25/i-heart-this-wms/</id><summary type="html">&lt;p&gt;I've written my share of catalogues, Capabilities parsers, map clients, and context import/export tools to know that having good example WMS instances is paramount in testing functionality and building features. I usually have a handy list of WMS servers which I constantly use when writing code.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bsc-eoc.org/" title="Bird Studies Canada"&gt;Bird Studies Canada …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've written my share of catalogues, Capabilities parsers, map clients, and context import/export tools to know that having good example WMS instances is paramount in testing functionality and building features. I usually have a handy list of WMS servers which I constantly use when writing code.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bsc-eoc.org/" title="Bird Studies Canada"&gt;Bird Studies Canada&lt;/a&gt; provides &lt;a href="http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?service=WMS&amp;amp;version=1.1.1&amp;amp;request=GetCapabilities" title="WMS access"&gt;WMS access&lt;/a&gt; to their various bird distribution and abundance data. BSC has taken every effort to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;populate their Capabilities metadata exhaustively. Title, abstract, keywords, and even MetadataURL pointers to FGDC XML documents for all layers. And _full_ service provider metadata (including Attribution, which is great for displaying Logo images, etc.)&lt;/li&gt;
&lt;li&gt;return GetFeatureInfo in both GML and HTML for prettier responses&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This WMS is always at the top of my testing list, as well as my first response when people ask to see an existing WMS example which is well constructed, and serves catalogues and search demos very well indeed.&lt;/p&gt;
&lt;p&gt;Kudos to BSC!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Making W*S suck less</title><link href="https://kralidis.ca/blog/blog/2008/09/19/making-ws-suck-less/" rel="alternate"/><published>2008-09-19T06:58:00+00:00</published><updated>2008-09-19T06:58:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-09-19:/blog/blog/2008/09/19/making-ws-suck-less/</id><summary type="html">&lt;p&gt;I'm starting to work on contributing SOS and OWS Common support in &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt;, a groovy and regimented little GIS Python project.&lt;/p&gt;
&lt;p&gt;So far so good; some &lt;a href="http://trac.gispython.org/lab/ticket/172" title="initial implementations"&gt;initial implementations&lt;/a&gt; are done (committing soon hopefully, writing tests around these).  I think this will add value to the project, seeing that SOS 1 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'm starting to work on contributing SOS and OWS Common support in &lt;a href="http://trac.gispython.org/lab/wiki/OwsLib" title="OWSLib"&gt;OWSLib&lt;/a&gt;, a groovy and regimented little GIS Python project.&lt;/p&gt;
&lt;p&gt;So far so good; some &lt;a href="http://trac.gispython.org/lab/ticket/172" title="initial implementations"&gt;initial implementations&lt;/a&gt; are done (committing soon hopefully, writing tests around these).  I think this will add value to the project, seeing that SOS 1.0 has been around long enough to start seeing implementations.  And the OWS Common support will act as a baseline for all calling specs/code to leverage.&lt;/p&gt;
&lt;p&gt;And it's been a nice journey in Python for me so far.  Another thing I like about this project is the commitment to &lt;a href="http://trac.gispython.org/lab/wiki/CodingStyle" title="testing"&gt;testing&lt;/a&gt; -- awesome!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>GDAL Saves the Day Again</title><link href="https://kralidis.ca/blog/blog/2008/09/03/gdal-saves-the-day-again/" rel="alternate"/><published>2008-09-03T19:35:00+00:00</published><updated>2008-09-03T19:35:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-09-03:/blog/blog/2008/09/03/gdal-saves-the-day-again/</id><summary type="html">&lt;p&gt;A piece of work I help out with involves the visualization and access of hydrometric monitoring data over the Web. Part of this involves the data management and publishing of voluminous databases of monitoring information.&lt;/p&gt;
&lt;p&gt;We use &lt;a href="http://www.maptools.org/chameleon/" title="Chameleon"&gt;Chameleon&lt;/a&gt; for basic visualization and query of the data. Behind the scenes, we …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A piece of work I help out with involves the visualization and access of hydrometric monitoring data over the Web. Part of this involves the data management and publishing of voluminous databases of monitoring information.&lt;/p&gt;
&lt;p&gt;We use &lt;a href="http://www.maptools.org/chameleon/" title="Chameleon"&gt;Chameleon&lt;/a&gt; for basic visualization and query of the data. Behind the scenes, we run a slew of complex processes (shell scripts via cron) to output the data in a format that can be understood by &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; (which we use to publish WMS layers). The processes work across many disparate database connections, so outputting them to shapefiles and accessing them locally helps with performance in web mapping apps. &lt;a href="http://www.gdal.org/ogr/ogr2ogr.html" title="ogr2ogr"&gt;ogr2ogr&lt;/a&gt; is used exclusively and extensively for the access and format translation.&lt;/p&gt;
&lt;p&gt;Well, today I found out that an effort began to write a bunch of scripts to additionally output &lt;a href="http://www.opengeospatial.org/standards/kml" title="OGC KML"&gt;OGC KML&lt;/a&gt;. Thank goodness things didn't get very far, because the following addition to our processes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;ogr2ogr&lt;span class="w"&gt; &lt;/span&gt;-F&lt;span class="w"&gt; &lt;/span&gt;KML&lt;span class="w"&gt; &lt;/span&gt;foo.kml&lt;span class="w"&gt; &lt;/span&gt;bar.ovf&lt;span class="w"&gt; &lt;/span&gt;-dsco&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NameField&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;NAME&lt;span class="w"&gt; &lt;/span&gt;-dsco&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;DescriptionField&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;COMMENT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;...worked like a charm, and put a big smile on people's faces!&lt;/p&gt;
&lt;p&gt;So now, OGC KML is also supported for visualization in Earth browsers. Just like that.&lt;/p&gt;
&lt;p&gt;Output styles are relatively simple; I'm thinking a -dsco like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-dsco LayerStyle=LayerName,styles.kml#mystyle
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;...would point to an existing (local or remote) KML style document style ID via XPointer, i.e.:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;styleUrl&amp;gt;&lt;/span&gt;somefile.kml#mystyle&lt;span class="nt"&gt;&amp;lt;/styleUrl&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Of course the default behaviour would be in place if this -dsco is not defined. I'll see what the GDAL KML gurus think about this.&lt;/p&gt;
&lt;p&gt;At any rate, once again, thank you GDAL for being an uber-utility for day-to-day GIS tasks. Happy faces everywhere!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Documenting the History of MapServer</title><link href="https://kralidis.ca/blog/blog/2008/08/27/documenting-the-history-of-mapserver/" rel="alternate"/><published>2008-08-27T17:10:00+00:00</published><updated>2008-08-27T17:10:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-08-27:/blog/blog/2008/08/27/documenting-the-history-of-mapserver/</id><content type="html">&lt;p&gt;Inspired by the recent &lt;a href="http://lists.osgeo.org/pipermail/discuss/2008-August/004120.html" title="thread"&gt;thread&lt;/a&gt; on &lt;a href="/blog/2008/08/21/foss4g-history/" title="FOSS4G history"&gt;FOSS4G history&lt;/a&gt;, I started an effort to document MapServer's history, from its beginnings in the mid-1990s. Check out the &lt;a href="http://trac.osgeo.org/mapserver/wiki/MapServerHistory" title="progress"&gt;progress&lt;/a&gt; we've made so far. If there's anything missing, or in error, feel free to contribute!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer 5.2 released</title><link href="https://kralidis.ca/blog/blog/2008/07/17/mapserver-52-released/" rel="alternate"/><published>2008-07-17T07:36:00+00:00</published><updated>2008-07-17T07:36:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-07-17:/blog/blog/2008/07/17/mapserver-52-released/</id><content type="html">&lt;p&gt;Fresh off the press, MapServer 5.2 has been &lt;a href="http://lists.osgeo.org/pipermail/mapserver-users/2008-July/056771.html" title="released"&gt;released&lt;/a&gt;. A total of &lt;a href="http://trac.osgeo.org/mapserver/query?status=closed&amp;amp;milestone=5.2+release" title="196 issues"&gt;196 issues&lt;/a&gt; were fixed in 5.2, as well as a number of enhancements. Sources can be fetched from &lt;a href="http://mapserver.gis.umn.edu/download/current"&gt;http://mapserver.gis.umn.edu/download/current&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Good job everyone!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer 5.2 is coming</title><link href="https://kralidis.ca/blog/blog/2008/06/12/mapserver-52-is-coming/" rel="alternate"/><published>2008-06-12T10:41:00+00:00</published><updated>2008-06-12T10:41:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-06-12:/blog/blog/2008/06/12/mapserver-52-is-coming/</id><summary type="html">&lt;p&gt;We just released beta1 &lt;a href="http://www.nabble.com/MapServer-5.2-Beta-1-Available-ts17788950.html" title="yesterday"&gt;yesterday&lt;/a&gt;. And lots of new features (&lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-36" title="enhanced templating"&gt;enhanced templating&lt;/a&gt;, &lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-38" title="SQL Server 2008 support"&gt;SQL Server 2008 support&lt;/a&gt;, &lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-43" title="Google API support for tiling"&gt;Google API support for tiling&lt;/a&gt;) and &lt;a href="http://trac.osgeo.org/mapserver/query?status=closed&amp;amp;milestone=5.2+release&amp;amp;type=defect&amp;amp;order=priority" title="bug fixes"&gt;bug fixes&lt;/a&gt;. Oh, and the OGC support grows; WCS 1.1, WFS 1.1, SOS 1.0.0 to name a few new implementations. While full CITE compliance …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We just released beta1 &lt;a href="http://www.nabble.com/MapServer-5.2-Beta-1-Available-ts17788950.html" title="yesterday"&gt;yesterday&lt;/a&gt;. And lots of new features (&lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-36" title="enhanced templating"&gt;enhanced templating&lt;/a&gt;, &lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-38" title="SQL Server 2008 support"&gt;SQL Server 2008 support&lt;/a&gt;, &lt;a href="http://mapserver.gis.umn.edu/rfc/ms-rfc-43" title="Google API support for tiling"&gt;Google API support for tiling&lt;/a&gt;) and &lt;a href="http://trac.osgeo.org/mapserver/query?status=closed&amp;amp;milestone=5.2+release&amp;amp;type=defect&amp;amp;order=priority" title="bug fixes"&gt;bug fixes&lt;/a&gt;. Oh, and the OGC support grows; WCS 1.1, WFS 1.1, SOS 1.0.0 to name a few new implementations. While full CITE compliance is not quite complete for some of these, I think the initial implementations are very solid, and have already passed many of the CITE assertions.&lt;/p&gt;
&lt;p&gt;For me, I'm happy to see the increased OGC support, as well as broadening MapServer's capabilities for defacto standards like Google tiling, as well as the new possibilities as a result of the templating (like &lt;a href="http://www.geojson.org/" title="GeoJSON"&gt;GeoJSON&lt;/a&gt;, etc.). Community feedback on this release would be great, if you want to follow the &lt;a href="http://mapserver.gis.umn.edu/development/release_plans/mapserver_5_2/release_plan/" title="release plan"&gt;release plan&lt;/a&gt;. Final release is slated for 09 July 2008.&lt;/p&gt;
&lt;p&gt;What features are you looking forward to using for 5.2.0?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer and WxS updateSequence</title><link href="https://kralidis.ca/blog/blog/2008/02/12/mapserver-and-wxs-updatesequence/" rel="alternate"/><published>2008-02-12T20:18:00+00:00</published><updated>2008-02-12T20:18:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-02-12:/blog/blog/2008/02/12/mapserver-and-wxs-updatesequence/</id><summary type="html">&lt;p&gt;OGC service standards (such as WMS, WFS, WCS, SOS) support something called updateSequence. In short, this value represents an identifier which clients (catalogs, applications, etc.) can use to maintain their local copy up to date. This saves clients from fetching and parsing an entire (sometimes hefty) Capabilities XML document in …&lt;/p&gt;</summary><content type="html">&lt;p&gt;OGC service standards (such as WMS, WFS, WCS, SOS) support something called updateSequence. In short, this value represents an identifier which clients (catalogs, applications, etc.) can use to maintain their local copy up to date. This saves clients from fetching and parsing an entire (sometimes hefty) Capabilities XML document in cases where the server has not made any updates.&lt;/p&gt;
&lt;p&gt;Thanks to a recent &lt;a href="http://trac.osgeo.org/mapserver/ticket/2384" title="enhancement"&gt;enhancement&lt;/a&gt;, MapServer now supports updateSequence for WMS Server, WFS Server, WCS Server, and SOS Server. Support is triggered by mapfile metadata MAP/WEB/METADATA/ows_updatesequence. The value can be a string, integer or ISO8601 timestamp.&lt;/p&gt;
&lt;p&gt;We initially thought of using the mtime of the mapfile, but this may not have been the most indicative. What if other files (pointed to by the mapfile) are modified, and not the mapfile? What if the mapfile is touch'd and and no content changes are made? For this reason, we went with a user-specified value. Basically, if the user knows the purpose updateSequence, they can use it and manage it at their own discretion.&lt;/p&gt;
&lt;p&gt;I suppose the OGC could have allowed using the HTTP Last-Modified header, however that may get slippery in terms of semantics.&lt;/p&gt;
&lt;p&gt;Give it a shot! I'd be interested in hearing how this works with existing catalogues and applications. The enhancement seems to be passing the CITE tests initially (let's keep our fingers crossed!). At any rate, it is fun to code an enhancement like this. It's also nice to have dedicated tests to all the use cases surrounding updateSequence within &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/msautotest/wxs" title="msautotest/wxs/"&gt;msautotest/wxs/&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer Janitorial</title><link href="https://kralidis.ca/blog/blog/2008/01/25/mapserver-janitorial/" rel="alternate"/><published>2008-01-25T19:04:00+00:00</published><updated>2008-01-25T19:04:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2008-01-25:/blog/blog/2008/01/25/mapserver-janitorial/</id><summary type="html">&lt;p&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/01/cleanup.jpg" data-align="left" width="185" height="250" alt="cleanup" /&gt;Some of the MapServer developers may have been getting more than their share of &lt;a href="http://trac.osgeo.org/mapserver/timeline" title="trac notifications"&gt;trac notifications&lt;/a&gt; this week. This is partly because I've taken the last few days to sift through many tickets which have no milestone attached to them. Between old issues, bugs that have since been fixed, etc …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img src="https://kralidis.ca/blog/blog/wp-content/uploads/2008/01/cleanup.jpg" data-align="left" width="185" height="250" alt="cleanup" /&gt;Some of the MapServer developers may have been getting more than their share of &lt;a href="http://trac.osgeo.org/mapserver/timeline" title="trac notifications"&gt;trac notifications&lt;/a&gt; this week. This is partly because I've taken the last few days to sift through many tickets which have no milestone attached to them. Between old issues, bugs that have since been fixed, etc., it was nice to clean house a bit. They contributed to ~20 tickets being closed just this week! It's amazing to see how many old school tickets there are lying around in trac. I try to commit to a once a month sift of trac for the oldies, but sometimes goodies :)&lt;/p&gt;
&lt;p&gt;Other MapServer thoughts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I love the &lt;a href="http://www.openlayers.org/blog/" title="OpenLayers"&gt;OpenLayers&lt;/a&gt; and &lt;a href="http://blog.geoserver.org/" title="GeoServer"&gt;GeoServer&lt;/a&gt; blogs. In addition to annoucements, they also convey useful information about features, demos, etc. It would be great if MapServer had a blog. Something like &lt;a href="http://www.coreblog.org/" title="COREBlog"&gt;COREBlog&lt;/a&gt; could be used within the existing Plone-based &lt;a href="http://mapserver.gis.umn.edu/" title="website"&gt;website&lt;/a&gt;. Or, as discussed with &lt;a href="http://hobu.biz" title="hobu"&gt;hobu&lt;/a&gt; on &lt;a href="irc://irc.freenode.net/mapserver" title="IRC"&gt;IRC&lt;/a&gt; earlier this week, maybe the entire MapServer website can be based on trac. Existing pages could be ported to trac, as well as having a unified username/password, leveraging the &lt;a href="http://www.osgeo.org/" title="OSGeo"&gt;OSGeo&lt;/a&gt; infrastructure. Food for thought :)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ms-ogc-workshop.maptools.org/" title="OGC Web Services Workshop"&gt;OGC Web Services Workshop&lt;/a&gt;: I have been thinking about moving this to MapServer's OSGeo infrastructure. This way, it matures with the MapServer project as a whole. This would include a dedicated component in &lt;a href="http://trac.osgeo.org/mapserver/" title="trac"&gt;trac&lt;/a&gt;, as well as a module in &lt;a href="http://svn.osgeo.org/mapserver" title="svn"&gt;svn&lt;/a&gt;. Well, it turns out that Steve, who is doing a MapServer tutorial, is into this as well. This could lead to perhaps shared mapfiles and datasets for the various MapServer demos/tutorials/workshops. Stay tuned!&lt;/li&gt;
&lt;li&gt;I'll say &lt;a href="/blog/2007/04/23/my-mapserver-wishlist/" title="this"&gt;this&lt;/a&gt; again: I think a better organized codebase would result in more intuitive, componentized development. For example, it's so easy to peruse the &lt;a href="http://www.gdal.org/" title="GDAL"&gt;GDAL&lt;/a&gt; &lt;a href="http://svn.osgeo.org/gdal/trunk/gdal/" title="codebase"&gt;codebase&lt;/a&gt; thanks to the directory structuring of the code, IMHO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's it from here. Time to kickoff the weekend and start up the BBQ (yes, in this tundra-like weather -- I'm an all year BBQ guy). Have a great weekend everyone!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Two Milk, No Sugar</title><link href="https://kralidis.ca/blog/blog/2007/12/28/two-milk-no-sugar/" rel="alternate"/><published>2007-12-28T08:50:00+00:00</published><updated>2007-12-28T08:50:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-12-28:/blog/blog/2007/12/28/two-milk-no-sugar/</id><summary type="html">&lt;p&gt;That's how I take my coffee :) You may have heard of &lt;a href="http://www.timhortons.com/" title="Tim Hortons"&gt;Tim Hortons&lt;/a&gt; -- a mecca for coffee shops in Canada. Many of us are lost without it during our morning commute. Even though they are seemingly everywhere, there are times when you just can't find one.&lt;/p&gt;
&lt;p&gt;A friend of mine …&lt;/p&gt;</summary><content type="html">&lt;p&gt;That's how I take my coffee :) You may have heard of &lt;a href="http://www.timhortons.com/" title="Tim Hortons"&gt;Tim Hortons&lt;/a&gt; -- a mecca for coffee shops in Canada. Many of us are lost without it during our morning commute. Even though they are seemingly everywhere, there are times when you just can't find one.&lt;/p&gt;
&lt;p&gt;A friend of mine pointed me to a &lt;a href="http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=66445&amp;amp;whichpage=1" title="forum"&gt;forum&lt;/a&gt; working on collecting locations of all Tim Hortons locations in Canada and the US. Wouldn't it be great to upload these to a GPS which supports GPX format? Or to visualize in Google Earth, for example?&lt;/p&gt;
&lt;p&gt;This is easily done using open source geospatial tools. &lt;a href="http://www.gdal.org/ogr/" title="OGR"&gt;OGR&lt;/a&gt; supports the reading and writing of a number of &lt;a href="http://www.gdal.org/ogr/ogr_formats.html" title="formats"&gt;formats&lt;/a&gt;, including GPX, KML, GeoJSON, Shapefile, and so on. Here's how:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download http://www.gpspassion.com/upload/team/Dewi_TimHortons_xls_20071120.zip th.zip&lt;/li&gt;
&lt;li&gt;Save as CSV (there is a CSV online, but the XLS has more detailed description of each location)&lt;/li&gt;
&lt;li&gt;Use OGR's &lt;a href="http://www.gdal.org/ogr/drv_vrt.html" title="Virtual Datasource"&gt;Virtual Datasource support&lt;/a&gt; to read the CSV. Here's the OVF definition:&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;OGRVRTDataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;OGRVRTLayer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;th&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SrcDataSource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;relativeToVRT=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;./th.csv&lt;span class="nt"&gt;&amp;lt;/SrcDataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GeometryType&amp;gt;&lt;/span&gt;wkbPoint&lt;span class="nt"&gt;&amp;lt;/GeometryType&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;LayerSRS&amp;gt;&lt;/span&gt;WGS84&lt;span class="nt"&gt;&amp;lt;/LayerSRS&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GeometryField&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;PointFromColumns&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;x=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Longitude&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;y=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Latitude&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OGRVRTLayer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OGRVRTDataSource&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Transform to your heart's content:&lt;/p&gt;
&lt;p&gt;\$ ogr2ogr -f KML ./th.kml ./th.ovf&lt;/p&gt;
&lt;p&gt;\$ ogr2ogr -dsco "GPX_USE_EXTENSIONS=YES" -f GPX ./th.gpx ./th.ovf&lt;/p&gt;
&lt;p&gt;I've bundled up a &lt;a href="/tmp/th.zip" title="zipfile"&gt;zipfile&lt;/a&gt; of various formats for use as an example -- have fun!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer SOS Server Updates</title><link href="https://kralidis.ca/blog/blog/2007/11/25/mapserver-sos-server-updates/" rel="alternate"/><published>2007-11-25T21:29:00+00:00</published><updated>2007-11-25T21:29:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-11-25:/blog/blog/2007/11/25/mapserver-sos-server-updates/</id><summary type="html">&lt;p&gt;This past week has seen alot of activity in MapServer's SOS Server Support. Remember when I posted about &lt;a href="/blog/2007/10/15/mapserver-sos-and-swe-datablock/" title="DataBlock"&gt;DataBlock&lt;/a&gt;? Well, Assefa did a great job in initially implementing this, and you can see the results in action &lt;a href="http://sos-web.tamu.edu/sos-cgi/top_obs" title="right here"&gt;right here&lt;/a&gt;. I'm going to be working on ensuring the XML conformance as …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This past week has seen alot of activity in MapServer's SOS Server Support. Remember when I posted about &lt;a href="/blog/2007/10/15/mapserver-sos-and-swe-datablock/" title="DataBlock"&gt;DataBlock&lt;/a&gt;? Well, Assefa did a great job in initially implementing this, and you can see the results in action &lt;a href="http://sos-web.tamu.edu/sos-cgi/top_obs" title="right here"&gt;right here&lt;/a&gt;. I'm going to be working on ensuring the XML conformance as per the SOS and OM standards, but it's great to see this working!&lt;/p&gt;
&lt;p&gt;This weekend, I added &lt;a href="http://trac.osgeo.org/mapserver/ticket/2379" title="POST support"&gt;POST support&lt;/a&gt;. The SOS standard states that POST must be supported for all requests (except for GetCapabilities, which may be GET only). As a result, both GET and POST are now supported for all requests. I used &lt;a href="http://www.xmlsoft.org/" title="libxml2"&gt;libxml2&lt;/a&gt;'s &lt;a href="http://www.xmlsoft.org/html/libxml-xpath.html" title="XPath"&gt;XPath&lt;/a&gt; support to parse the requests. &lt;a href="http://www.w3.org/TR/xpath" title="XPath"&gt;XPath&lt;/a&gt; is an awesome way to parse XML! Support is not fully completed yet, as eventTime, result, and featureOfInterest are still yet to be implemented for POST (they are implemented for GET).&lt;/p&gt;
&lt;p&gt;It will be interesting to see the mileage DataBlock gets. Especially seeing that now MapServer SOS presents a nice compact option to disseminate observation data over the web.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer SOS and SWE DataBlock</title><link href="https://kralidis.ca/blog/blog/2007/10/15/mapserver-sos-and-swe-datablock/" rel="alternate"/><published>2007-10-15T20:27:00+00:00</published><updated>2007-10-15T20:27:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-10-15:/blog/blog/2007/10/15/mapserver-sos-and-swe-datablock/</id><summary type="html">&lt;p&gt;As part of MapServer's support for standards-based interfaces, the SOS Server support is coming along quite well. With SOS 1.0.0 now adopted (although the schemas and standards document are not on the &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt; public website yet), this provides a good opportunity to update the SOS support (which was …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As part of MapServer's support for standards-based interfaces, the SOS Server support is coming along quite well. With SOS 1.0.0 now adopted (although the schemas and standards document are not on the &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt; public website yet), this provides a good opportunity to update the SOS support (which was previously at 0.0.31 and 0.1.2). This also was also a good time to move some of the GML code out of mapogcsos.c and into modular functions within mapgml.c.&lt;/p&gt;
&lt;p&gt;Already numerous updates have been made. Some work is still required for GetObservation output (formatting, application schema, etc.). In parallel, Charlton Purvis has &lt;a href="http://trac.osgeo.org/mapserver/ticket/2248" title="requested"&gt;requested&lt;/a&gt; SWE DataBlock support as an output format for GetObservation requests. What the heck is a DataBlock, you say?&lt;/p&gt;
&lt;p&gt;MapServer's SOS GetObservation output is very WFS-ish in appearance (we use om:member to encapsulate a gml:featureMember, among other data). Of course, each attribute (or column value) is output as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;pitch&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;2.5&amp;lt;yaw&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;-1.4538&lt;span class="nt"&gt;&amp;lt;/yaw&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;pitch&amp;gt;&lt;/span&gt;1.49672&lt;span class="nt"&gt;&amp;lt;/pitch&amp;gt;&amp;lt;yaw&amp;gt;&lt;/span&gt;-1.59275&lt;span class="nt"&gt;&amp;lt;/yaw&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Observation data can become quite voluminous. Coupled with the baggage in redundant tag names, and you have quite a large response.&lt;/p&gt;
&lt;p&gt;Let's not be confused here. One big benefit of XML is that it allows for expressive and self-describing content models. At the same time, there are some situations where a more compact representation is beneficial.&lt;/p&gt;
&lt;p&gt;Enter the SWE DataBlock. An XML construct, the DataBlock puts forth a header, if you will, which defines the field names and types, as well format separators. What then follows is a "block" of data, similar to a CSV file. Check out this &lt;a href="http://trac.osgeo.org/mapserver/attachment/ticket/2248/airdas.xml" title="example"&gt;example&lt;/a&gt; for a better idea. MapServer will still support the existing GetObservation output; we are simply adding another resultModel to the mix.&lt;/p&gt;
&lt;p&gt;I think this will be a welcome addition to MapServer's SOS support. I initially thought &lt;a href="http://www.gdal.org/ogr/" title="OGR"&gt;OGR&lt;/a&gt;'s CSV write support would be a good fit, but Frank thought, for such a simple output, we might as well do this inline.&lt;/p&gt;
&lt;p&gt;I think SWE DataBlock is pretty useful. I wonder whether WFS GetFeature requests would benefit from this as well.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>MapServer 5.0 released</title><link href="https://kralidis.ca/blog/blog/2007/09/17/mapserver-50-released/" rel="alternate"/><published>2007-09-17T15:24:00+00:00</published><updated>2007-09-17T15:24:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-09-17:/blog/blog/2007/09/17/mapserver-50-released/</id><content type="html">&lt;p&gt;Fresh off the press, &lt;a href="http://www.nabble.com/MapServer-5.0.0-released%21-tf4469827.html" title="check it out"&gt;check it out&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>OWSlib and mapscript</title><link href="https://kralidis.ca/blog/blog/2007/07/15/owslib-and-mapscript/" rel="alternate"/><published>2007-07-15T11:56:00+00:00</published><updated>2007-07-15T11:56:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-07-15:/blog/blog/2007/07/15/owslib-and-mapscript/</id><summary type="html">&lt;p&gt;My first major code contribution to MapServer was a server side implementation of &lt;a href="http://www.opengeospatial.org/standards/common" title="OWS Common"&gt;OWS Common&lt;/a&gt; &lt;a href="http://portal.opengeospatial.org/files/?artifact_id=8798" title="1.0.0"&gt;1.0.0&lt;/a&gt;. For those who are not aware, OWS Common is a specification which unifies common XML constructs, etc. used by OGC specifications, such as Capabilities metadata, exception reports and bounding box encodings. The …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My first major code contribution to MapServer was a server side implementation of &lt;a href="http://www.opengeospatial.org/standards/common" title="OWS Common"&gt;OWS Common&lt;/a&gt; &lt;a href="http://portal.opengeospatial.org/files/?artifact_id=8798" title="1.0.0"&gt;1.0.0&lt;/a&gt;. For those who are not aware, OWS Common is a specification which unifies common XML constructs, etc. used by OGC specifications, such as Capabilities metadata, exception reports and bounding box encodings. The benefit of OWS Common is that specifications, and subsequently server implementations, can focus on their core specific functionality while leveraging the common bits.&lt;/p&gt;
&lt;p&gt;A good example here is MapServer's SOS server support, which leverages &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/mapserver/mapowscommon.c" title="mapowscommon.c"&gt;mapowscommon.c&lt;/a&gt;, making &lt;a href="http://trac.osgeo.org/mapserver/browser/trunk/mapserver/mapogcsos.c" title="mapogcsos.c"&gt;mapogcsos.c&lt;/a&gt; alot lighter as a result. Client implementations can additionally write OWS Common parsers as reusable functionality which they can then use when writing their, say, WFS and SOS clients. I really believe that this is a benefit for those developing SDI components (i.e. why should contact information be encoded differently for WMS and WFS, really?); just imagine the reduction in code as a result of OWS Common!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://zcologia.com/news/" title="Sean"&gt;Sean&lt;/a&gt; recently pointed me to &lt;a href="http://trac.gispython.org/projects/PCL/wiki/OwsLib" title="OWSlib"&gt;OWSlib&lt;/a&gt;, a python lib for working with OGC Web Services. I initially thought it would be great to write an OWS Common client / parser for OWSlib, so that when WFS 1.1.0 and SOS 1.0.0 clients are developed, they can use an OWS Common class between them.&lt;/p&gt;
&lt;p&gt;But then I thought why not just implement this in MapServer, and have the functionality exposed via mapscript?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Reprojecting in Python</title><link href="https://kralidis.ca/blog/blog/2007/07/14/reprojecting-in-python/" rel="alternate"/><published>2007-07-14T17:40:00+00:00</published><updated>2007-07-14T17:40:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-07-14:/blog/blog/2007/07/14/reprojecting-in-python/</id><summary type="html">&lt;p&gt;My &lt;a href="/blog/2007/06/18/getting-into-python/" title="previous post"&gt;previous post&lt;/a&gt; declared my plugging my nose and jumping into Python GIS stuff. &lt;a href="http://zcologia.com/news/488/diving-into-python/" title="Advice"&gt;Advice&lt;/a&gt; and &lt;a href="http://www.gispython.org/" title="info"&gt;info&lt;/a&gt; from &lt;a href="http://zcologia.com/news/" title="Sean"&gt;Sean&lt;/a&gt; have been valuable in getting familiar with things, though I'll be the first to admit I'm still green (writing Python like a Perl / C hack :) ).&lt;/p&gt;
&lt;p&gt;So here's one of my first …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My &lt;a href="/blog/2007/06/18/getting-into-python/" title="previous post"&gt;previous post&lt;/a&gt; declared my plugging my nose and jumping into Python GIS stuff. &lt;a href="http://zcologia.com/news/488/diving-into-python/" title="Advice"&gt;Advice&lt;/a&gt; and &lt;a href="http://www.gispython.org/" title="info"&gt;info&lt;/a&gt; from &lt;a href="http://zcologia.com/news/" title="Sean"&gt;Sean&lt;/a&gt; have been valuable in getting familiar with things, though I'll be the first to admit I'm still green (writing Python like a Perl / C hack :) ).&lt;/p&gt;
&lt;p&gt;So here's one of my first attempts at solving a real world problem: reprojecting a bunch of points from a CSV file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mapscript&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

   &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;lt;csvfile&amp;gt;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;projInObj&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapscript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;projectionObj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;init=epsg:32619&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;projOutObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapscript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;projectionObj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;init=epsg:4326&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

   &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;id,geom,zone&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;wkt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;POINT(&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapscript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shapeObj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromWKT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wkt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# man, I love WKT!!&lt;/span&gt;
        &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projInObj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;projOutObj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toWKT&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And that's it! So now you can take the CSV output with the geometry encoded as WKT and hook it up to &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; with some simple OGR OVF syntax in your mapfile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;CONNECTIONTYPE&lt;span class="w"&gt; &lt;/span&gt;OGR
CONNECTION&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;&lt;span class="nt"&gt;&amp;lt;OGRVRTDataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;OGRVRTLayer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;nb&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SrcDataSource&amp;gt;&lt;/span&gt;./nb.csv&lt;span class="nt"&gt;&amp;lt;/SrcDataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GeometryType&amp;gt;&lt;/span&gt;wkbPoint&lt;span class="nt"&gt;&amp;lt;/GeometryType&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;GeometryField&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;encoding=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;WKT&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;field=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;geom&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OGRVRTLayer&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/OGRVRTDataSource&amp;gt;&lt;/span&gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Mind you, you might question why to reproject when MapServer can do this for you, but I digress. There's probably more eloquent ways to do this than what's been done above via &lt;a href="http://mapserver.gis.umn.edu/docs/reference/mapscript" title="mapscript"&gt;mapscript&lt;/a&gt;, eh?&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Awesome Online Webmapping Course</title><link href="https://kralidis.ca/blog/blog/2007/04/24/awesome-online-webmapping-course/" rel="alternate"/><published>2007-04-24T10:52:00+00:00</published><updated>2007-04-24T10:52:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-04-24:/blog/blog/2007/04/24/awesome-online-webmapping-course/</id><content type="html">&lt;p&gt;Just read &lt;a href="http://cameronshorter.blogspot.com/2007/04/open-webmapping-course.html" title="Cameron's"&gt;Cameron's&lt;/a&gt; pointer to this &lt;a href="https://courseware.e-education.psu.edu/courses/geog585/content/home.html" title="course"&gt;course&lt;/a&gt;. All I have to say is wow. This is probably the most user-friendly and comprehensive online course / outreach material I've seen in a long time. And the &lt;a href="http://webmapping.mgis.psu.edu/mapbuilder/demo/index2.html" title="student demo pages"&gt;student demo pages&lt;/a&gt; are really impressive.&lt;/p&gt;
&lt;p&gt;Kudos to Ian and students!!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Three Cheers for FOSS4G</title><link href="https://kralidis.ca/blog/blog/2007/03/19/three-cheers-for-foss4g/" rel="alternate"/><published>2007-03-19T19:48:00+00:00</published><updated>2007-03-19T19:48:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2007-03-19:/blog/blog/2007/03/19/three-cheers-for-foss4g/</id><summary type="html">&lt;p&gt;I go to my share of conferences, seminars and meetings. I think it's part of keeping abreast of the community, technology, seeing colleagues, and making new contacts.&lt;/p&gt;
&lt;p&gt;I always say, if there's one conference that I make my best effort to attend, it's the &lt;a href="http://www.foss4g2007.org/" title="FOSS4G conference"&gt;FOSS4G conference&lt;/a&gt;. Although the name has …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I go to my share of conferences, seminars and meetings. I think it's part of keeping abreast of the community, technology, seeing colleagues, and making new contacts.&lt;/p&gt;
&lt;p&gt;I always say, if there's one conference that I make my best effort to attend, it's the &lt;a href="http://www.foss4g2007.org/" title="FOSS4G conference"&gt;FOSS4G conference&lt;/a&gt;. Although the name has gone through a &lt;a href="http://www.omsug.ca/osgis2004/index.html" title="few"&gt;few&lt;/a&gt; &lt;a href="http://mapserver.gis.umn.edu/community/conferences/MUM3/" title="iterations"&gt;iterations&lt;/a&gt;, I think the theme has generally been consistent: open source software for geospatial (I prefer the term geospatial, as oppossed to geo-informatics, GIS, geoscience, etc.).&lt;/p&gt;
&lt;p&gt;Some of the things I enjoy are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Meeting the actual developers. Many of the developers attend this conference, and it's a great chance to meet them in person, find out about future developments, or even ask them that burning question about line 642 in file gfoo.c&lt;/li&gt;
&lt;li&gt;The workshops: hands-on workshops are provided which are very useful. For example, I quickly learned PostGIS here and applied it the week after. The developers frequently give or hover these workshops, especially when it pertains to their software, so you can be sure that questions, no matter how complex, will be addressed&lt;/li&gt;
&lt;li&gt;The applications: it's valuable to see presentations of projects which use FOSS4G approaches. Regardless of how simple you think your application/project/portal is, the fact that you have integrated these approaches is a great indication of your abilities, integration, and the tools used&lt;/li&gt;
&lt;li&gt;The community: last, but not least. The dynamics, the personalities, and the commitment and passion for this cause is exhilarating to see and be a part of&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you come from the open source software world, or have an interest in geospatial, or are a geospatial professional who's curious about open source tools, technologies, the projects that use them, you'll want to think about &lt;a href="http://www.foss4g2007.org/" title="this conference"&gt;this conference&lt;/a&gt;.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>How did You get Started in GIS?</title><link href="https://kralidis.ca/blog/blog/2006/11/07/how-did-you-get-started-in-gis/" rel="alternate"/><published>2006-11-07T22:41:00+00:00</published><updated>2006-11-07T22:41:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-11-07:/blog/blog/2006/11/07/how-did-you-get-started-in-gis/</id><summary type="html">&lt;p&gt;Just read a &lt;a href="http://www.directionsmag.com/article.php?article_id=2299&amp;amp;trv=1" title="neat article"&gt;neat article&lt;/a&gt; from &lt;a href="http://www.directionsmag.com/" title="Directions Magazine"&gt;Directions Magazine&lt;/a&gt;. Great article on how someone got a start in GIS, technology and the like with a great internship. This got me thinking about how I got started in GIS.&lt;/p&gt;
&lt;p&gt;After finishing &lt;a href="http://www.yorku.ca/" title="undergrad"&gt;undergrad&lt;/a&gt; with a geography degree, I found myself woefully underemployed. In …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Just read a &lt;a href="http://www.directionsmag.com/article.php?article_id=2299&amp;amp;trv=1" title="neat article"&gt;neat article&lt;/a&gt; from &lt;a href="http://www.directionsmag.com/" title="Directions Magazine"&gt;Directions Magazine&lt;/a&gt;. Great article on how someone got a start in GIS, technology and the like with a great internship. This got me thinking about how I got started in GIS.&lt;/p&gt;
&lt;p&gt;After finishing &lt;a href="http://www.yorku.ca/" title="undergrad"&gt;undergrad&lt;/a&gt; with a geography degree, I found myself woefully underemployed. In 1997, I decided to move to Ottawa, Ontario, Canada and pursue GIS, as I thought it would combine the desired technical skills to make myself marketable, as well as my love for maps and travel. Within a couple of months, I had an internship at &lt;a href="http://www.nrcan.gc.ca/" title="Natural Resources Canada"&gt;Natural Resources Canada&lt;/a&gt; (now that's a story!) which had me working on aerial photo selection in the map library to start.&lt;/p&gt;
&lt;p&gt;Soon after, I was right in the GIS thick of things, building a GIS database from the ground up and publishing it to the web. The &lt;a href="http://geodiscover.cgdi.ca/gdp/search?action=entrySummary&amp;amp;entryType=productCollection&amp;amp;entryId=28&amp;amp;entryLang=en" title="Ground Control Database"&gt;Ground Control Database&lt;/a&gt; was my first real project which allowed me to apply the power of GIS, and, in my case, expose me to the world of GIS and the Internet.&lt;/p&gt;
&lt;p&gt;So how did you get started in the geospatial / GIS field? I find this interesting because our field brings people from so many disciplines and backgrounds.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>GeoRSS WordPress plugin for the poor man</title><link href="https://kralidis.ca/blog/blog/2006/09/26/georss-wordpress-plugin-for-the-poor-man/" rel="alternate"/><published>2006-09-26T11:49:00+00:00</published><updated>2006-09-26T11:49:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-09-26:/blog/blog/2006/09/26/georss-wordpress-plugin-for-the-poor-man/</id><summary type="html">&lt;p&gt;It's exciting to see &lt;a href="http://www.georss.org/" title="GeoRSS"&gt;GeoRSS&lt;/a&gt; published as an official &lt;a href="http://www.georss.org/1/" title="1.0 specification"&gt;1.0 specification&lt;/a&gt; -- congratulations to the GeoRSS team in putting out this useful &lt;a href="http://en.wikipedia.org/wiki/RSS_(file_format)" title="RSS"&gt;RSS&lt;/a&gt; add-on spec.&lt;/p&gt;
&lt;p&gt;So I've put together a hack of allowing for &lt;a href="http://www.wordpress.org/" title="WordPress"&gt;WordPress&lt;/a&gt; users to geocode their posts, as well as publish them as GeoRSS. This work is …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's exciting to see &lt;a href="http://www.georss.org/" title="GeoRSS"&gt;GeoRSS&lt;/a&gt; published as an official &lt;a href="http://www.georss.org/1/" title="1.0 specification"&gt;1.0 specification&lt;/a&gt; -- congratulations to the GeoRSS team in putting out this useful &lt;a href="http://en.wikipedia.org/wiki/RSS_(file_format)" title="RSS"&gt;RSS&lt;/a&gt; add-on spec.&lt;/p&gt;
&lt;p&gt;So I've put together a hack of allowing for &lt;a href="http://www.wordpress.org/" title="WordPress"&gt;WordPress&lt;/a&gt; users to geocode their posts, as well as publish them as GeoRSS. This work is based on the original &lt;a href="http://www.dronamraju.com/blog/2005/11/geopress-wordpress-plugin-for-tagging-your-posts-with-location-info.html" title="GeoPress"&gt;GeoPress&lt;/a&gt; work. The plugin also allows for setting what encoding of GeoRSS you want to publish (simple, gml, or w3cgeo). It's very simple (uses existing custom fields to define x/y tags, and existing WordPress hooks to extend to GeoRSS). The main blog post page also now adds a neat little WMS-based map.&lt;/p&gt;
&lt;p&gt;Other work: &lt;a href="http://www.edparsons.com/" title="Ed Parsons"&gt;Ed Parsons&lt;/a&gt; also developed his own &lt;a href="http://www.edparsons.com/?p=310" title="plugin"&gt;plugin&lt;/a&gt;. The GeoRSS folks also have an &lt;a href="http://www.georss.org/trac/trac.cgi/wiki/GeoPress" title="implementation"&gt;implementation&lt;/a&gt;. You can download &lt;a href="/blog/wp-content/plugins/georss/georss-0.2.tar.gz" title="my GeoRSS WordPress plugin hack"&gt;my GeoRSS WordPress plugin hack&lt;/a&gt; and give it a go if you wish, however I'd suggest going with GeoPress, which is what I'll be moving towards (as soon as I get whip up a script to port my coordinates into GeoPress).&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>FOSS4G2006 Day 4</title><link href="https://kralidis.ca/blog/blog/2006/09/15/foss4g2006-day-4/" rel="alternate"/><published>2006-09-15T07:40:00+00:00</published><updated>2006-09-15T07:40:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-09-15:/blog/blog/2006/09/15/foss4g2006-day-4/</id><summary type="html">&lt;p&gt;Nothing too much to report yet, other than everyone's pretty much homebound. I'm interested to see who will win the Sol Katz award, as well as the closing panel discussion.&lt;/p&gt;
&lt;p&gt;James Westervelt's closing plenary &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=214&amp;amp;sessionId=54&amp;amp;confId=1" title="presentation"&gt;presentation&lt;/a&gt; on &lt;a href="http://grass.itc.it/" title="GRASS"&gt;GRASS&lt;/a&gt; and views on FOSS was very interesting in discussing the history of the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Nothing too much to report yet, other than everyone's pretty much homebound. I'm interested to see who will win the Sol Katz award, as well as the closing panel discussion.&lt;/p&gt;
&lt;p&gt;James Westervelt's closing plenary &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=214&amp;amp;sessionId=54&amp;amp;confId=1" title="presentation"&gt;presentation&lt;/a&gt; on &lt;a href="http://grass.itc.it/" title="GRASS"&gt;GRASS&lt;/a&gt; and views on FOSS was very interesting in discussing the history of the GRASS project, what made it successful and the value of great, passionate people who thrive on sharing (code, projects, data, etc.).&lt;/p&gt;
&lt;p&gt;So now it's time for the Sol Katz award. The winner this year is &lt;a href="http://mpa.itc.it/markus/" title="Markus Neteler"&gt;Markus Neteler&lt;/a&gt;, who is a great choice, especially from his contributions to the GRASS community. Congratulations Markus!&lt;/p&gt;
&lt;p&gt;The panel discussion raised some interesting points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;open source geospatial technology is ever increasing across the community. Just as geographic information comprises 80% of all information, open source geospatial technologies must be &lt;span style="font-size: 12pt; font-family: Arial"&gt;ubiquitous&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;another key for open source geospatial is between integrating with mobile devices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In conclusion, our community and space has grown immensly. We can do things we only dreamed of in the past. Implementations of open source geospatial are everywhere: public service, military, many walks of industry. Location is huge. The barrier to entry is lessening.&lt;/p&gt;
&lt;p&gt;So, FOSS4G2006 is officially complete. A truly successful conference. Well planned, well executed, great presentations, workshops and discussions. Can't wait until next year!&lt;/p&gt;
&lt;p&gt;Well, as for me, I've got one more night in this town, and leaving tomorrow. It's time to go home.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>FOSS4G2006 Day 3</title><link href="https://kralidis.ca/blog/blog/2006/09/14/foss4g2006-day-3/" rel="alternate"/><published>2006-09-14T04:47:00+00:00</published><updated>2006-09-14T04:47:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-09-14:/blog/blog/2006/09/14/foss4g2006-day-3/</id><summary type="html">&lt;p&gt;&lt;img src="http://www.foss4g2006.org/site/gallery/albums/album05/DSCF0003.highlight.jpg" title="FOSS4G2006 Day 3" data-align="left" alt="FOSS4G2006 Day 3" /&gt;Today's &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=144&amp;amp;sessionId=38&amp;amp;confId=1" title="keynote"&gt;keynote&lt;/a&gt; was interesting in finding out about FOSS4G activities in Asia. Wow, there is and has been quite a bit happening in that region for years. I gave a &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=39&amp;amp;sessionId=16&amp;amp;confId=1" title="talk"&gt;talk&lt;/a&gt; on &lt;a href="http://www.environmentandresources.ca/reseau/" title="ResEau"&gt;ResEau&lt;/a&gt; this morning, which was well received.&lt;/p&gt;
&lt;p&gt;Sitting in &lt;a href="http://www.rajsingh.org/" title="Raj Singh"&gt;Raj Singh&lt;/a&gt;'s presentation on &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt;'s Lightweight Standards …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img src="http://www.foss4g2006.org/site/gallery/albums/album05/DSCF0003.highlight.jpg" title="FOSS4G2006 Day 3" data-align="left" alt="FOSS4G2006 Day 3" /&gt;Today's &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=144&amp;amp;sessionId=38&amp;amp;confId=1" title="keynote"&gt;keynote&lt;/a&gt; was interesting in finding out about FOSS4G activities in Asia. Wow, there is and has been quite a bit happening in that region for years. I gave a &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=39&amp;amp;sessionId=16&amp;amp;confId=1" title="talk"&gt;talk&lt;/a&gt; on &lt;a href="http://www.environmentandresources.ca/reseau/" title="ResEau"&gt;ResEau&lt;/a&gt; this morning, which was well received.&lt;/p&gt;
&lt;p&gt;Sitting in &lt;a href="http://www.rajsingh.org/" title="Raj Singh"&gt;Raj Singh&lt;/a&gt;'s presentation on &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt;'s Lightweight Standards Initiatives. Great to see their recognition of simple things like &lt;a href="http://www.georss.org/" title="GeoRSS"&gt;GeoRSS&lt;/a&gt;, tiled WMS and WFS basic, however the "not so simple" is just as important.&lt;/p&gt;
&lt;p&gt;Assefa, Bart and I gave the &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=16&amp;amp;sessionId=37&amp;amp;confId=1" title="OGC and Open Source presentation"&gt;OGC and Open Source presentation&lt;/a&gt;, which produced a little 'testbed' of open source packages supporting OGC and how they play with eachother. I'm looking forward to MapServer exhanced Filter spatial predicates now that geos is integrated.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.52north.org/" title="52 North"&gt;52 North&lt;/a&gt; did a great presentation on OGC SensorWeb and their supporting software. It will be great if/when their native data bindings increased in flexibility. They also mentioned the &lt;a href="http://www.sensorweb-alliance.org/" title="SensorWeb Alliance"&gt;SensorWeb Alliance&lt;/a&gt;, an international group on the use and advancement of SensorWeb.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=234&amp;amp;sessionId=70&amp;amp;confId=1" title="Catalog/Discovery BOF"&gt;Catalog/Discovery BOF&lt;/a&gt;: great intentions, no time. This went by quick and we started discussing various approaches. I'm worried about things getting too complicated. At the same time, this can't become too simple that we keep revisiting it in the future for modificiations to the model, etc. The most important part is the content model for data and services. As for protocol, I hope &lt;a href="http://geonetwork-opensource.org/" title="GeoNetwork OpenSource"&gt;GeoNetwork OpenSource&lt;/a&gt; will help with forthcoming &lt;a href="https://portal.opengeospatial.org/files/?artifact_id=8305" title="CSW ISO profile"&gt;CSW ISO profile&lt;/a&gt; support.&lt;/p&gt;
&lt;p&gt;The evening event was a beautiful &lt;a href="http://www.cgn.ch/" title="boat cruise"&gt;boat cruise&lt;/a&gt;, and visit / dinner at the &lt;a href="http://www.foss4g2006.org/internalPage.py?pageId=11&amp;amp;confId=1" title="Chateau de Chillon"&gt;Chateau de Chillon&lt;/a&gt;. The night concluded (for most people) with drinks and dancing at a local nightclub. Following that, a few of us decided to enjoy the scenery more so we stayed out all night. We were lucky that some places were opening up for breakfast, as we were hungry!&lt;/p&gt;
&lt;p&gt;Check out the photos (which will be posted soon) on &lt;a href="http://www.foss4g2006.org/site/gallery/index.php" title="FOSS4G2006"&gt;FOSS4G2006&lt;/a&gt;. Also, once we all get back and settled, I'll update this page with links of the fun night (everyone had a digital camera).&lt;/p&gt;
&lt;p&gt;Time for bed.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>FOSS4G2006 Day 2</title><link href="https://kralidis.ca/blog/blog/2006/09/13/foss4g2006-day-2/" rel="alternate"/><published>2006-09-13T06:34:00+00:00</published><updated>2006-09-13T06:34:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-09-13:/blog/blog/2006/09/13/foss4g2006-day-2/</id><summary type="html">&lt;p&gt;&lt;img src="http://www.foss4g2006.org/site/gallery/albums/OpeningPlenary/MG_5178.thumb.jpg" title="FOSS4G2006 Day 2" data-align="right" alt="FOSS4G2006 Day 2" /&gt;&lt;/p&gt;
&lt;p&gt;It's a good thing overall.&lt;/p&gt;
&lt;p&gt;Just sitting here at the lightning talks at the plenary session where &lt;a href="http://www.camptocamp.com/" title="camptocamp"&gt;camptocamp&lt;/a&gt; ran us through conference logistics. The conference is well organized and the &lt;a href="http://www.epfl.ch/" title="EPFL"&gt;EPFL&lt;/a&gt;/&lt;a href="http://www.unil.ch/" title="UNIL"&gt;UNIL&lt;/a&gt; campus is a great location.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://iconocla.st/" title="Schuyler's"&gt;Schuyler Erle's&lt;/a&gt; talk about "Neogeography" was interesting, and so true. Everyone is a …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img src="http://www.foss4g2006.org/site/gallery/albums/OpeningPlenary/MG_5178.thumb.jpg" title="FOSS4G2006 Day 2" data-align="right" alt="FOSS4G2006 Day 2" /&gt;&lt;/p&gt;
&lt;p&gt;It's a good thing overall.&lt;/p&gt;
&lt;p&gt;Just sitting here at the lightning talks at the plenary session where &lt;a href="http://www.camptocamp.com/" title="camptocamp"&gt;camptocamp&lt;/a&gt; ran us through conference logistics. The conference is well organized and the &lt;a href="http://www.epfl.ch/" title="EPFL"&gt;EPFL&lt;/a&gt;/&lt;a href="http://www.unil.ch/" title="UNIL"&gt;UNIL&lt;/a&gt; campus is a great location.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://iconocla.st/" title="Schuyler's"&gt;Schuyler Erle's&lt;/a&gt; talk about "Neogeography" was interesting, and so true. Everyone is a mapmaker now, with cheap GPS solutions, &lt;a href="http://maps.google.com/" title="Google Maps"&gt;Google maps&lt;/a&gt;, the Internet, etc. Schuyler also makes a good point about not taking things too seriously, and generally more maps (even if they're "wrong") is a good thing, even if they are not cartographically pristine, or insanely accurate.&lt;/p&gt;
&lt;p&gt;Steve's talk discussed what's new, how you can expose &lt;a href="http://geos.refractions.net/" title="geos"&gt;geos&lt;/a&gt; through &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; &lt;a href="http://mapserver.gis.umn.edu/docs/reference/mapscript" title="mapscript"&gt;mapscript&lt;/a&gt;, &lt;a href="http://docs.codehaus.org/display/GEOS" title="GeoServer"&gt;GeoServer&lt;/a&gt; now supports &lt;a href="http://earth.google.com/kml/" title="KML/KMZ"&gt;KML/KMZ&lt;/a&gt; output, and there's talk of a tiling WMS.&lt;/p&gt;
&lt;p&gt;Happy 10th birthday &lt;a href="http://geotools.codehaus.org/" title="GeoTools"&gt;GeoTools&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Also evident is the open source and business collaboration theme. Companies like &lt;a href="http://www.metacarta.com/" title="MetaCarta"&gt;MetaCarta&lt;/a&gt;, &lt;a href="http://www.autodesk.com/" title="Autodesk"&gt;Autodesk&lt;/a&gt;, and &lt;a href="http://www.orkney.co.jp/" title="Orkney"&gt;Orkney&lt;/a&gt; have become involved in our community and with open source geospatial. Add to that &lt;a href="http://www.dmsolutions.ca/" title="DM Solutions"&gt;DM Solutions&lt;/a&gt;' fresh announcement of a MapServer premium support plan, and you can say we are maturing.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://home.gdal.org/~warmerda/" title="Frank"&gt;Frank&lt;/a&gt; (&lt;a href="http://www.osgeo.org/" title="OSGEO"&gt;OSGEO&lt;/a&gt; President) spoke about a call to action for folks to contribute and get involved in the new foundation. OSGEO looks to have alot of momentum thus far.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.foss4g2006.org/site/gallery/albums/OpeningPlenary/DSCF0022.thumb.jpg" title="FOSS4G2006 Day 2" data-align="left" alt="FOSS4G2006 Day 2" /&gt;The feeling I get from today is that our community has grown, with some pains (like anything, really). In general, the barrier to entry is much lower. I'll be the first to admit that some things make me nervous (KML, supporting the web mapping API of the week, etc.), but overall we have come along a long way.&lt;/p&gt;
&lt;p&gt;So that's my report thus far today. Note that the entire conference (including slides, workshops, event photos and live video) is on the &lt;a href="http://www.foss4g2006.org/" title="conference website"&gt;conference website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gotta run, it's lunchtime and we're giving the &lt;a href="http://ms-ogc-workshop.maptools.org/" title="MapServer OGC Web Services Workshop"&gt;MapServer OGC Web Services Workshop&lt;/a&gt; this afternoon. So off to find bottles of water, check for showstoppers in the package and room setup. Stuff like that. Wish me luck!! I'll post again after the workshop.&lt;/p&gt;
&lt;p&gt;It's a good thing overall.&lt;/p&gt;
&lt;p&gt;Update: the MapServer OGC Web Services Workshop went well and was well received. Over 40 participants. Much interest in the new &lt;a href="http://mapserver.gis.umn.edu/docs/howto/wxs_mapscript" title="Mapscript WxS services"&gt;Mapscript WxS services&lt;/a&gt; scripting exposure.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>FOSS4G2006 Day 1</title><link href="https://kralidis.ca/blog/blog/2006/09/12/foss4g2006-day-1/" rel="alternate"/><published>2006-09-12T05:57:00+00:00</published><updated>2006-09-12T05:57:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-09-12:/blog/blog/2006/09/12/foss4g2006-day-1/</id><summary type="html">&lt;p&gt;(Update on luggage: they found it and hand delivered it to my room)&lt;/p&gt;
&lt;p&gt;Things are hopping here in Lausanne. The &lt;a href="http://www.foss4g2006.org/" title="conference"&gt;conference&lt;/a&gt; registration was today (and yesterday for early birds).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.foss4g2006.org/site/gallery/albums/album03/DSCF0019.thumb.jpg" title="FOSS4G2006 Day 1" data-align="left" alt="FOSS4G2006 Day 1" /&gt;The ice-breaker was last night at &lt;a href="http://www.tacos-bar.ch/" title="Taco's Bar"&gt;Taco's Bar&lt;/a&gt;, and was partly sponsored by &lt;a href="http://www.autodesk.com/" title="Autodesk"&gt;Autodesk&lt;/a&gt; (thanks!). It was great to see the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;(Update on luggage: they found it and hand delivered it to my room)&lt;/p&gt;
&lt;p&gt;Things are hopping here in Lausanne. The &lt;a href="http://www.foss4g2006.org/" title="conference"&gt;conference&lt;/a&gt; registration was today (and yesterday for early birds).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.foss4g2006.org/site/gallery/albums/album03/DSCF0019.thumb.jpg" title="FOSS4G2006 Day 1" data-align="left" alt="FOSS4G2006 Day 1" /&gt;The ice-breaker was last night at &lt;a href="http://www.tacos-bar.ch/" title="Taco's Bar"&gt;Taco's Bar&lt;/a&gt;, and was partly sponsored by &lt;a href="http://www.autodesk.com/" title="Autodesk"&gt;Autodesk&lt;/a&gt; (thanks!). It was great to see the people we constantly communicate with over email, irc, and the like. Some of us are paying for a late night this morning, so tonight may be a bit more quiet :)&lt;/p&gt;
&lt;p&gt;Conference workshops run today. I'm currently at the &lt;a href="http://geonetwork-opensource.org/" title="GeoNetwork"&gt;GeoNetwork&lt;/a&gt; &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=17&amp;amp;sessionId=64&amp;amp;confId=1" title="workshop"&gt;workshop&lt;/a&gt; and am finding it useful. Looks like a nice piece of software. Even more interesting will be when support for Cat2.0 CS-W is added, which is what I'm really looking forward to.&lt;img src="http://www.foss4g2006.org/site/gallery/albums/album01/DSCF0057.thumb.jpg" title="FOSS4G Day 1" data-align="right" alt="FOSS4G Day 1" /&gt; GeoNetwork will also support the &lt;a href="http://www.openarchives.org/" title="OAI"&gt;OAI&lt;/a&gt; interface. So all of this on top of an existing z39.50 interface, and we seem to have a repository which can interoperate on many specification levels. I'm looking forward to Jeroen's participation in our Catalog/Discovery &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=234&amp;amp;sessionId=70&amp;amp;confId=1" title="birds of a feather session"&gt;"birds of a feather" session&lt;/a&gt; on Thursday.&lt;/p&gt;
&lt;p&gt;Well, that's about it for now. Assefa and I are giving the &lt;a href="http://ms-ogc-workshop.maptools.org/" title="MapServer OGC Web Services Worskhop"&gt;MapServer OGC Web Services Workshop&lt;/a&gt; &lt;a href="http://www.foss4g2006.org/contributionDisplay.py?contribId=38&amp;amp;sessionId=60&amp;amp;confId=1" title="tomorrow"&gt;tomorrow&lt;/a&gt;, which I am looking forward to seeing new faces and participants who would like to implement &lt;a href="http://mapserver.gis.umn.edu/" title="MapServer"&gt;MapServer&lt;/a&gt; for standards-based data and services.&lt;/p&gt;
&lt;p&gt;More later, exercise 2 is starting :)&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>headed to Lausanne for FOSS4G</title><link href="https://kralidis.ca/blog/blog/2006/08/21/headed-to-lausanne-for-foss4g/" rel="alternate"/><published>2006-08-21T10:36:00+00:00</published><updated>2006-08-21T10:36:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-08-21:/blog/blog/2006/08/21/headed-to-lausanne-for-foss4g/</id><summary type="html">&lt;p&gt;Phew! I've finally been approved to attend this &lt;a href="http://www.foss4g2006.org/" title="FOSS4G2006"&gt;FOSS4G2006&lt;/a&gt;. Thank goodness. It will be fun to see the open source geo gang for a week of catching up, discussions, and setting the path forward.&lt;/p&gt;
&lt;p&gt;I'll be presenting use of foss4g in &lt;a href="http://www.environmentandresources.ca/reseau/" title="ResEau"&gt;ResEau&lt;/a&gt;, co-presenting "How good does open source talk &lt;a href="http://www.opengeospatial.org/" title="OpenGIS"&gt;OpenGIS …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Phew! I've finally been approved to attend this &lt;a href="http://www.foss4g2006.org/" title="FOSS4G2006"&gt;FOSS4G2006&lt;/a&gt;. Thank goodness. It will be fun to see the open source geo gang for a week of catching up, discussions, and setting the path forward.&lt;/p&gt;
&lt;p&gt;I'll be presenting use of foss4g in &lt;a href="http://www.environmentandresources.ca/reseau/" title="ResEau"&gt;ResEau&lt;/a&gt;, co-presenting "How good does open source talk &lt;a href="http://www.opengeospatial.org/" title="OpenGIS"&gt;OpenGIS&lt;/a&gt;?" with Bart van den Eijnden (Netherlands) and Yewondwossen Assefa (Canada), as well as giving the &lt;a href="http://devgeo.cciw.ca/ms_ogc_workshop/index.html" title="MapServer OGC Web Services Workshop"&gt;MapServer OGC Web Services Workshop&lt;/a&gt;, again with Assefa.&lt;/p&gt;
&lt;p&gt;Check back here when the conference is on, as I'll be blogging updates, thoughts, and maybe the odd story :)&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Canadian Water Portal in Lights</title><link href="https://kralidis.ca/blog/blog/2006/07/12/canadian-water-portal-in-lights/" rel="alternate"/><published>2006-07-12T12:08:00+00:00</published><updated>2006-07-12T12:08:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-07-12:/blog/blog/2006/07/12/canadian-water-portal-in-lights/</id><summary type="html">&lt;p&gt;I'm glad to say that &lt;a href="http://www.environmentandresources.ca/reseau/" title="RésEau"&gt;&lt;span class="article-articlebody"&gt;&lt;span class="article-articlebody"&gt;RésEau &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;has been featured as the &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt; &lt;a href="http://www.opengeospatial.org/pressroom/newsletters/200606/#C4" title="Website of the Month"&gt;Website of the Month&lt;/a&gt;, as well as featured as an &lt;a href="http://www.geospatial-online.com/geospatialsolutions/article/articleDetail.jsp?id=353688" title="article"&gt;article&lt;/a&gt; in Geospatial Solutions. I'm proud to have worked on this project with such talented people from many disciplines. It was also fun to get to do alot …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'm glad to say that &lt;a href="http://www.environmentandresources.ca/reseau/" title="RésEau"&gt;&lt;span class="article-articlebody"&gt;&lt;span class="article-articlebody"&gt;RésEau &lt;/span&gt;&lt;/span&gt;&lt;/a&gt;has been featured as the &lt;a href="http://www.opengeospatial.org/" title="OGC"&gt;OGC&lt;/a&gt; &lt;a href="http://www.opengeospatial.org/pressroom/newsletters/200606/#C4" title="Website of the Month"&gt;Website of the Month&lt;/a&gt;, as well as featured as an &lt;a href="http://www.geospatial-online.com/geospatialsolutions/article/articleDetail.jsp?id=353688" title="article"&gt;article&lt;/a&gt; in Geospatial Solutions. I'm proud to have worked on this project with such talented people from many disciplines. It was also fun to get to do alot of tinkering into new and innovative approaches to the dissemination of geospatial info, such as &lt;a href="http://www.georss.org/" title="GeoRSS"&gt;GeoRSS&lt;/a&gt; and &lt;a href="http://www.opengeospatial.org/functional/?page=swe" title="SensorWeb"&gt;SensorWeb&lt;/a&gt;. Kudos to all involved!&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry><entry><title>Canada and FOSS4G</title><link href="https://kralidis.ca/blog/blog/2006/06/09/canada-and-foss4g/" rel="alternate"/><published>2006-06-09T11:07:00+00:00</published><updated>2006-06-09T11:07:00+00:00</updated><author><name>tomkralidis</name></author><id>tag:kralidis.ca,2006-06-09:/blog/blog/2006/06/09/canada-and-foss4g/</id><summary type="html">&lt;p&gt;Check out this nice &lt;a href="http://www.directionsmag.com/article.php?article_id=2194&amp;amp;trv=1" title="writeup"&gt;writeup&lt;/a&gt; by &lt;a href="http://www.directionsmag.com/author.php?author_id=321" title="Kevin Flanders"&gt;Kevin Flanders&lt;/a&gt;. I think Kevin points out some of the numerous contributions by Canadians in geospatial open source. I also think it's fitting seeing that we're around the corner from &lt;a href="http://www.pch.gc.ca/progs/cpsc-ccsp/jfa-ha/canada_e.cfm" title="Canada Day"&gt;Canada Day&lt;/a&gt; :) Furthermore, this article represents how partnerships between industry and government can lead …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Check out this nice &lt;a href="http://www.directionsmag.com/article.php?article_id=2194&amp;amp;trv=1" title="writeup"&gt;writeup&lt;/a&gt; by &lt;a href="http://www.directionsmag.com/author.php?author_id=321" title="Kevin Flanders"&gt;Kevin Flanders&lt;/a&gt;. I think Kevin points out some of the numerous contributions by Canadians in geospatial open source. I also think it's fitting seeing that we're around the corner from &lt;a href="http://www.pch.gc.ca/progs/cpsc-ccsp/jfa-ha/canada_e.cfm" title="Canada Day"&gt;Canada Day&lt;/a&gt; :) Furthermore, this article represents how partnerships between industry and government can lead to development of Canadian expertise, as well as business opportunities as a result.&lt;/p&gt;</content><category term="geospatial, open source, technology, web"/></entry></feed>