State Planner

Tennessee · October 22, 2026

Population Change by City and Town, 2010–2025

This is a real answer State Planner produced from Tennessee’s public data.

Start for free to ask your own version of this question, or anything else about your state.

Start for free →
  1. Which Tennessee cities and towns grew fastest since 2010, and which lost people? List the top 25 and map every place by percent change.


    Population change in Tennessee's incorporated cities and towns, July 2010 to July 2025

    I used the Census Bureau's population estimates for 2010 (the revised 2010–2019 series) and 2025 (the current Vintage 2025 release). 345 incorporated places have a figure in both years. Of those, 228 grew and 117 lost people. Census-designated places, which have no local government, have no estimates and aren't included. A few towns incorporated after 2010 have no 2010 figure and are left out too.

    Population Change by City and Town, 2010–2025Population Change by City and Town, 2010–2025⬇ Image

    How to read the map: each city or town outline is colored by its percent change. Dark green means it grew 50% or more, then 25–50%, 10–25%, and the palest green 0–10%. Orange means a loss of 0–5% or 5–10%, and dark red a loss of more than 10%. Click a place to see its 2010 and 2025 populations. The fastest growth is in a ring of suburbs around Nashville, in Williamson, Rutherford, Wilson, Sumner and Maury counties. Most of the losses are in small West Tennessee towns.

    25 fastest-growing places, 2010–2025 (all sizes)

    #Place20102025Change%
    1Thompson's Station town2,2219,469+7,248+326.3%
    2Berry Hill city5761,864+1,288+223.6%
    3Nolensville town6,06515,789+9,724+160.3%
    4Spring Hill city29,41961,336+31,917+108.5%
    5Lebanon city26,34753,412+27,065+102.7%
    6Piperton city1,4532,889+1,436+98.8%
    7Rossville town6661,215+549+82.4%
    8Mount Juliet city25,01745,172+20,155+80.6%
    9Gallatin city30,52554,590+24,065+78.8%
    10White House city10,28917,872+7,583+73.7%
    11Oakland town6,65310,835+4,182+62.9%
    12Alcoa city8,43013,689+5,259+62.4%
    13Medina city3,6245,813+2,189+60.4%
    14Hartsville/Trousdale County7,87412,623+4,749+60.3%
    15Baxter town1,3612,128+767+56.4%
    16Vanleer town390609+219+56.2%
    17Murfreesboro city109,631171,178+61,547+56.1%
    18Smyrna town40,59663,321+22,725+56.0%
    19Eagleville city625964+339+54.2%
    20Townsend city422640+218+51.7%
    21Lenoir City city8,60212,530+3,928+45.7%
    22Columbia city34,73750,072+15,335+44.1%
    23Franklin city62,79690,226+27,430+43.7%
    24Charleston city651923+272+41.8%
    25Clarksville city133,634188,829+55,195+41.3%

    25 places with the largest percent loss, 2010–2025

    #Place20102025Change%
    1Crump city1,493946−547−36.6%
    2Cumberland Gap town489312−177−36.2%
    3Toone town369264−105−28.5%
    4Cottage Grove town8966−23−25.8%
    5Tiptonville town4,4763,333−1,143−25.5%
    6Rives town326244−82−25.2%
    7Orme town11185−26−23.4%
    8Gallaway city670520−150−22.4%
    9Hickory Valley town10380−23−22.3%
    10Normandy town135109−26−19.3%
    11Saltillo town535441−94−17.6%
    12Parrottsville town276228−48−17.4%
    13Yorkville city270228−42−15.6%
    14Trimble town630533−97−15.4%
    15Williston city399338−61−15.3%
    16Mason town1,5831,342−241−15.2%
    17Bell Buckle town493419−74−15.0%
    18La Grange town142121−21−14.8%
    19Obion town1,124958−166−14.8%
    20Palmer town684584−100−14.6%
    21Viola town130111−19−14.6%
    22McLemoresville town347301−46−13.3%
    23Clifton city2,6922,344−348−12.9%
    24Burlison town419368−51−12.2%
    25Woodland Mills city379334−45−11.9%

    Other ways to look at it:

    • Largest gains in people: Nashville-Davidson (the part outside its smaller cities) gained 115,976 (+19.2%). Next came Murfreesboro (+61,547), Clarksville (+55,195), Spring Hill (+31,917), Franklin (+27,430) and Lebanon (+27,065). Knoxville (+13.3%) and Chattanooga (+13.9%) each gained about 23,700.
    • Losses among places of 2,500 or more people in 2010: Tiptonville (−25.5%), Clifton (−12.9%), Ripley (−10.6%), Brownsville (−10.2%), Belle Meade (−9.6%), Humboldt and Forest Hills (−7.4% each), Dyersburg (−7.1%), Gatlinburg (−6.7%) and Memphis (−6.5%). Memphis's −42,272 was the largest loss in people.

    Caveats:

    • These are estimates, not census counts, and the 2010 and 2025 figures come from two different estimate series.
    • In very small towns a handful of people can swing the percentage a lot. Cottage Grove, for example, went from 89 to 66.
    • Some growth may be land rather than new residents, because city limits move with annexation.

    If you'd like, I can rerun this with a minimum population, measure from the 2010 census count instead of the July estimate, or show only 2020–2025.

