Skip to contents

Runs the package's native DBSCAN (Ester et al. 1996; same core-point rule, <= eps neighbourhoods counting the point itself, and border points joining the first cluster that reaches them, as dbscan::dbscan). Coordinates are projected to km via the small-angle latitude factor so eps_km is interpretable as a kilometre-scale radius. Cluster ids are 1-based in discovery order; noise is 0. The neighbour search is quadratic in the number of points, so large inputs are capped by max_n.

Usage

morie_tps_dbscan_clusters(
  df,
  ds_name = "?",
  eps_km = 0.25,
  min_samples = 30L,
  max_n = 30000L,
  lat_col = "LAT_WGS84",
  lon_col = "LONG_WGS84"
)

Arguments

df

Incident-level data.frame.

ds_name

Tag for the result title.

eps_km

Neighbourhood radius in km.

min_samples

DBSCAN minPts parameter.

max_n

Subsample cap to keep DBSCAN tractable.

lat_col, lon_col

WGS84 column names.

Value

A named list with the per-cluster table, the count of noise points, and the largest-cluster size.

Examples

set.seed(2026)
df <- data.frame(
  LAT_WGS84 = c(rnorm(60, 43.65, 0.005), rnorm(60, 43.70, 0.005)),
  LONG_WGS84 = c(rnorm(60, -79.40, 0.005), rnorm(60, -79.38, 0.005))
)
morie_tps_dbscan_clusters(df, eps_km = 0.5, min_samples = 5L)
#> DBSCAN density clusters -- ?
#> ============================
#> Call: morie_tps_dbscan_clusters(df=<120r>, eps_km=0.5, min_samples=5) 
#> 
#>   Points clustered                        120
#>   Dropped (no / out-of-Toronto location)  0
#>   eps (km)                                0.5
#>   min_samples                             5
#>   Clusters discovered                     2
#>   Noise points                            5
#>   Largest cluster size                    58
#> 
#> DBSCAN with eps=0.5 km, minPts=5 on 120 point(s) found 2 cluster(s); 5 point(s) classified as noise (no nearby cluster). Largest cluster has 58 member(s).