Great-circle distance in kilometres, as a DuckDB SQL expression
Source:R/match.R
cc_distance_km_sql.RdBuilds a haversine expression over four longitude/latitude columns (decimal
degrees) on a sphere of mean Earth radius 6,371.0088 km. It is plain SQL, so
it needs no spatial extension and returns the same answer on every DuckDB
version. ST_Distance_Sphere(ST_Point(lon, lat), …) does not: DuckDB 1.x
reads its points as [latitude, longitude], which made one degree of
latitude 55.6 km instead of 111.2 km at 34°N, and DuckDB 2.0 refuses the call
unless geometry_always_xy is set.
Examples
cc_distance_km_sql("bio_lon", "bio_lat", "env_lon", "env_lat")
#> (2 * 6371.0088 * asin(sqrt(pow(sin(radians((env_lat) - (bio_lat)) / 2), 2) + cos(radians(bio_lat)) * cos(radians(env_lat)) * pow(sin(radians((env_lon) - (bio_lon)) / 2), 2))))
if (FALSE) { # \dontrun{
con <- DBI::dbConnect(duckdb::duckdb())
DBI::dbGetQuery(con, paste(
"SELECT", cc_distance_km_sql("-120", "34", "-120", "35"), "AS km")) # 111.2
} # }