Layers

  • …
    • …
    • …
    • …
    • …
    • …
    • …
    • …

Click anything on the map for its details.

The transcript below the answer shows every query it ran. Shapefiles of every layer, at full detail, can be downloaded in State Planner: sign up to ask your own question and export any map.

Ask your own question about Tennessee

Send takes you to a free sign-up, no card needed, or to sign in if you have an account. Your question will be waiting in your new chat.

Transcript

What follows is the transcript of this chat as State Planner generated it. It is here to show how the answer above was arrived at: every query State Planner ran, what each one returned, and where the data came from.

transcript.md

↑ Contents

State Planner chat · https://stateplanner.com

  • State: Tennessee (TN)
  • Started: October 22, 2026, 12:37 AM UTC
  • Runtime: 46 sec
  • Status: completed
Prompt

Which Tennessee cities and towns grew fastest since 2010, and which lost people? List the top 25 and map every place by percent change.

Model: Anthropic: Claude Opus 5.5 (anthropic/claude-opus-5.5, via openrouter)

Response

Population change in Tennessee's incorporated cities and towns, July 2010 to July 2025

I used the Census Bureau's population estimates for 2010 (the revised 2010–2019 series) and 2025 (the current Vintage 2025 release). 345 incorporated places have a figure in both years. Of those, 228 grew and 117 lost people. Census-designated places, which have no local government, have no estimates and aren't included. A few towns incorporated after 2010 have no 2010 figure and are left out too.

Population Change by City and Town, 2010–2025

How to read the map: each city or town outline is colored by its percent change. Dark green means it grew 50% or more, then 25–50%, 10–25%, and the palest green 0–10%. Orange means a loss of 0–5% or 5–10%, and dark red a loss of more than 10%. Click a place to see its 2010 and 2025 populations. The fastest growth is in a ring of suburbs around Nashville, in Williamson, Rutherford, Wilson, Sumner and Maury counties. Most of the losses are in small West Tennessee towns.

25 fastest-growing places, 2010–2025 (all sizes)

#Place20102025Change%
1Thompson's Station town2,2219,469+7,248+326.3%
2Berry Hill city5761,864+1,288+223.6%
3Nolensville town6,06515,789+9,724+160.3%
4Spring Hill city29,41961,336+31,917+108.5%
5Lebanon city26,34753,412+27,065+102.7%
6Piperton city1,4532,889+1,436+98.8%
7Rossville town6661,215+549+82.4%
8Mount Juliet city25,01745,172+20,155+80.6%
9Gallatin city30,52554,590+24,065+78.8%
10White House city10,28917,872+7,583+73.7%
11Oakland town6,65310,835+4,182+62.9%
12Alcoa city8,43013,689+5,259+62.4%
13Medina city3,6245,813+2,189+60.4%
14Hartsville/Trousdale County7,87412,623+4,749+60.3%
15Baxter town1,3612,128+767+56.4%
16Vanleer town390609+219+56.2%
17Murfreesboro city109,631171,178+61,547+56.1%
18Smyrna town40,59663,321+22,725+56.0%
19Eagleville city625964+339+54.2%
20Townsend city422640+218+51.7%
21Lenoir City city8,60212,530+3,928+45.7%
22Columbia city34,73750,072+15,335+44.1%
23Franklin city62,79690,226+27,430+43.7%
24Charleston city651923+272+41.8%
25Clarksville city133,634188,829+55,195+41.3%

