SLspatial provides spatial boundary datasets for Sri Lanka as simple
features (sf) objects. The package supports mapping, spatial analysis,
and integration of administrative and electoral geographic data. It
includes the country boundary, administrative districts, electoral
districts, electoral polling divisions, and administrative divisions.
The datasets support analysis at multiple geographic levels while
distinguishing administrative from electoral geography.
Install the development version from GitHub:
# install.packages("remotes")
# remotes::install_github("Amalan-ConStat/SLspatial")
install.packages("SLspatial", repos = c('https://amalan-constat.r-universe.dev', 'https://cloud.r-project.org'))
| Dataset | Features | Coverage | Key attributes |
|---|---|---|---|
SLBoundary |
1 | Sri Lanka country boundary |
Country, ISO2, ISO3
|
SLAdministrativeDistricts |
25 | Administrative districts |
SourceID, SourceName, District
|
SLElectoralDistricts |
22 | Electoral districts | District |
SLElectorate |
160 | Electoral polling divisions across 22 electoral districts |
ElecCode, District, Electorate, OrigName
|
SLAdminDivisions |
323 | Administrative divisions across 25 administrative districts |
DistCode, District, EDistrict, DivCode, Division
|
All five datasets are sf objects with a geometry column. Counts
reflect the source boundary versions used in the package and should not
be interpreted as a statement about current official administrative
boundaries.
SLBoundaryA single-feature country boundary, with country name and ISO two- and
three-letter codes. The geometry is a MULTIPOLYGON in WGS84
(EPSG:4326).
SLAdministrativeDistrictsThe 25 administrative district polygons. SourceID and SourceName
preserve identifiers and names from the source; District uses
election-aligned labels for selected districts (such as Digamadulla
for Ampara). The geometry remains administrative: Kilinochchi and
Jaffna, and the three administrative districts associated with Vanni,
remain separate features.
SLElectoralDistrictsThe 22 electoral district polygons, derived from
SLAdministrativeDistricts. Jaffna and Kilinochchi are combined into
the Jaffna electoral district; Mannar, Mullaitivu, and Vavuniya are
combined into Vanni. The remaining districts retain their administrative
boundaries. This is a derived layer, not an independently sourced
official electoral-boundary file.
SLElectorateThe 160 electorate (polling division) polygons, with ElecCode,
District, Electorate, and OrigName. Names were harmonised with the
2024 presidential election data where possible. Three names were
manually assigned rather than confirmed through an exact election-data
match.
SLAdminDivisionsThe 323 administrative division polygons, with DistCode, District,
EDistrict, DivCode, and Division. District refers to the
administrative district; EDistrict is the corresponding electoral
district label, allowing aggregation or grouping by either geography.
Administrative districts and electoral districts are not
interchangeable. Use SLElectoralDistricts for electoral district
geometry and SLAdministrativeDistricts for administrative district
geometry. In particular, avoid interpreting the election-aligned
District labels in SLAdministrativeDistricts as meaning that the
polygons themselves have been merged.
library(SLspatial)
library(sf)
library(dplyr)
library(ggplot2)
# Inspect the datasets
lapply(
list(SLBoundary = SLBoundary,
SLAdministrativeDistricts = SLAdministrativeDistricts,
SLElectoralDistricts = SLElectoralDistricts,
SLElectorate = SLElectorate,
SLAdminDivisions = SLAdminDivisions),
nrow
)
#> $SLBoundary
#> [1] 1
#>
#> $SLAdministrativeDistricts
#> [1] 25
#>
#> $SLElectoralDistricts
#> [1] 22
#>
#> $SLElectorate
#> [1] 160
#>
#> $SLAdminDivisions
#> [1] 323
head(st_drop_geometry(SLElectorate))
#> ElecCode District Electorate OrigName
#> 1 EC-21A Ratnapura Eheliyagoda Eheliyagoda
#> 2 EC-13C Digamadulla Kalmunai Kalmunai
#> 3 EC-20C Monaragala Wellawaya Wellawaya
#> 4 EC-12C Batticaloa Paddiruppu Paddiruppu
#> 5 EC-13B Digamadulla Sammanthurai Samanthurai
#> 6 EC-18A Polonnaruwa Minneriya Minneriya
head(st_drop_geometry(SLAdminDivisions))
#> DistCode District EDistrict DivCode Division
#> 1 1 Ampara Digamadulla 1 Addalachchenai
#> 2 1 Ampara Digamadulla 2 Akkaraipattu
#> 3 1 Ampara Digamadulla 3 Alayadiwembu
#> 4 1 Ampara Digamadulla 4 Ampara
#> 5 1 Ampara Digamadulla 5 Damana
#> 6 1 Ampara Digamadulla 6 Dehiattakandiya
Plot the national boundary:
ggplot(SLBoundary) +
geom_sf(fill = "lightblue", colour = "grey30", linewidth = 0.3) +
coord_sf(datum = NA) +
theme_minimal() +
labs(title = "Sri Lanka: Country Boundary")

