How to visualize millions of parcels on a map – WALKER DATA
If you follow me on any of my social media channels you’ve likely seen some of my “mapping millions of data points” posts. A few of these examples have covered statewide parcel data. In the industries where I consult - energy/land and real estate - parcel data is immensely valuable for understanding land ownership, right-of-way, valuation, and more. There are a tons of challenges in working with parcel data, however. High-quality parcel data can be expensive or difficult to access - and even if you get it, you’re dealing with huge files that are challenging to visualize and explore.
In this post, I’ll show you how I do it.
Getting parcel data for Texas
The public availability of parcel GIS data differs widely by state and by county. Some states, like Texas and Florida, consolidate and distribute parcel data from counties at the state level and make state-wide datasets available. Texas is a great example to work with, as the Texas Geographic Information Office makes a 2025 statewide parcel dataset available for bulk download. 253 of the state’s 254 counties are represented; only Donley County is missing.
You can download the data directly from this link. It’s about 2.6 GB zipped.
Unzipping gets us an Esri file geodatabase a little over 7 GB in size. This is a hefty spatial dataset to work with, and file geodatabases are typically meant for use with commercial GIS software. If that’s not available to you, you’ll want to use tools for free and file formats that are more transparent. I’ll be using R and DuckDB via the duckspatial package; let’s get set up.
With duckspatial, we can use DuckDB’s spatial extension to read in our 7 GB file geodatabase lazily and inspect the data quickly.
library(duckspatial)<br>library(tidyverse)
parcels ddbs_open_dataset("~/Downloads/stratmap25-landparcels_48.gdb")
parcels |><br>head(5) |><br>collect() |><br>glimpse()
Rows: 5<br>Columns: 38<br>$ OBJECTID 1, 2, 3, 4, 5<br>$ Prop_ID "102191", "102192", "102193", "102197", "102199"<br>$ GEO_ID "102050151", "102050152", "102050153", "102050201", "102…<br>$ OWNER_NAME "NORTH STREET DESIGN BUILD LLC", "CRUZ-FUENTES DANNY & B…<br>$ NAME_CARE " ", " ", " ", " ", " "<br>$ LEGAL_AREA " ", " ", " ", " ", " "<br>$ LGL_AREA_UNIT "Acres", "Acres", "Acres", "Acres", "Acres"<br>$ GIS_AREA "1.62655101", "1.63662944", "1.62956035", "2.45617199", …<br>$ GIS_AREA_UNIT "Acres", "Acres", "Acres", "Acres", "Acres"<br>$ LEGAL_DESC " LOT 6 BLK E SOUTH LUND SOUTH", " LOT 5 BLK E SOUTH LUN…<br>$ STAT_LAND_USE " ", " ", " ", " ", " "<br>$ LOC_LAND_USE " ", " ", " ", " ", " "<br>$ LAND_VALUE "0", "0", "0", "0", "0"<br>$ IMP_VALUE "0", "0", "0", "0", "0"<br>$ MKT_VALUE "90541", "75776", "65866", "308229", "143000"<br>$ SITUS_ADDR " , TX 78704", " , TX 78704", " , TX 78704", " , TX 7870…<br>$ SITUS_NUM " ", " ", " ", " ", " "<br>$ SITUS_STRE " ", " ", " ", " ", " "<br>$ SITUS_ST_1 "ASHBY", "ASHBY", "ASHBY", "TREADWELL", "TREADWELL"<br>$ SITUS_ST_2 "AVE", "AVE", "AVE", "ST", "ST"<br>$ SITUS_CITY " ", " ", " ", " ", " "<br>$ SITUS_STAT "TX", "TX", "TX", "TX", "TX"<br>$ SITUS_ZIP "78704", "78704", "78704", "78704", "78704"<br>$ MAIL_ADDR "5303 AVENUE G BLDG 2, AUSTIN, TX 78751", "1815 ASHBY AV…<br>$ MAIL_LINE1 "5303 AVENUE G BLDG 2", "1815 ASHBY AVE", "289 FUNF KIND…<br>$ MAIL_LINE2 " ", " ", " ", " ", " "<br>$ MAIL_CITY "AUSTIN", "AUSTIN", "FREDERICKSBURG", "AUSTIN", "AUSTIN"<br>$ MAIL_STAT "TX", "TX", "TX", "TX", "TX"<br>$ MAIL_ZIP "78751", "78704", "78624", "78704", "78704"<br>$ SOURCE "TRAVIS APPRAISAL DISTRICT", "TRAVIS APPRAISAL DISTRICT"…<br>$ DATE_ACQ "20250801", "20250801", "20250801", "20250801", "2025080…<br>$ FIPS "48453", "48453", "48453", "48453", "48453"<br>$ COUNTY "TRAVIS", "TRAVIS", "TRAVIS", "TRAVIS", "TRAVIS"<br>$ TAX_YEAR "2025", "2025", "2025", "2025", "2025"<br>$ YEAR_BUILT " ", " ", " ", " ", " "<br>$ SHAPE_Length 117.4089, 117.7056, 117.5087, 140.8034, 145.2329<br>$ SHAPE_Area 822.2100, 827.3063, 823.7297, 1241.6671, 1232.1314<br>$ SHAPE MULTIPOLYGON (((-10883719 3..., MULTIPOLYGON (((-1088371…
There are 38 columns in the dataset that TxGIO has standardized across Texas’s counties. Our first few rows are from Travis County (Austin); we can see that some of the columns are populated, but others are not (e.g. year built is missing for these records), so we aren’t likely to have complete coverage for each column across the state.
While DuckDB can read from a file geodatabase directly, let’s get our parcel data into a DuckDB database before proceeding any further.
ddbs_write_dataset(parcels, "~/data/tx_parcels.duckdb", layer = "tx_parcels")
Preparing parcel data for visualization
For a normal spatial dataset, we’d likely spin up a quick interactive map in R to explore our data. In my mapgl package, the mapboxgl_view() and maplibre_view() functions are great for this purpose. For a 14.3 million row, multi-gigabyte dataset, this simply won’t work, as it’ll overload your web browser (or possibly even your GIS software) quickly.
Aside from the size issue, there are several other challenges we’ll...