25 places with the largest percent loss, 2010–2025

#Place20102025Change%
1Crump city1,493946−547−36.6%
2Cumberland Gap town489312−177−36.2%
3Toone town369264−105−28.5%
4Cottage Grove town8966−23−25.8%
5Tiptonville town4,4763,333−1,143−25.5%
6Rives town326244−82−25.2%
7Orme town11185−26−23.4%
8Gallaway city670520−150−22.4%
9Hickory Valley town10380−23−22.3%
10Normandy town135109−26−19.3%
11Saltillo town535441−94−17.6%
12Parrottsville town276228−48−17.4%
13Yorkville city270228−42−15.6%
14Trimble town630533−97−15.4%
15Williston city399338−61−15.3%
16Mason town1,5831,342−241−15.2%
17Bell Buckle town493419−74−15.0%
18La Grange town142121−21−14.8%
19Obion town1,124958−166−14.8%
20Palmer town684584−100−14.6%
21Viola town130111−19−14.6%
22McLemoresville town347301−46−13.3%
23Clifton city2,6922,344−348−12.9%
24Burlison town419368−51−12.2%
25Woodland Mills city379334−45−11.9%

Other ways to look at it:

  • Largest gains in people: Nashville-Davidson (the part outside its smaller cities) gained 115,976 (+19.2%). Next came Murfreesboro (+61,547), Clarksville (+55,195), Spring Hill (+31,917), Franklin (+27,430) and Lebanon (+27,065). Knoxville (+13.3%) and Chattanooga (+13.9%) each gained about 23,700.
  • Losses among places of 2,500 or more people in 2010: Tiptonville (−25.5%), Clifton (−12.9%), Ripley (−10.6%), Brownsville (−10.2%), Belle Meade (−9.6%), Humboldt and Forest Hills (−7.4% each), Dyersburg (−7.1%), Gatlinburg (−6.7%) and Memphis (−6.5%). Memphis's −42,272 was the largest loss in people.

Caveats:

  • These are estimates, not census counts, and the 2010 and 2025 figures come from two different estimate series.
  • In very small towns a handful of people can swing the percentage a lot. Cottage Grove, for example, went from 89 to 66.
  • Some growth may be land rather than new residents, because city limits move with annexation.

If you'd like, I can rerun this with a minimum population, measure from the 2010 census count instead of the July estimate, or show only 2020–2025.

JavaScript

status: ok purpose: Compute 2010–2025 change for every place and rank.

Code
let rows=[];let r;while((r=next('p'))!==null){r.pct=r.p10>0?(r.p25-r.p10)/r.p10*100:null;rows.push(r);}
let v=rows.filter(x=>x.pct!==null);
v.sort((a,b)=>b.pct-a.pct);
let big=v.filter(x=>x.p10>=2500);
let f=x=>({name:x.name,p10:x.p10,p25:x.p25,chg:x.p25-x.p10,pct:+x.pct.toFixed(1)});
let numChg=[...v].sort((a,b)=>(b.p25-b.p10)-(a.p25-a.p10));
result={n:rows.length,nogeom:rows.filter(x=>!x.has_geom).map(x=>x.name),zero:rows.filter(x=>x.pct===null).map(x=>x.name),
grew:v.filter(x=>x.pct>0).length,lost:v.filter(x=>x.pct<0).length,flat:v.filter(x=>x.pct===0).length,
topAll:v.slice(0,25).map(f),botAll:v.slice(-25).reverse().map(f),topBig:big.slice(0,25).map(f),botBig:big.slice(-15).reverse().map(f),topNum:numChg.slice(0,10).map(f),
bins:[[-100,-10],[-10,-5],[-5,0],[0,0.0001],[0.0001,10],[10,25],[25,50],[50,1e9]].map(b=>[b[0],v.filter(x=>x.pct>=b[0]&&x.pct<b[1]).length])};

