---
title: "Working with WFS/WMS Services"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Working with WFS/WMS Services}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

## Understanding WFS and WMS Services

### What are WFS and WMS?

WFS (Web Feature Service) and WMS (Web Map Service) are standardized protocols for serving georeferenced map data over the internet:

- **WFS** provides access to actual geographic features with geometry and attributes
- **WMS** provides map images rendered from geographic data

### WFS Services in Detail

When you use Argentum to import WFS layers, you're getting actual vector data that you can analyze and manipulate in R:

```{r eval=FALSE}
library(Argentum)
library(sf)

# Get organization data
org <- argentum_select_organization(search = "Buenos Aires")

# List available layers
layers <- argentum_list_layers(org$Name)

# Import a specific layer
sf_layer <- argentum_import_wfs_layer(org$WFS_URL, layers$Name[1])

# Now you can work with the data using sf functions
st_crs(sf_layer)  # Check the coordinate reference system
plot(sf_layer)    # Basic plot of the geometry
```

### Working with Service Capabilities

Before importing data, you can check what capabilities a service offers:

```{r eval=FALSE}
# Get capabilities document
capabilities <- argentum_get_capabilities(org$WFS_URL)

# The capabilities document contains information about:
# - Available layers
# - Supported operations
# - Coordinate reference systems
# - Output formats
```

## Best Practices

### 1. Error Handling

Always implement proper error handling:

```{r eval=FALSE}
tryCatch({
  # Attempt to import data
  sf_layer <- argentum_import_wfs_layer(org$WFS_URL, layers$Name[1])
}, error = function(e) {
  # Handle any errors that occur
  message("Error importing layer: ", e$message)
})
```

### 2. Performance Considerations

When working with WFS services:

```{r eval=FALSE}
# Use appropriate timeout values for large datasets
capabilities <- argentum_get_capabilities(
  url = org$WFS_URL,
  timeout = 60  # Increase timeout for slow connections
)
```

### 3. Data Processing

After importing WFS data:

```{r eval=FALSE}
library(sf)
library(dplyr)

# Check the data structure
str(sf_layer)

# Basic statistics
summary(sf_layer)

# Spatial operations
sf_layer_transformed <- st_transform(sf_layer, 4326)

# Calculate areas if working with polygons
if (all(st_geometry_type(sf_layer) %in% c("POLYGON", "MULTIPOLYGON"))) {
  sf_layer$area <- st_area(sf_layer)
}
```

## Advanced Usage

### Custom Queries

While Argentum provides high-level functions, you can also work with WFS services directly:

```{r eval=FALSE}
# Example of constructing a custom WFS URL
base_url <- org$WFS_URL
query_params <- list(
  service = "WFS",
  version = "1.1.0",
  request = "GetFeature",
  typeName = layers$Name[1],
  outputFormat = "application/json"
)

# Build the URL
query_url <- httr::modify_url(
  url = base_url,
  query = query_params
)
```

## Troubleshooting

Common issues and solutions:

1. **Connection Timeouts**
   - Increase timeout value
   - Check internet connection
   - Verify service availability

2. **Invalid Layer Names**
   - Use `argentum_list_layers()` to get exact layer names
   - Check for case sensitivity
   - Verify layer still exists in service

3. **Data Format Issues**
   - Check supported output formats
   - Verify coordinate reference systems
   - Ensure data compatibility with sf package

## Future Development

Planned features for future versions:

- Spatial filtering support
- Temporal queries
- WMS integration
- Caching mechanism
- Batch export capabilities

## Session Information

```{r}
sessionInfo()
```