--- title: "Coordinate systems" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Coordinate systems} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>") library(leaflet) library(leaflet.indoor) ``` Indoor data commonly use either geographic coordinates tied to the Earth or local Cartesian coordinates tied only to a floor plan. These are separate workflows and are never converted into each other automatically. ## Geographic coordinates For an ordinary Leaflet map, `sf` data must have a declared CRS. Projected and geographic data are transformed to EPSG:4326 before serialization. ```{r geographic, out.width='100%'} leaflet(indoor_demo_geo) |> addIndoor(label = ~name, style = list(fillColor = ~fill)) |> addIndoorControl() ``` GeoJSON follows the same longitude and latitude interpretation. Geographic longitude must be in `[-180, 180]` and latitude in `[-90, 90]`. ## Local Cartesian coordinates Local plans use `L.CRS.Simple`. The `sf` CRS must be undefined and `crs = "simple"` makes the coordinate interpretation explicit. The x coordinate is passed as Leaflet longitude and y as Leaflet latitude, which is how `L.CRS.Simple` represents a Cartesian plane. ```{r simple, out.width='100%'} leaflet( indoor_demo, options = leafletOptions( crs = leafletCRS(crsClass = "L.CRS.Simple"), minZoom = -2 ) ) |> addIndoor( label = ~name, style = list(fillColor = ~fill), crs = "simple" ) |> addIndoorControl(position = "bottomright") ``` The package does not assign a CRS to a local plan, georeference an image, or guess a transformation. Users who need a geographic map must establish that relationship from authoritative control points outside `leaflet.indoor`. ## Proxies A `leafletProxy()` object does not contain the rendered map's CRS options. Geographic `sf` data with a declared CRS remain unambiguous. Local `sf` data without a CRS require `crs = "simple"` when added through a proxy.