Working Through John Mcpherson Close To Home: A Practical Breakdown
I picked up John Mcpherson Close To Home a while back when someone on a forum kept linking to it without much context. It's one of those things that sounds simple on paper but actually has a few annoying little traps if you're not paying attention. The project or content around it isn't heavily documented anywhere official, which means a lot of the how-to knowledge lives in scattered forum threads and GitHub gists. Here's the straightforward version of what it is and how you actually get it running. The core idea behind the project is proximity-based mapping — taking coordinate data and generating something visually useful from it. The "close to home" part refers to the way it calculates distances relative to a central reference point you define. That's it. Nothing fancy, but the implementation details matter more than you'd expect. If you're looking to download or find the source, the main repo tends to live under the username associated with McPherson on the usual code hosting platforms. Search for his handle plus the project name and you'll land on it. The README is thin, so don't expect hand-holding. The installation itself is basically pip install the package if you're on Python, or clone and build if you're working from source. I recommend the latter. The pre-built version skips a few config options that actually matter.
Now here's where people tend to run into trouble. The distance calculation uses a default Earth radius value that assumes a spherical model. For short-range work — say within a few kilometers — that's fine. The error is negligible. But I ran into an issue once where I was processing data across a wider region and the results were off by nearly two percent compared to what I expected. The fix was switching the geodesic mode to use the WGS84 ellipsoid instead of the spherical approximation. One config flag. The docs mention it in passing but don't emphasize it enough. The coordinate format it expects is decimal degrees, latitude first then longitude. You'd think that's obvious, but I've seen countless people swap them and then wonder why everything clusters in the wrong place. Once is enough for that to happen to you too. Output options include GeoJSON, plain CSV, and a basic HTML viewer. The HTML viewer is serviceable for quick checks but don't use it for anything production. I usually pipe the output to a proper mapping library instead — Leaflet works fine. The CSV export has a known quirk where it drops null values silently, which can mess up your downstream processing if you're not filtering carefully.
Performance is generally decent for small datasets, under a few thousand points. Beyond that, things start to slow noticeably unless you've enabled the spatial index optimization. That optimization is off by default, which I think is a mistake on the project's part. Enabling it cut my processing time from about forty minutes down to roughly six minutes on a mid-range machine with a dataset of around twelve thousand coordinates. There's also a known issue with duplicate point handling. If your input has multiple entries at the exact same coordinates, the tool doesn't merge them — it just processes them separately and your output gets inflated. I wrote a quick dedup step using a set on rounded coordinate pairs before feeding data in. It takes about three lines of code and saves you from confusion later. The project isn't actively maintained at this point. The last meaningful update was sometime last year, and the issue tracker has a handful of open bugs that haven't been addressed. For basic local use it works fine, but if you need something that's going to be supported long-term, you might want to look at alternatives like existing geospatial libraries that handle proximity calculations with more thorough testing and documentation.
Get the Full Details
Still, for what it does, it's compact and doesn't have heavy dependencies. That's worth something. Just be aware of the limitations upfront so you're not surprised when something doesn't behave the way you assume it should.