Finding the centre of Jamaica.

April 24, 2026 • By Rhys • 7 min read

PostGISPostgreSQLpopulationSpatial SQL

Family meetups are often times for catching up and discussions. One such discussion that occurred recently was that Portmore was taking over from Kingston as the centre of Jamaica. Now, as someone who was “born under the clock” and spent his formative years in a 9 sqkm area of the City of Kingston (not the parish) and had all intentions of living in that same area, the notion that Portmore is “taking over” as the centre of Jamaica is ludicrous.

Portmore, a municipality in the parish of St. Catherine, has grown quite a bit in the last 3 decades. I recall when the citizens of Portmore would still need to drive into Kingston across the causeway bridge or via Mandela Highway to conduct most of their business. And while banks and supermarkets opened branches fairly early on, as recently as a decade ago, Portmorians would still venture across parish lines for most forms of entertainment and socializing. This has changed drastically in the last decade though. In the same way that I could live comfortably in that 9 sqkm section of Kingston I reckon someone born in Portmore could do the same today. Well…except for being born there. The one thing still missing is a major hospital. Citizens of Portmore still rely on hospitals in Spanish Town or Kingston. Kingston still is the economic and cultural centre of Jamaica. But, let’s take out the economics and culture…where is the centre of Jamaica and how has it shifted over the years?

And I mean just from a population perspective.

By centre I mean the population-weighted geographic centre of Jamaica: the point where each parish pulls proportionally based on its population. Imagine each parish pulling on a map with a force proportional to its population; that the balance point is the centre.

The Setup

So, a bit of background, Jamaica has 14 Parishes. The capital of Jamaica is Kingston. There are two Kingstons. Kingston the city and Kingston the Parish. The city of Kingston includes the parish of Kingston and a substantial portion of the parish of St. Andrew. St. Catherine, in addition to hosting Portmore also has Spanish Town and Old Harbour as relatively large population centres. My expectation is that the centre, again from a population perspective, is somewhere in St. Catherine. I could not find any official boundary data for the city of Kingston or the municipality of Portmore. For this analysis, I am going to stick to the parish population figures. I’m using data from https://www.citypopulation.de/en/jamaica/ since data.gov.jm looks as if it has not been updated in eons and the official Statistical Institute of Jamaica website doesn’t have a simple table with the data I need.

Source: citypopulation.de (compiled from STATIN, UN Demographic Yearbook 1988, CARICOM National Census Report 2001)

ParishAbbr.CapitalArea (km²)19821991200120112022
ClarendonCLAMay Pen1,198203,132214,706237,024245,103258,643
HanoverHANLucea45162,83766,10467,03769,53369,780
KingstonKINKingston22104,041103,77196,05289,05789,186
ManchesterMANMandeville837144,029159,603185,801189,797193,694
PortlandPORPort Antonio81473,65676,31780,20581,74484,972
St. AndrewANDKingston435482,889535,872555,828573,369583,718
St. AnnANNSt. Ann’s Bay1,205137,745149,424166,762172,362175,310
St. CatherineCATSpanish Town1,194332,674381,974482,308516,218542,763
St. ElizabethELIBlack River1,204136,897145,651146,404150,205153,201
St. JamesJAMMontego Bay593135,959154,198175,127183,811188,656
St. MaryMARPort Maria612105,969108,780111,466113,615116,498
St. ThomasTHOMorant Bay74380,44184,70091,60493,90294,485
TrelawnyTREFalmouth87169,46671,20973,06675,16477,427
WestmorelandWMLSavanna-la-Mar788120,622128,362138,947144,103146,205
Total10,9672,190,3572,380,6662,607,6322,697,9832,774,538

So, let’s get the data set up. I already have a table with the parishes in jamaica.parishes. Let’s create a schema and add a table to hold the data from citypopulation.de

CREATE SCHEMA demography;
CREATE TABLE demography.jamaica_parish_population(
  parish text,
  short_name text,
  capital text,
  area_sqkm float,
  pop_1982 int,
  pop_1991 int,
  pop_2001 int,
  pop_2011 int,
  pop_2022 int);

COPY demography.jamaica_parish_population FROM 'citypopulation.de.jamaica.parish.csv' WITH (HEADER, FORMAT CSV);

