Guides
How to start with geospatial analysis
Coordinate systems, geocoding, spatial joins, and the map design choices that mislead — the fundamentals before you pick a GIS tool.
Geospatial analysis fails less often on the analysis and more often on the setup: a coordinate mismatch that silently offsets every point, a join that matched the wrong polygon, or a map that is technically accurate and still misleads everyone who looks at it. Get the fundamentals right first, and most GIS tools will serve you well; skip them, and no tool will save you.
Coordinate systems: the mismatch that breaks everything
Every set of coordinates is measured against a reference system, and two files using different ones will not overlay correctly even though both look like valid latitude and longitude. The two you will meet constantly:
- WGS84 (EPSG:4326) — degrees of latitude and longitude, the default for GPS devices, web maps, and most public datasets. Good for storage and interchange, poor for measuring distance or area directly, because a degree of longitude covers a different real distance depending on latitude.
- A projected coordinate system (state plane, UTM, or a country-specific system) — measured in meters or feet on a flat plane, appropriate for calculating distance, area, or buffers accurately for a specific region.
The practical rule: store and exchange data in WGS84, but reproject into an appropriate local projected system before calculating any distance, area, or buffer. Skipping this step produces areas and distances that look reasonable and are wrong by a variable, hard-to-predict amount — the kind of error that survives review because nothing about the output looks obviously broken.
Geocoding: turning addresses into points
geocoding converts an address or place name into coordinates, and it is never 100% accurate. Before trusting geocoded data:
- Check the match quality or confidence score most geocoders return, and treat low-confidence matches (interpolated to a street segment rather than matched to an exact address point) differently from high-confidence ones.
- Watch for systematic gaps — new construction, rural addresses, and PO boxes geocode worse than established urban addresses, which can bias any analysis that silently drops unmatched records.
- Re-geocode periodically if you're joining to boundaries that get redrawn; an address geocoded once and never revisited can drift out of sync with current district or tract lines.
Spatial joins: matching by location, not by key
A spatial join matches records based on geographic relationship — point-in-polygon (which district contains this address), nearest-neighbor (what's the closest store), or intersection (which flood zones overlap this parcel) — rather than a shared ID column. The same principles as any join apply: check the join produced the row count you expected, and understand what happens to points that fall exactly on a boundary or outside every polygon in your reference layer, because both are silent failure modes that don't raise an error.
-- PostGIS: assign each customer point to the census tract that contains it
select
c.customer_id,
t.tract_geoid
from customers c
join census_tracts t
on st_contains(t.geom, c.geom);
-- customers matching no tract (bad geocode, outside coverage) are silently dropped
-- by an inner join here — use a left join and check for nulls if that matters Vector vs. raster
Vector data (points, lines, polygons — customer locations, roads, district boundaries) suits discrete features with clear edges. Raster data (a grid of cells, each holding a value — satellite imagery, elevation, temperature) suits continuous phenomena measured across a surface. Most real projects use both: a raster layer of, say, air quality, sampled at vector points where your customers or facilities are located.
Maps that mislead, and how to avoid it
A choropleth map shades geographic areas by a value, and it is one of the easiest chart types to make technically correct and still misleading:
- Normalize before you shade. A choropleth of raw counts by county mostly just shows population density — Los Angeles County looks alarming on almost any raw-count map simply because millions of people live there. Shade by a rate or per-capita figure instead, unless the raw count genuinely is the question.
- Large, sparsely populated areas dominate visually. A map is not weighted by the population living in each shape; a huge, empty county draws the eye the same as a small, dense city, regardless of how many people the underlying number actually represents.
- Bucket boundaries change the story. The same continuous data, binned into different class breaks, can make a trend look sharper or smoother than it is — try more than one binning method before settling on the one you publish.
- Boundary choice itself shapes the result. Aggregating the same underlying points into different-sized zones (tract vs. county, for instance) can change the apparent pattern even though nothing about the underlying data changed — a well-known instability in areal analysis, and a reason to sanity-check a finding at more than one geographic scale before trusting it.
A shortlist by situation
- You want a free desktop GIS with a large plugin ecosystem, no license cost: QGIS covers most vector and raster workflows a analyst needs, cross-platform.
- You want spatial analysis expressed directly as SQL, inside a database you already run: PostGIS extends PostgreSQL with spatial types, indexing, and hundreds of functions — no separate GIS application required for query-level analysis.
- Your data already lives in a cloud warehouse and you don't want to move it: CARTO runs spatial SQL directly against Snowflake, BigQuery, Redshift, or Databricks.
- You need the broadest, most established toolset — government, utility, or large enterprise GIS: Esri ArcGIS spans desktop, cloud, and self-hosted server deployment, with the largest extension ecosystem.
- You want to visually explore a large point or trip dataset without writing GIS code: kepler.gl renders large datasets in the browser with GPU-accelerated layers, free and open source.
- You're analyzing satellite imagery at scale — change detection, land cover, time series: Google Earth Engine combines a multi-petabyte imagery archive with cloud compute, free for research.
- You're embedding a custom map into your own product: Mapbox's SDKs and APIs are built for that, priced per API call.
Questions to ask before committing to a platform
- Does it handle both vector and raster natively, or is one a bolt-on?
- Can it run spatial joins and buffers on your actual data volume without exporting to a desktop tool first?
- What coordinate systems does it support natively, and does it reproject automatically or silently assume one?
- If you need to run a location-based experiment — a geo experiment comparing outcomes across matched regions — can the tool support defining and analyzing those test and control areas, or do you need a separate statistics step?
- Does pricing scale with data volume, API calls, or seats — and does that match how your usage will actually grow?
Common mistakes
- Calculating distance or area in an unprojected (degrees) coordinate system and not noticing the numbers are off.
- Treating geofencing radius or polygon boundaries as more precise than the underlying location data supports — consumer GPS and IP-based geolocation both carry real error margins.
- Publishing a raw-count choropleth of a metric that should have been normalized by population or area.
- Assuming a spatial join matched every record, without checking for points that fell outside every reference polygon.
For census and other government geographic data to combine with your own, see how to use census and government data. For every geospatial and location-analytics tool in the directory, see every tool in this category.