data/turn-1-js-1/code.js

SQL p
   SELECT a.geoid,
          a.name,
          a.pop_estimate p10,
          b.pop_estimate p25,
          (p.geoid IS NOT NULL) has_geom
     FROM tn_census_local_pop_est a
     JOIN tn_census_local_pop_est b ON b.geoid = a.geoid
      AND b.geo_type = 'place'
      AND b.series = 'postcensal'
      AND b.year = 2025
LEFT JOIN tn_census_places p ON p.geoid = a.geoid
    WHERE a.geo_type = 'place'
      AND a.series = 'intercensal'
      AND a.year = 2010

data/turn-1-js-1/sql-p.sql

Result

Result is in the sidecar file.

data/turn-1-js-1/result.json

Console

(empty)

data/turn-1-js-1/console.txt

Exploratory Queries
Query 1 — Check years available and place counts.
   SELECT series,
          min(YEAR),
          max(YEAR),
          count(DISTINCT geoid)
     FROM tn_census_local_pop_est
    WHERE geo_type = 'place'
 GROUP BY series
seriesminmaxcount
census19801990336
intercensal20002019348
postcensal19902025349

data/turn-1-query-1.csv

Map Layer Queries
Percent change in population, July 2010 – July 2025 — colored by "cls": Grew 50% or more (#00441b), Grew 25–50% (#238b45), Grew 10–25% (#74c476), Grew 0–10% (#c7e9c0), Lost 0–5% (#fdd0a2), Lost 5–10% (#f16913), Lost more than 10% (#a50f15)
     WITH c AS (
             SELECT a.geoid,
                    a.name,
                    a.pop_estimate p10,
                    b.pop_estimate p25,
                    round(100.0 * (b.pop_estimate - a.pop_estimate) / a.pop_estimate, 1) pct
               FROM tn_census_local_pop_est a
               JOIN tn_census_local_pop_est b ON b.geoid = a.geoid
                AND b.geo_type = 'place'
                AND b.series = 'postcensal'
                AND b.year = 2025
              WHERE a.geo_type = 'place'
                AND a.series = 'intercensal'
                AND a.year = 2010
          )
   SELECT p.geom,
          c.name AS "Place",
          c.p10 AS "Pop. 2010",
          c.p25 AS "Pop. 2025",
          c.p25 - c.p10 AS "Change",
          c.pct AS "% change",
          CASE
                    WHEN pct >= 50 THEN 'a'
                    WHEN pct >= 25 THEN 'b'
                    WHEN pct >= 10 THEN 'c'
                    WHEN pct >= 0 THEN 'd'
                    WHEN pct >= -5 THEN 'e'
                    WHEN pct >= -10 THEN 'f'
                    ELSE 'g'
          END AS cls
     FROM c
     JOIN tn_census_places p ON p.geoid = c.geoid

Picture: maps/turn-1-place-pop-change.png

Used Data Sets

data/turn-1-query-1.csv

↑ Contents
seriesminmaxcount
census19801990336
intercensal20002019348
postcensal19902025349

3 rows.

data/turn-1-js-1/code.js

↑ Contents
let rows=[];let r;while((r=next('p'))!==null){r.pct=r.p10>0?(r.p25-r.p10)/r.p10*100:null;rows.push(r);}
let v=rows.filter(x=>x.pct!==null);
v.sort((a,b)=>b.pct-a.pct);
let big=v.filter(x=>x.p10>=2500);
let f=x=>({name:x.name,p10:x.p10,p25:x.p25,chg:x.p25-x.p10,pct:+x.pct.toFixed(1)});
let numChg=[...v].sort((a,b)=>(b.p25-b.p10)-(a.p25-a.p10));
result={n:rows.length,nogeom:rows.filter(x=>!x.has_geom).map(x=>x.name),zero:rows.filter(x=>x.pct===null).map(x=>x.name),
grew:v.filter(x=>x.pct>0).length,lost:v.filter(x=>x.pct<0).length,flat:v.filter(x=>x.pct===0).length,
topAll:v.slice(0,25).map(f),botAll:v.slice(-25).reverse().map(f),topBig:big.slice(0,25).map(f),botBig:big.slice(-15).reverse().map(f),topNum:numChg.slice(0,10).map(f),
bins:[[-100,-10],[-10,-5],[-5,0],[0,0.0001],[0.0001,10],[10,25],[25,50],[50,1e9]].map(b=>[b[0],v.filter(x=>x.pct>=b[0]&&x.pct<b[1]).length])};

data/turn-1-js-1/sql-p.sql

↑ Contents
SELECT a.geoid, a.name, a.pop_estimate p10, b.pop_estimate p25, (p.geoid IS NOT NULL) has_geom FROM tn_census_local_pop_est a JOIN tn_census_local_pop_est b ON b.geoid=a.geoid AND b.geo_type='place' AND b.series='postcensal' AND b.year=2025 LEFT JOIN tn_census_places p ON p.geoid=a.geoid WHERE a.geo_type='place' AND a.series='intercensal' AND a.year=2010

data/turn-1-js-1/result.json

↑ Contents
{
  "n": 345,
  "nogeom": [],
  "zero": [],
  "grew": 228,
  "lost": 117,
  "flat": 0,
  "topAll": [
    {
      "name": "Thompson's Station town",
      "p10": 2221,
      "p25": 9469,
      "chg": 7248,
      "pct": 326.3
    },
    {
      "name": "Berry Hill city",
      "p10": 576,
      "p25": 1864,
      "chg": 1288,
      "pct": 223.6
    },
    {
      "name": "Nolensville town",
      "p10": 6065,
      "p25": 15789,
      "chg": 9724,
      "pct": 160.3
    },
    {
      "name": "Spring Hill city",
      "p10": 29419,
      "p25": 61336,
      "chg": 31917,
      "pct": 108.5
    },
    {
      "name": "Lebanon city",
      "p10": 26347,
      "p25": 53412,
      "chg": 27065,
      "pct": 102.7
    },
    {
      "name": "Piperton city",
      "p10": 1453,
      "p25": 2889,
      "chg": 1436,
      "pct": 98.8
    },
    {
      "name": "Rossville town",
      "p10": 666,
      "p25": 1215,
      "chg": 549,
      "pct": 82.4
    },
    {
      "name": "Mount Juliet city",
      "p10": 25017,
      "p25": 45172,
      "chg": 20155,
      "pct": 80.6
    },
    {
      "name": "Gallatin city",
      "p10": 30525,
      "p25": 54590,
      "chg": 24065,
      "pct": 78.8
    },
    {
      "name": "White House city",
      "p10": 10289,
      "p25": 17872,
      "chg": 7583,
      "pct": 73.7
    },
    {
      "name": "Oakland town",
      "p10": 6653,
      "p25": 10835,
      "chg": 4182,
      "pct": 62.9
    },
    {
      "name": "Alcoa city",
      "p10": 8430,
      "p25": 13689,
      "chg": 5259,
      "pct": 62.4
    },
    {
      "name": "Medina city",
      "p10": 3624,
      "p25": 5813,
      "chg": 2189,
      "pct": 60.4
    },
    {
      "name": "Hartsville/Trousdale County",
      "p10": 7874,
      "p25": 12623,
      "chg": 4749,
      "pct": 60.3
    },
    {
      "name": "Baxter town",
      "p10": 1361,
      "p25": 2128,
      "chg": 767,
      "pct": 56.4
    },
    {
      "name": "Vanleer town",
      "p10": 390,
      "p25": 609,
      "chg": 219,
      "pct": 56.2
    },
    {
      "name": "Murfreesboro city",
      "p10": 109631,
      "p25": 171178,
      "chg": 61547,
      "pct": 56.1
    },
    {
      "name": "Smyrna town",
      "p10": 40596,
      "p25": 63321,
      "chg": 22725,
      "pct": 56
    },
    {
      "name": "Eagleville city",
      "p10": 625,
      "p25": 964,
      "chg": 339,
      "pct": 54.2
    },
    {
      "name": "Townsend city",
      "p10": 422,
      "p25": 640,
      "chg": 218,
      "pct": 51.7
    },
    {
      "name": "Lenoir City city",
      "p10": 8602,
      "p25": 12530,
      "chg": 3928,
      "pct": 45.7
    },
    {
      "name": "Columbia city",
      "p10": 34737,
      "p25": 50072,
      "chg": 15335,
      "pct": 44.1
    },
    {
      "name": "Franklin city",
      "p10": 62796,
      "p25": 90226,
      "chg": 27430,
      "pct": 43.7
    },
    {
      "name": "Charleston city",
      "p10": 651,
      "p25": 923,
      "chg": 272,
      "pct": 41.8
    },
    {
      "name": "Clarksville city",
      "p10": 133634,
      "p25": 188829,
      "chg": 55195,
      "pct": 41.3
    }
  ],
  "botAll": [
    {
      "name": "Crump city",
      "p10": 1493,
      "p25": 946,
      "chg": -547,
      "pct": -36.6
    },
    {
      "name": "Cumberland Gap town",
      "p10": 489,
      "p25": 312,
      "chg": -177,
      "pct": -36.2
    },
    {
      "name": "Toone town",
      "p10": 369,
      "p25": 264,
      "chg": -105,
      "pct": -28.5
    },
    {
      "name": "Cottage Grove town",
      "p10": 89,
      "p25": 66,
      "chg": -23,
      "pct": -25.8
    },
    {
      "name": "Tiptonville town",
      "p10": 4476,
      "p25": 3333,
      "chg": -1143,
      "pct": -25.5
    },
    {
      "name": "Rives town",
      "p10": 326,
      "p25": 244,
      "chg": -82,
      "pct": -25.2
    },
    {
      "name": "Orme town",
      "p10": 111,
      "p25": 85,
      "chg": -26,
      "pct": -23.4
    },
    {
      "name": "Gallaway city",
      "p10": 670,
      "p25": 520,
      "chg": -150,
      "pct": -22.4
    },
    {
      "name": "Hickory Valley town",
      "p10": 103,
      "p25": 80,
      "chg": -23,
      "pct": -22.3
    },
    {
      "name": "Normandy town",
      "p10": 135,
      "p25": 109,
      "chg": -26,
      "pct": -19.3
    },
    {
      "name": "Saltillo town",
      "p10": 535,
      "p25": 441,
      "chg": -94,
      "pct": -17.6
    },
    {
      "name": "Parrottsville town",
      "p10": 276,
      "p25": 228,
      "chg": -48,
      "pct": -17.4
    },
    {
      "name": "Yorkville city",
      "p10": 270,
      "p25": 228,
      "chg": -42,
      "pct": -15.6
    },
    {
      "name": "Trimble town",
      "p10": 630,
      "p25": 533,
      "chg": -97,
      "pct": -15.4
    },
    {
      "name": "Williston city",
      "p10": 399,
      "p25": 338,
      "chg": -61,
      "pct": -15.3
    },
    {
      "name": "Mason town",
      "p10": 1583,
      "p25": 1342,
      "chg": -241,
      "pct": -15.2
    },
    {
      "name": "Bell Buckle town",
      "p10": 493,
      "p25": 419,
      "chg": -74,
      "pct": -15
    },
    {
      "name": "La Grange town",
      "p10": 142,
      "p25": 121,
      "chg": -21,
      "pct": -14.8
    },
    {
      "name": "Obion town",
      "p10": 1124,
      "p25": 958,
      "chg": -166,
      "pct": -14.8
    },
    {
      "name": "Palmer town",
      "p10": 684,
      "p25": 584,
      "chg": -100,
      "pct": -14.6
    },
    {
      "name": "Viola town",
      "p10": 130,
      "p25": 111,
      "chg": -19,
      "pct": -14.6
    },
    {
      "name": "McLemoresville town",
      "p10": 347,
      "p25": 301,
      "chg": -46,
      "pct": -13.3
    },
    {
      "name": "Clifton city",
      "p10": 2692,
      "p25": 2344,
      "chg": -348,
      "pct": -12.9
    },
    {
      "name": "Burlison town",
      "p10": 419,
      "p25": 368,
      "chg": -51,
      "pct": -12.2
    },
    {
      "name": "Woodland Mills city",
      "p10": 379,
      "p25": 334,
      "chg": -45,
      "pct": -11.9
    }
  ],
  "topBig": [
    {
      "name": "Nolensville town",
      "p10": 6065,
      "p25": 15789,
      "chg": 9724,
      "pct": 160.3
    },
    {
      "name": "Spring Hill city",
      "p10": 29419,
      "p25": 61336,
      "chg": 31917,
      "pct": 108.5
    },
    {
      "name": "Lebanon city",
      "p10": 26347,
      "p25": 53412,
      "chg": 27065,
      "pct": 102.7
    },
    {
      "name": "Mount Juliet city",
      "p10": 25017,
      "p25": 45172,
      "chg": 20155,
      "pct": 80.6
    },
    {
      "name": "Gallatin city",
      "p10": 30525,
      "p25": 54590,
      "chg": 24065,
      "pct": 78.8
    },
    {
      "name": "White House city",
      "p10": 10289,

The first 400 of 752 lines.

provenance/tn_census_local_pop_est.md

↑ Contents

Provenance: tn_census_local_pop_est

This file describes how the rows in PostgreSQL table tn_census_local_pop_est were obtained from an external source: where they were fetched and how fields were renamed and typed. Field meanings are in the mapping table below.

Identity
Pipeline

The Population Estimates Program's national file of places and county subdivisions, CSV, one row per area with a column per year. The sync keeps Tennessee's rows (STATE 47) at three summary levels and turns each into one row per year, the years read off the file's POPESTIMATE<year> columns:

SUMLEVgeo_typegeoidcounty_geoid
162placeSTATE + PLACEnone
061county_subdivisionSTATE + COUNTY + COUSUBSTATE + COUNTY
157place_in_countySTATE + PLACESTATE + COUNTY

Dropped: 040 and 050 (the state and county totals, which the county file has), 071 (a place's part of a county subdivision), and 170 and 172 (consolidated cities and the places inside them). A file that is not valid UTF-8 is read as Latin-1. The sync logs how many places have no outline in the current TIGER layers. These rows are series postcensal.

The years before 2020 are series intercensal, from the Bureau's revised files for each decade, read the same way at the same three summary levels: sub-est00int.csv for 2000–2009 (vintage 2010; it has no FUNCSTAT, so funcstat is empty, and its POPESTIMATE2010 is left to the 2010s file) and sub-est2020int.csv for 2010–2019 (vintage 2020; its CENSUS2020POP is not loaded). estimates_base is each file's own ESTIMATESBASE<first year>. Areas dissolved since keep their rows.

1990–1999 are series postcensal, vintage 1999: the Bureau's 1999 release, which no later release revised. su-99-10_tn.txt is fixed-width text in two blocks, July 1999 back to July 1994, then July 1993 back to July 1990 and the April 1, 1990 estimates base (estimates_base on the 1990 row); each line is the summary level, state, county, county subdivision and place codes, the state's abbreviation, the name, and one figure per column of its block, newest first. Kept: 060, a county subdivision, and 157, a place's part of a county, whose parts are also added up into the place's own place row (the name without (pt.)), as the later files' 162 is. A 157 line with no place code is the county's people outside every place, kept as place code 99990 and named Balance of … as the later files have it. Dropped: 071 (a place's part of a county subdivision). The file gives no functional status, so funcstat is empty.

The census rows, series census, year and vintage 1980 or 1990, are what each census counted on April 1 in the places and county subdivisions that were governments: every functional status but S (statistical: census designated places and census county divisions). pop_estimate is the count; estimates_base is empty.

  • 1990: 90STF1A-TN.ZIP holds several files of 4,809-character records; only part 0001 is read. Summary level 160 is a place, 060 a county_subdivision (its FIPS code under its county) and 155 a place's part of a county, a place_in_county row, named with (pt.) when the place lies in more than one county. The population is POP100, characters 291–299; the FIPS codes and FUNCSTAT are in the record's geographic header. A few places serving as their own subdivision carry the code of the township around them (Ohio's Chardon village has Chardon township's): of two areas with one code, the one that is not a false entity (F) keeps it; any other clash leaves both out, and the sync logs them.
  • 1980: stf1axtn.zip, 3,277-character records. Summary level 27 is a place, 12 a county subdivision and 13 a place's part of one, added up by county into the place_in_county rows. The population is characters 253–261. The 1980 tape has only the census's own area codes, not FIPS, so each 1980 area is matched to a 1990 one: the area with the same census code whose name is the same once its kind ("city", "township", …) and spacing are set aside, failing which the one 1990 area of that name (in the same county, for a subdivision). A row carries the 1990 area's FIPS code and name, the 1980 FUNCSTAT. A 1980 area matching none, or one whose 1990 area another 1980 area has already taken, is left out and logged.
Field → column mapping
Source fieldColumnTypeDescription
SUMLEVgeo_typevarchar(20)as above
as abovegeoidvarchar(10)
as abovecounty_geoidvarchar(5)
NAMEnamevarchar(120)the 1990 census's name on the census rows
FUNCSTATfuncstatvarchar(1)empty 1990–2009; that census's code on the census rows
the <year> suffixyearsmallint
the newest <year>vintagesmallint2010 or 2020 on history rows, 1999 on the 1990s rows, the year on the census rows
seriesvarchar(12)postcensal (with the 1990s rows), intercensal (2000–2019) or census
POPESTIMATE<year>pop_estimateinteger
ESTIMATESBASE2020estimates_baseinteger2020 row only (ESTIMATESBASE2000, ESTIMATESBASE2010 on the 2000 and 2010 rows; the 1990s file's base on the 1990 postcensal row)
Geometry
  • No geometry column.
Change detection

The Census sync's check asks for the next vintage's file each time and moves to it once it is published; otherwise it compares the current file's Last-Modified and length, and each history file's, the 1990s file's and the two census tapes' included. Any of them marks this table stale, and the next Census sync rebuilds it whole, every year from 2020 replaced by the new release.

Attribution

US Census Bureau, Population Estimates Program.

provenance/tn_census_places.md

↑ Contents

Provenance: tn_census_places

This file describes how the rows in PostgreSQL table tn_census_places were obtained from an external source: where they were fetched and how fields were renamed and typed. Field meanings are in the mapping table below.

Identity
Pipeline

Two TIGERweb tigerWMS_Current layers, "Incorporated Places" (28) and "Census Designated Places" (30), each asked for STATE='47', keyset-paged on GEOID (1,000 features a page), GeoJSON, outSR=4326. Each layer's download must return exactly the count the check saw, or the sync fails. Incorporated places are loaded with place_type = 'incorporated', the others with 'cdp'.

Field → column mapping
Source fieldColumnTypeDescription
TIGER GEOIDgeoidvarchar(7)state + place FIPS
TIGER GEOID, last 5place_fipsvarchar(5)place FIPS
TIGER NAMEnamevarchar(100)with its kind
TIGER BASENAMEbasenamevarchar(100)without it
the layerplace_typevarchar(12)28 → incorporated, 30 → cdp
TIGER LSADClsadvarchar(2)
TIGER FUNCSTATfuncstatvarchar(1)
TIGER AREALANDaland_m2bigintsquare meters
TIGER AREAWATERawater_m2bigintsquare meters
TIGER INTPTLATintptlatdouble precisioninternal point
TIGER INTPTLONintptlondouble precisioninternal point
geometrygeomgeometry(MultiPolygon, 4326)ST_Multi(ST_GeomFromGeoJSON)
Geometry
  • SRID 4326 (WGS84). GIST index on geom.
Change detection

The Census sync's check compares each layer's vintage ("January 1, 2026 vintage") and Tennessee's row count in it. A change to either marks this table stale, and the next Census sync rebuilds it.

Attribution

US Census Bureau. TIGER products are free to use with acknowledgement of the U.S. Census Bureau as the source.

© 2026 State Planner