Plot the 25 administrative districts:
ggplot(SLAdministrativeDistricts) +
geom_sf(fill = "lightblue", colour = "grey30", linewidth = 0.3) +
coord_sf(datum = NA) +
theme_minimal() +
labs(title = "Sri Lanka: 25 Administrative Districts")

Plot the 22 derived electoral districts:
ggplot(SLElectoralDistricts) +
geom_sf(fill = "lightblue", colour = "grey30", linewidth = 0.3) +
coord_sf(datum = NA) +
theme_minimal() +
labs(title = "Sri Lanka: 22 Electoral Districts")

ggplot(SLElectorate) +
geom_sf(fill = "lightblue", colour = "grey35", linewidth = 0.15) +
coord_sf(datum = NA) +
theme_minimal() +
labs(title = "Sri Lanka: Electoral Polling Divisions")

ggplot(SLElectorate) +
geom_sf(aes(fill = District), colour = "white", linewidth = 0.12) +
coord_sf(datum = NA) +
theme_minimal() +
theme(legend.position = "right") +
labs(title = "Sri Lanka: Polling Divisions by Electoral District",
fill = "Electoral district")

ggplot(SLAdminDivisions) +
geom_sf(fill = "lightblue", colour = "grey35", linewidth = 0.12) +
coord_sf(datum = NA) +
theme_minimal() +
labs(title = "Sri Lanka: Administrative Divisions")

