Measuring Geographic Distributions with GeoPandas: Mean Center

Table of Contents

Introduction

The Mean Center is the average X coordinate and Y coordinate for all features in a study area and is the simplest descriptor of a geographic distribution. The Mean Center is generally used to track the changes in a features distribution over time and can also be used to compare the distribution of multiple features.

The Mean Center is also known as the Geographic Center or Center of Concentration for a set of features.

You would calculate the Mean Center for features where there is no travel interaction between the Center and the features of the study. Basically, use it for a study where each event that happens is a recorded location, for example a burglary for crime analysis, or the sighting of a wombat for wildlife studies.

Sources:
The Esri Guide to GIS Analysis, Volume 2: Spatial Measurements and Statistics.
An Introduction to Statistical Problem Solving in Geography

This course is designed to instill the basics of Python Programming by incrementally increasing your knowledge session-upon-session. In each section you will be given new material for a workbook to fill out and by the end of this course you will have your very own Python reference handbook. So how does this course have a GIS focus? Simple, most elements of the course have GIS and geospatial data in mind. Instead of using non-descript variables and values, we will use terms such as population, city, x_coord, y_coord, and so on. This will aid participants with pinpointing how they can relate geospatial data to Python. 

The Formula

Mean Center formula

For Point features the X and Y coordinates of each feature is used, for Polygons the centroid of each feature represents the X and Y coordinate to use, and for Linear features the mid-point of each line is used for the X and Y coordinate.

Using GeoPandas to Calculate the Mean Center

The code below uses GeoPandas and Shapely to find the mean center for a dataset and create an output file. In our example we will use a Shapefile, but you can use any input and output filetypes that you have available with your GeoPandas setup. 

The code is heavily commented for ease of understanding the workflow. For a Point, we now we need get the mean value for all x values and y values. For a Polyline, we need to first get the midpoint of each line, and then get the mean value for all x values and y values for the midpoints. For a Polygon, we need to the the centroid value for each polygon, and then get the mean value for all x values and y values for the centroids.

				
					import geopandas as gpd
from shapely.geometry import Point

## input shapefile path
in_shp = r"path\to\input\shapefile\input.shp"

## the output shapefile path for the mean center point
out_shp = r"path\to\output\shapefile\output.shp"

## read in the shapefile to a GeoDataFrame
gdf = gpd.read_file(in_shp)

## get the geometry type from the first record
geom_type = gdf.geom_type[0]

## get the EPSG code
crs = gdf.crs

## for Point geometry
if geom_type == "Point":
    ## get all x and y values
    gdf["x"] = gdf.geometry.x
    gdf["y"] = gdf.geometry.y

## for LineString geometry
elif geom_type == "LineString":
    ## get all x and y values for the midpoints
    gdf["midpoint"] = gdf.geometry.interpolate(0.5, normalized=True)
    gdf["x"] = gdf["midpoint"].x
    gdf["y"] = gdf["midpoint"].y

## for Polygon geometry
elif geom_type == "Polygon":
    ## get all x and y values for the centroids
    gdf["centroid"] = gdf.geometry.centroid
    gdf["x"] = gdf["centroid"].x
    gdf["y"] = gdf["centroid"].y

## get the mean of the x and y values
mean_x = gdf['x'].mean()
mean_y = gdf['y'].mean()

## create a point geometry representing the mean center
mean_center = Point(mean_x, mean_y)

## create a GeoDataFrame with the point geometry
gdf_mean_center = gpd.GeoDataFrame(geometry=[mean_center], crs=crs)

## add fields for the XCoord and YCoord
gdf_mean_center["XCoord"] = mean_x
gdf_mean_center["YCoord"] = mean_y

## write the mean center point to the output shapefile
gdf_mean_center.to_file(out_shp, driver="ESRI Shapefile")
				
			

Mean Center in Action

I downloaded crime data from DATA.POLICE.CO.UK for all crimes in the West Midlands which were a series of CSV files. I further processed the data for burglaries only and you can downland the shapefile for the example below here

Birmingham Burglaries 2023

Running the script produces a Shapefile that contains the Mean Center for all burglaries in 2023.

Birmingham Buglaries 2023 mean center

Below is a comparison between our GeoPandas tool and the Mean Center tool output from ArcGIS Pro. Spot on!

Mean Center Geopandas
Mean Center ArcGIS Pro

At Final Draft Mapping we provide comprehensive courses for automating tasks within ArcGIS Pro and ArcGIS Online with ArcPy and the ArcGIS API for Python. Courses range from beginner to advanced workflows and all paid courses provide extra support where you can ask questions. Automation within ArcGIS is a highly sought after skill, by adding these skills to your arsenal you are placing yourself at the forefront of that demand. 

We appreciate our blog readers, you can get 25% off any (non-sale) course at any time with the code FDMBLOG25

Also in this series...

Leave a Comment

Your email address will not be published. Required fields are marked *