Robin's Blog
A remote-sensing PhD student talking about interesting things...
- Posts
- 251 from 11 Nov 2008 to 10 Sep 2026
- Posting
- monthly (9 in the last year)
- Kind
- personal blog
- Feed
- https://blog.rtwilson.com/feed/
2026 9
- New site for my John Snow Cholera Map data
- How to fix a weird pandas and pyarrow issue with BirdNetPi
- Some recent, and not so recent, talks and activities
- How to decorate a simple but effective child’s birthday cake
- How to bypass SSL for PROJ reprojection
- Pharmacy late-night opening hours analysis featured in the Financial Times
- How to fix osm2pgrouting error ‘relation “__waysXXXX” does not exist’ and speed up the import
- Today I Learned – in 2024 and 2025
- Favourite books I read in 2025
2025 4
2024 33
- The Feynman approach to small monetary compensation
- Join the GeoTAM hackathon to work out business turnovers!
- How to convert hex-encoded WKB geometries in PostGIS
- I won two British Cartographic Society awards!
- Searching an aerial photo with text queries – a demo and how it works
- Who reads my blog? Send me an email or comment if you do!
- A load of links…
- Accessing Planetary Computer STAC files in DuckDB
- Introducing offline_folium
- Introducing pyAURN – a Python package for accessing UK air quality data
- How to install the Python triangle package on an Apple Silicon Mac
- How to subscribe to releases on Github
- Some matplotlib tips – a reblog
- I was interviewed on a podcast!
- New Projects page on my website
- Simple segmentation of geospatial images
- What’s the largest building in Southampton? Find out with 5 lines of code
- Free GIS Data site update – all links now working!
- British Placename Mapper – follow-up and links to cool maps
- How to display images with custom paths relative to the project in QGIS Attribute Forms
- More book recommendations from 2020 onwards – Part 1
- Simple self-hosted OpenStreetMap routing using Valhalla and Docker
- Some easy recipes
- Explore UK place names on a map – my new web app
- My geospatial PDF talk at FOSS4G 2021
- Fixing SQL error ‘invalid reference to FROM-clause entry for table’
- One reason for getting a ‘No HTTP triggers found’ error when using Azure Functions with Python V2 programming model
- How to speed up appending to PostGIS tables with ogr2ogr
- How to create a Windows USB boot stick using Ventoy
- How to fix GeoPandas drop_duplicates on geometry column not getting rid of all duplicates?
- How to easily reload a QGIS layer
- How to create an x64 (Intel) conda environment on your Apple Silicon Mac (ARM) conda install
- How to get segment-geospatial working on Microsoft Planetary Computer
2023 6
- Upcoming talks: Cafe Sci Oxford & PyData Southampton
- Pandas-FSDR: a simple function for finding significant differences in pandas DataFrames
- How to get GeoParquet support in GDAL/OGR from conda-forge
- Travel times, over time
- Beach wheelchairs at Sandown, Isle of Wight and Barry, South Wales
- Karabiner Elements and Goku for custom keyboard shortcuts in MacOS
2021 1
2020 4
2019 16
- Creating an email service for my son’s childhood memories with Python
- Automatically downloading nursery photos from ParentZone using Selenium
- Using SQLAlchemy to access MySQL without frustrating library installation issues
- A couple of handy zsh/bash functions for Python programmers
- Easily specifying colours from the default colour cycle in matplotlib
- Markdown in WordPress – and writing blog posts is fun again
- Five new-ish Python things – Part 1
- Setting limits for a choropleth layer manually with leaflet-choropleth
- Automatically generating a legend for a choropleth layer in Leaflet
- Easily hiding items from the legend in matplotlib
- Calculating Rayleigh Reflectance using Py6S
- Automatically annotating a boxplot in matplotlib
- Matplotlib titles have configurable locations – and you can have more than one at once!
- I am now a freelancer in Remote Sensing, GIS, Data Science & Python
- Less than a week left to bid for a day’s work from me
- Bid for a day’s work from me
2018 15
- I give talks – on science, programming and more
- Mismatch between 6S atmospheric correction results & those from coefficients
- PyCon UK 2018: My thoughts – including childcare review
- PyCon UK 2018: My talk on xarray
- Automatic PDF calendar generation with pcal
- Assumptions in Remote Sensing
- BankClassify: simple automatic classification of bank statement entries
- Android + OpenCV = Confusion…
- Cloud frequency map for Europe & update to cloud frequency web app
- Attending EGU in a wheelchair
- Blogroll
- Some recent papers of mine
- Roadside leafiness from space – Part 2
- Roadside leafiness from space – Part 1
- Quick way to delete columns from a shapefile
2016 29
- Regression in Python using R-style formula – it’s easy!
- Reminder about cross-platform case-sensitivity differences
- ‘Got multiple values for argument’ error with keyword arguments in Python classes
- Showing code changes when teaching
- Reading AERONET data in Pandas: a simple helper function
- Conda revisions: letting you ‘rollback’ to a previous version of your environment
- Data sources for parameterising Radiative Transfer Models & atmospheric correction algorithms
- Non-traditional references to my work – and why they’re important
- Resources for learning Python for Remote Sensing – or switching from IDL
- Software Sustainability in Remote Sensing
- I’m an academic in a wheelchair – why is it so difficult?
- How to: speed up viewing Samba network shares in OS X
- How to: rescue lost code from a Jupyter/IPython notebook
- Previously Unpublicised Code: RPiNDVI
- My thesis writing timeline – analysed using Dropbox and Python
- How to: Set the Python executable used to run .py files from the command-line on Windows
- How to: Get Sublime Text style editing in the IPython/Jupyter notebook
- Ten Little IDL programs in Python
- Programming link clearance 2015: Python edition
- How to: Get Python packages which need a C compiler installed easily on Windows
- Job: Research Assistant with Python & Remote Sensing/Image Processing experience
- Hacking the Worcester Wave thermostat in Python – Part 3
- How to: add simple new commands to LaTeX to help with writing papers
- Hacking the Worcester Wave thermostat in Python – Part 2
- Hacking the Worcester Wave thermostat in Python – Part 1
- My MSc project: a simple ray-tracing radiative transfer model (with code!)
- Deprecating AutoZotBib
- Behind the paper: Are visibility-derived AOT estimates suitable for parameterising satellite data atmospheric correction algorithms?
- Previously Unpublicised Code: PyMicrotops
2015 24
- My 2015 Python life
- My top 5 ‘new’ Python modules of 2015
- An easy way to install Jupyter Notebook extensions
- Convolution in python – which function to use?
- Previously Unpublicised Code: manifestoclouds
- Bokeh plots with DataFrame-based tooltips
- Scientific software metrics with Depsy – a great new tool!
- Calculating percentiles in Python – use numpy not scipy!
- van Heuklon ozone model now available on PyPI and conda
- Happy 7th Birthday Blog!
- Orthogonal Distance Regression in Python
- Previously Unpublicised Code: RTWIDL
- Blue Marble: From Apollo 17 to DSCOVR, an EPIC journey
- Two great IPython extensions
- How to: get nice vector graphics in your exported PDF ipython notebooks
- Introducing recipy: effortless provenance tracking with Python
- How I became Dr Robin Wilson: Part 2
- Interactive cloud frequency web map, with Google Earth Engine
- How I became Dr Robin Wilson: Part 1
- How to: load the Google Maps Places library through Google API Loader
- IPython tips, tricks & notes – Part 1
- How to: Log electricity usage from a CurrentCost EnviR – Part 2
- How to: Log electricity usage from a CurrentCost EnviR – Part 1
- Note: Mounting over an existing directory ‘hides’ the files
2014 20
- Review: High Performance Python by Gorelick and Ozsvald
- Behind the paper: Spatial variability of the atmosphere over southern England, and its effects on scene-based atmospheric corrections
- What’s new in Py6S
- How to: Fix weird ENVI startup file issues
- Simple parameter files for Python class-based algorithms
- How to: Find out what modules a Python script requires
- How to: Solve GDAL error ‘An error occurred while writing a dirty block’
- How effective is my research programming workflow? The Philip Test – Part 4
- How to: Create a Landsat Metadata database, so you can select images by various criteria
- How effective is my research programming workflow? The Philip Test – Part 3
- Software choices in remote sensing
- How effective is my research programming workflow? The Philip Test – Part 2
- How to: Fix ‘WARNING: terminal is not fully functional’ error on Windows with Cygwin/Msysgit
- Review: Rackspace Cloud (+ free open-source project hosting)
- How effective is my research programming workflow? The Philip Test – Part 1
- How to: Convert OSM waypoints defining polygons into Shapefile
- How to: Fix Flask WSGI webapp hanging when importing a module (such as numpy or matplotlib)
- Py6S now has Continuous Integration & better tests
- New Py6S and RTWTools websites
- How to batch export PDFs to other filetypes in Adobe Acrobat
2013 16
- The benefits of an academic website
- You’ve done your literature review – what about a data review as well?
- Configuring legends in ArcGIS – a (slightly) less horrible way to do it
- Encouraging citation of software – introducing CITATION files
- Beware: Latitude/Longitude co-ordinates in ENVI may not be in WGS-84
- van Heuklon Ozone model implementation in Python
- Please specify a license for your software (and even your code samples!)
- A simple way to improve sustainability, reproducibility and releasability of your code and data
- Review: Programming ArcGIS 10.1 with Python Cookbook
- John Snow’s Cholera data in more formats
- Resources for Sustainable Software and Reproducible Research in Remote Sensing presentation
- Converting latitude/longitude co-ordinates to Landsat WRS-2 paths/rows
- Can I atmospherically-correct my images with Py6S?
- Py6S: Run a radiative transfer model with a user-defined input spectrum
- My first academic paper – on Py6S
- Major update to Free GIS Data site
2012 11
- Review: Code – The Hidden Language of Computer Hardware and Software by Charles Petzold
- Validating the validation?
- Updated Snow GIS data
- I signed the Science Code Manifesto – and you should too!
- In praise of ProjectTemplate for reproducible research
- Announcing bib2coins – convert BibTeX files to COINS metadata
- How to: Make your Sphinx documentation compile with ReadTheDocs when you’re using Numpy and Scipy
- How to: Set raster values to NoData easily in ArcGIS 10
- Announcing DateRangeParser: Parse strings like “27th-29th June 2010”
- Producing polar contour plots with matplotlib
- John Snow’s famous cholera analysis data in modern GIS formats
2011 45
- How to: Solve the ‘Ctrl-Space (auto-complete) not working’ problem in Eclipse
- How to choose a co-ordinate transformation in ArcGIS
- Free Julian Day calendar poster download
- Please use sensible colours in your maps
- Interesting Remote Sensing Applications #1: Estimating shop profits from space
- Standard test images for Remote Sensing
- Rules of thumb in Remote Sensing
- Fun with the OS Gazetteer
- Thoughts on academic conferences, or “Conferences aren’t lectures!”
- Get more detailed messages for maths errors in IDL
- The new iPython is awesome!
- Reading data from instruments via RS-232 simply in Linux
- How to: Fix a network printer suddenly showing as offline in Windows Vista, 7 or 8
- Essential OS X software #1 – Mail Attachment Reminder Plugin
- Using PyDev with with the Enthought Python Distribution
- Categorised list of Free GIS Datasets
- Why I hate my Toshiba laptop
- Review: Dreamhost web hosting
- Alfred – the new Quicksilver?
- My programming journey
- An ode to PDFs (and PDFs as a first class filetype)
- Review: Asonic External USB 2.0 8 Channel Sound Card
- The best debugger is a good compiler
- How to: Consolidate your internet presence
- Review: Machine Learning: An Algorithmic Perspective by Stephen Marsland
- Finally – a way to move an ArcGIS map to another computer without breaking it
- Programming << Pointers << Parallel Programming
- Review: Matplotlib for Python Developers by Sandro Tosi
- My LaTeX preamble
- Amazing software you haven’t heard of
- Git helps me get round to using source control
- Want to write some code? Get away from your computer!
- How to: Set up a simple service to run in the background on a Linux machine (using daemontools)
- Review: R Graphs Cookbook by Hrishi Mittal
- My new bookcase – arranged by the XKCD ‘Purity’ comic
- Review: Python Geospatial Development by Erik Westra
- How to: Fix ArcGIS 9.3 Licensing Error 96,7 – Valid name, but no record
- Review: The Geek Atlas by John Graham-Cumming
- My favourite OS X software
- Git + DTerm = Great Source Control in OS X
- Review: R in a Nutshell by Joseph Adler
- Small Notes from a French Country
- How to: Reset the Software Update URL in OS X
- Reproducible Research: Why it’s great, and why I’ll do it
- Review: Statistical Analysis with R: Beginner’s Guide by John M. Quick
2010 16
- Coughs on a train
- My 3 favourite things about my MacBook Pro
- Lessons learnt from: My dissertation
- How to: Fix problem where EndNote only shows the EndNote Web toolbar in Word
- Review: A Thousand Years of Nonlinear History by Manuel De Landa
- Review: Image Analysis, Classification and Change Detection in Remote Sensing (with algorithms for ENVI/IDL) by M. J. Canty
- Finally…a nice way to download satellite images!
- Leaky abstractions in science
- Default deny: A signal of academic maturity?
- Producing grids of plots in R with ggplot2: A journey of discovery
- How to: Fix sudden VPN problem in Vista
- How to: Find closest objects in ArcGIS with Python
- Aeolian Philosophy or “What is a sand dune?”
- My academic values
- How to: Snap points to lines in ArcGIS with Python
- Art: in other words?