While this is nice to look at it is a bit unwieldy to work with. So let’s unspool this into a standard table.

CREATE VIEW demography.parish_pop_by_year AS
SELECT parish, year, pop FROM demography.jamaica_parish_population
CROSS JOIN LATERAL (VALUES
  (1982, pop_1982), (1991, pop_1991), (2001, pop_2001),
  (2011, pop_2011),  (2022, pop_2022)
  ) AS unrolled(year, pop) ;

The Centres

So now that we have the data we need. How do we find the centre? The first thought that popped into my head was to use PostGIS’ st_centroid function. I also remembered that the st_geometricmedian function also exists, which up until today, I had never used. Let’s look at both functions and compare the end result.

The st_centroid function gives you the centre of mass of a geometry, however, given that the parish geometries are not changing, we need a way to represent the population of each parish in a way that st_centroid can take advantage of. We can use the population density of each parish to generate that many points inside a 1km square centred on the parish, then run st_centroid over the combined set of points. This is much faster than generating one point per person.

The st_centroid Approach

CREATE TABLE demography.population_centre_centroid AS
WITH population_density_data AS (
  SELECT parish, year, pop/(st_area(geom)/1e6) pop_density, geom FROM jamaica.parishes
  JOIN demography.parish_pop_by_year USING (parish)
),
weighted_points AS (
  SELECT parish, year,
  st_generatepoints(
    st_translate( --st_square needs to be shifted because it is not centred
      st_square(1000,0,0,st_centroid(geom)),
    -500, -500),
  ceil(pop_density)::int) wp
  FROM population_density_data
)
SELECT year, st_centroid(st_collect(wp)) geom FROM weighted_points
GROUP BY year;

A couple things to note, I need to use st_translate because the st_square function doesn’t centre the square on the supplied point as I thought it would.

The st_geometricmedian approach

The st_geometricmedian function is based on Weiszfeld’s algorithm to find the geometric median, which as opposed to the centroid being the “centre of mass” of a geometry, is the point that minimizes the sum of the distances to all other points. This function also has the ability to use the M value to give each point a relative weight. We can apply the parish population as the M value using st_force3dm.

CREATE TABLE demography.population_centre_median AS
WITH population_density_data AS (
  SELECT parish, year, pop, geom FROM jamaica.parishes
  JOIN demography.parish_pop_by_year USING (parish)
),
weighted_points AS (
  SELECT year, st_geometricmedian(st_collect(st_force3dm(st_centroid(geom), pop))) wp
  FROM population_density_data
  GROUP BY year
)
SELECT year, wp FROM weighted_points;

The Results

Ok, so, let’s take a look at the point spread:

Comparison

Initially I was shocked at the fact that the st_geometricmedian points were all clustered at the same place. It looks as if the M value weighting is not that impactful, maybe because the change in population between census years is relatively small. St. Catherine, for example, even though it has the highest growth over the 4 decade period, only increased as a percentage of total population from ~15% to ~20%. Also, given that the function is less sensitive to outliers, this may also explain why the movement between years is limited. The geometric median minimises absolute distances rather than squared distances, and with 14 fixed points spread across the island, that spatial configuration overwhelms the modest weight redistribution between censuses.

The st_centroid points however, respond like a seismograph: every change of population is clearly noticed. The overall trend from the st_centroid function mirrored what my expectations were: there is a general trend north-westward as the population of St. Catherine increases.

Is Portmore Taking over?

The data says no. Jamaica’s population-weighted centre in 1982 was just west of the border between St. Catherine and St. Andrew. The direction of travel is telling: every decade it jogs further west away from Kingston. The suburban wave that fuelled growth in Portmore and to a lesser extent the towns and areas around Old Harbour has shifted the balance point. If I had more granular data, i.e. data at the community or enumeration district level for each of the census years, I think the centroid would trend in the direction of Portmore on a more south-westerly heading as opposed towards the interior of St. Catherine. That however is a post for another day if STATIN releases that kind of data for all previous censuses. In fact, it would be good if STATIN could release all data at the ED level. It would be interesting to see things like income distribution across the island.

In the meantime, I have my answer for the next family linkup. Kingston is still the centre of Jamaica. PostGIS said so.