Count administrative divisions within each administrative district:
SLAdminDivisions |>
st_drop_geometry() |>
count(District, name = "AdministrativeDivisions") |>
arrange(District)
#> District AdministrativeDivisions
#> 1 Ampara 19
#> 2 Anuradhapura 22
#> 3 Badulla 15
#> 4 Batticaloa 12
#> 5 Colombo 12
#> 6 Galle 18
#> 7 Gampaha 13
#> 8 Hambantota 11
#> 9 Jaffna 14
#> 10 Kalutara 14
#> 11 Kandy 20
#> 12 Kegalle 11
#> 13 Kilinochchi 4
#> 14 Kurunegala 30
#> 15 Mannar 5
#> 16 Matale 11
#> 17 Matara 16
#> 18 Moneragala 11
#> 19 Mullaitivu 5
#> 20 Nuwara Eliya 5
#> 21 Polonnaruwa 7
#> 22 Puttalam 16
#> 23 Ratnapura 17
#> 24 Trincomalee 11
#> 25 Vavuniya 4
Examine the correspondence between administrative and electoral districts:
SLAdminDivisions |>
st_drop_geometry() |>
distinct(District, EDistrict) |>
arrange(EDistrict, District)
#> District EDistrict
#> 1 Anuradhapura Anuradhapura
#> 2 Badulla Badulla
#> 3 Batticaloa Batticaloa
#> 4 Colombo Colombo
#> 5 Ampara Digamadulla
#> 6 Galle Galle
#> 7 Gampaha Gampaha
#> 8 Hambantota Hambantota
#> 9 Jaffna Jaffna
#> 10 Kilinochchi Jaffna
#> 11 Kalutara Kalutara
#> 12 Kegalle Kegalle
#> 13 Kurunegala Kurunegala
#> 14 Kandy Mahanuwara
#> 15 Matale Matale
#> 16 Matara Matara
#> 17 Moneragala Monaragala
#> 18 Nuwara Eliya Nuwara-Eliya
#> 19 Polonnaruwa Polonnaruwa
#> 20 Puttalam Puttalam
#> 21 Ratnapura Ratnapura
#> 22 Trincomalee Trincomalee
#> 23 Mannar Vanni
#> 24 Mullaitivu Vanni
#> 25 Vavuniya Vanni
Count administrative divisions within each electoral district:
SLAdminDivisions |>
st_drop_geometry() |>
count(EDistrict, name = "AdministrativeDivisions") |>
arrange(EDistrict)
#> EDistrict AdministrativeDivisions
#> 1 Anuradhapura 22
#> 2 Badulla 15
#> 3 Batticaloa 12
#> 4 Colombo 12
#> 5 Digamadulla 19
#> 6 Galle 18
#> 7 Gampaha 13
#> 8 Hambantota 11
#> 9 Jaffna 18
#> 10 Kalutara 14
#> 11 Kegalle 11
#> 12 Kurunegala 30
#> 13 Mahanuwara 20
#> 14 Matale 11
#> 15 Matara 16
#> 16 Monaragala 11
#> 17 Nuwara-Eliya 5
#> 18 Polonnaruwa 7
#> 19 Puttalam 16
#> 20 Ratnapura 17
#> 21 Trincomalee 11
#> 22 Vanni 14
The datasets retain their source geometries and coordinate reference systems. Check the CRS before combining layers or calculating distances and areas. Transform both layers to an appropriate common CRS when performing spatial operations.
st_crs(SLBoundary)
#> Coordinate Reference System:
#> User input: WGS 84
#> wkt:
#> GEOGCRS["WGS 84",
#> DATUM["World Geodetic System 1984",
#> ELLIPSOID["WGS 84",6378137,298.257223563,
#> LENGTHUNIT["metre",1]]],
#> PRIMEM["Greenwich",0,
#> ANGLEUNIT["degree",0.0174532925199433]],
#> CS[ellipsoidal,2],
#> AXIS["latitude",north,
#> ORDER[1],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> AXIS["longitude",east,
#> ORDER[2],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> ID["EPSG",4326]]
st_crs(SLAdministrativeDistricts)
#> Coordinate Reference System:
#> User input: WGS 84
#> wkt:
#> GEOGCRS["WGS 84",
#> DATUM["World Geodetic System 1984",
#> ELLIPSOID["WGS 84",6378137,298.257223563,
#> LENGTHUNIT["metre",1]]],
#> PRIMEM["Greenwich",0,
#> ANGLEUNIT["degree",0.0174532925199433]],
#> CS[ellipsoidal,2],
#> AXIS["latitude",north,
#> ORDER[1],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> AXIS["longitude",east,
#> ORDER[2],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> ID["EPSG",4326]]
st_crs(SLElectoralDistricts)
#> Coordinate Reference System:
#> User input: WGS 84
#> wkt:
#> GEOGCRS["WGS 84",
#> DATUM["World Geodetic System 1984",
#> ELLIPSOID["WGS 84",6378137,298.257223563,
#> LENGTHUNIT["metre",1]]],
#> PRIMEM["Greenwich",0,
#> ANGLEUNIT["degree",0.0174532925199433]],
#> CS[ellipsoidal,2],
#> AXIS["latitude",north,
#> ORDER[1],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> AXIS["longitude",east,
#> ORDER[2],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> ID["EPSG",4326]]
st_crs(SLElectorate)
#> Coordinate Reference System:
#> User input: EPSG:4326
#> wkt:
#> GEOGCRS["WGS 84",
#> ENSEMBLE["World Geodetic System 1984 ensemble",
#> MEMBER["World Geodetic System 1984 (Transit)"],
#> MEMBER["World Geodetic System 1984 (G730)"],
#> MEMBER["World Geodetic System 1984 (G873)"],
#> MEMBER["World Geodetic System 1984 (G1150)"],
#> MEMBER["World Geodetic System 1984 (G1674)"],
#> MEMBER["World Geodetic System 1984 (G1762)"],
#> MEMBER["World Geodetic System 1984 (G2139)"],
#> MEMBER["World Geodetic System 1984 (G2296)"],
#> ELLIPSOID["WGS 84",6378137,298.257223563,
#> LENGTHUNIT["metre",1]],
#> ENSEMBLEACCURACY[2.0]],
#> PRIMEM["Greenwich",0,
#> ANGLEUNIT["degree",0.0174532925199433]],
#> CS[ellipsoidal,2],
#> AXIS["geodetic latitude (Lat)",north,
#> ORDER[1],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> AXIS["geodetic longitude (Lon)",east,
#> ORDER[2],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> USAGE[
#> SCOPE["Horizontal component of 3D system."],
#> AREA["World."],
#> BBOX[-90,-180,90,180]],
#> ID["EPSG",4326]]
st_crs(SLAdminDivisions)
#> Coordinate Reference System:
#> User input: WGS 84
#> wkt:
#> GEOGCRS["WGS 84",
#> DATUM["World Geodetic System 1984",
#> ELLIPSOID["WGS 84",6378137,298.257223563,
#> LENGTHUNIT["metre",1]]],
#> PRIMEM["Greenwich",0,
#> ANGLEUNIT["degree",0.0174532925199433]],
#> CS[ellipsoidal,2],
#> AXIS["latitude",north,
#> ORDER[1],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> AXIS["longitude",east,
#> ORDER[2],
#> ANGLEUNIT["degree",0.0174532925199433]],
#> ID["EPSG",4326]]
st_bbox(SLBoundary)
#> xmin ymin xmax ymax
#> 79.521805 5.918472 81.878754 9.835971
SLBoundary and
SLAdministrativeDistricts; check the associated source metadata for
version and licence.SLAdministrativeDistricts by merging administrative polygons into 22
electoral districts.LKA_adm2.shp shapefile.SLPresElection.Spatial boundaries and administrative arrangements can change over time. The included geometries should not be assumed to reproduce historical electoral or administrative boundaries for every election year. Users should verify source licensing, attribution requirements, and suitability for their intended use.
For dataset descriptions, use ?SLBoundary,
?SLAdministrativeDistricts, ?SLElectoralDistricts, ?SLElectorate,
and ?SLAdminDivisions after loading the package. Issues and
suggestions can be submitted through the GitHub issue
tracker.