---
title: "Spatial Operations"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Spatial Operations}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
has_duckdb <- requireNamespace("duckdb", quietly = TRUE)
knitr::opts_chunk$set(
  eval = has_duckdb && !identical(Sys.getenv("NOT_CRAN"), "false")
)
```

```{r setup}
library(dbSpatial)
library(sf)
library(dplyr)
```

## Setup

```{r}
con <- DBI::dbConnect(duckdb::duckdb(), ":memory:")
DBI::dbExecute(con, "SET threads = 1")

# Sample points
df <- data.frame(id = 1:3, x = c(0, 10, 20), y = c(0, 10, 20))
pts <- dbSpatial(
  conn = con, name = "pts", value = df,
  x_colName = "x", y_colName = "y", overwrite = TRUE
)
pts
```

## Geometry Operations

```{r}
# Buffer
st_buffer(pts, dist = 5)

# Centroid
st_centroid(pts)

# Simplify
st_simplify(pts, dTolerance = 1)
```

## Measurements

```{r}
# Bounding box
st_bbox(pts)

# Check validity
st_is_valid(pts)
```

## Spatial Joins

Use `st_join()` to perform spatial joins with various predicates:

```{r}
# Self-join using intersection predicate (returns joined table)
st_join(pts, pts, join = st_intersects)
```

## Convert to sf

```{r}
sf_pts <- st_as_sf(pts)
sf_pts
```

```{r cleanup, include=FALSE}
DBI::dbDisconnect(con, shutdown = TRUE)
```
