Do you want to share your content on R-bloggers? Click here if you have a blog, or here If you don’t.
I was reading Phoenician colonization from its origins until the 7th century BC (Manzano-Agugliaro et al. 2025) And thought it was an interesting dataset, but unfortunately: it is divided into four tables, behind a JavaScript disposal (WTF Taylor & Francis?) And with DMS coordinates (including typos and special characters) … so not easily reusable.
Let us start building an accessible data set.
Configuration
library(readr) library(purrr) library(dplyr) library(stringr) library(ggplot2) library(forcats) library(janitor) library(sf) library(rnaturalearth) library(glue) library(parzer) library(leaflet) sf_use_s2(FALSE) knitr::knit_hooks$set(crop = knitr::hook_pdfcrop)
We must download the CSVs manually (parts 1″ 2″ 3 And 4) Because there is an antisciplical mechanism … then a little cleaning and coordinating parsing with the very nice {Parzer} Package we have a spatial object built with {SF}.
sources = list(
c_10_bce = "data_raw/T0001-10.1080_17445647.2025.2528876.csv",
c_09_bce = "data_raw/T0002-10.1080_17445647.2025.2528876.csv",
c_08_bce = "data_raw/T0003-10.1080_17445647.2025.2528876.csv",
c_07_bce = "data_raw/T0004-10.1080_17445647.2025.2528876.csv"
)
phoenician <- sources |>
imap(\(f, c) { read_csv(f) |>
mutate(century_start_bce = parse_number(c))}) |>
list_rbind() |>
clean_names() |>
mutate(lon = parse_lon(str_replace(longitude_e, "−", "-")),
lat = parse_lat(str_replace(latitude_n, ",", "."))) |>
st_as_sf(coords = c("lon", "lat"), crs = "EPSG:4326")The resulting layer, mapped on one Natural Background, seems good.
world <- ne_countries() |>
st_intersection(phoenician |>
st_bbox() |>
st_as_sfc() |>
st_buffer(4, joinStyle = "MITRE", mitreLimit = 10))
phoenician |>
ggplot() +
geom_sf(data = world) +
geom_sf(aes(color = fct_rev(as_factor(century_start_bce)))) +
theme_void() +
labs(title = "Phoenician colonies",
subtitle = "10th c. BCE - 7th c. BCE",
color = "from\n(century BCE)",
caption = glue("data doi:10.1080/17445647.2025.2528876
https://r.iresmi.net/ {Sys.Date()}")) +
theme_minimal() +
theme(plot.caption = element_text(size = 6),
plot.background = element_rect(fill = "white"))
Figure 1: Phoenician colonies
Do you want more interactivity?
With {folder} …
phoenician |>
leaflet() |>
addTiles(attribution = r"(
r.iresmi.net.
data: Manzano-Agugliaro et al. 2025. doi:10.1080/17445647.2025.2528876;
map: OpenStreetMap)") |>
addCircleMarkers(popup = ~ glue("{settlement}
from {century_start_bce}th c. BCE \\
{if_else(!is.na(centuries_of_subsequent_permanence),
paste0('
to ', centuries_of_subsequent_permanence), '')}"),
clusterOptions = markerClusterOptions())Figure 2: Phoenician colonies (interactive)
We can build a clean geopackage (and a CSV in case that):
phoenician |>
st_write(
"data/phoenician_settlements.gpkg",
layer = "phoenician_settlements",
layer_options = c(
"IDENTIFIER=Phoenician colonization from its origin to the 7th century BC",
glue("DESCRIPTION=Data from:
Manzano-Agugliaro, F., Marín-Buzón, C., Carpintero-Lozano, S., & López-Castro, J. L. (2025). \\
Phoenician colonization from its origin to the 7th century BC. Journal of Maps, 21(1). \\
https://doi.org/10.1080/17445647.2025.2528876
Available on https://doi.org/10.5281/zenodo.17141060
Extracted on {Sys.Date()} – https://r.iresmi.net/posts/2025/phoenician")),
delete_layer = TRUE,
quiet = TRUE)
phoenician |>
select(-c(latitude_n, longitude_e)) |>
bind_cols(st_coordinates(phoenician)) |>
rename(lon_wgs84 = X,
lat_wgs84 = Y) |>
st_drop_geometry() |>
write_csv("data/phoenician_settlements.csv")And finally we store them in a public repository; They are now available on Zenodo And therefore even one DOI: 10,5281 / Zenodo.17141060
References
Manzano-aguliaro, Francisco, Carmen Marín-Buzón, Susana Carpintero-Lazano and José Luis López-Castro. 2025. “Phoenician colonization from its origin to the 7th century BC. “ Journal of Maps 21 (1): 2528876. https://doi.org/10.1080/17445647.2025.2528876.
Related
#Phoenician #colonization #RBloggers


