# version 1.0-19

* fix type checks in C++ GDAL area and length computation functions, anticipating GDAL 3.10.0; #2466, #2468, #2469 by @rsbivand and @rouault

* improve test on empty geometries, which changed in 1.0-18; #2463

* `gdal_utils()` `ogrinfo` has an argument `read_only` which, when `TRUE` (or `options` includes `"-ro"`), opens a datasource in read-only mode (#2460; `sf` did this before 1.0-17); by default a datasource is opened in update (read-write) mode (since sf 1.0-17; #2420)

* the `sf` -> `ppp` conversion `as.ppp.sf()` accepts a data.frame of marks instead of just 1 column #2450, by @agila5

* add flag for preservation of point order in `st_voronoi` #1371 for GEOS >= 3.12

# version 1.0-18

* support  `POLYGON FULL` simple feature geometry, representing the entire Earth surface, as used by `s2geometry`; see also https://r-spatial.org/r/2024/10/11/polygonfull.html for a longer introduction; #2441

* `st_sfc()` has an argument `oriented` which, when set to `TRUE`, adds an attribute `oriented=TRUE` to an `sfc` object, indicating that this object should not be reoriented in conversion to `s2_geography` (avoiding using the global option `s2_oriented`); `st_as_sfc.bbox()` sets this to `TRUE`; #2441

* fix build failure with GDAL < 3.4.0 #2436

* `st_simplify()` now accepts feature-wise tolerance values when `s2` is switched on #2442

# version 1.0-17

* add `st_transform()` method for `bbox` objects; this uses OGRCoordinateTransformation::TransformBounds(), densifying first and antemeridian proof; #2415

* `st_filter.sf()` correctly scopes `x` and `y` arguments using !! operator; #2416

* `[.sfc` and `[<-.sfc` use matrix/array type subsetting for `sfc` objects that have a `dim` attribute

* add `st_exterior_ring()` to extract exterior rings (remove holes); #2406

* add `text.sf()`, `text.sfc()`, `points.sf()`, `points.sfc()` to annotate base plots at geometry centroids; #2399

* `st_sf()` no longer strips `tbl` or `tbl_df` class labels; #2378

* `st_layers()` returns an object of class `c("sf_layers", "data.frame")`, with a dedicated `print` method.

* when `dim` is not `XYZM`, `sf_as_sf.data.frame()` interprets a length 4 `coords` argument to specify the corners of a rectangular polygon; #2357

* `st_interpolate_aw()` gains an `na.rm` argument, for removing features with `NA` attributes before interpolating; #830

* `merge.sf()` no longer renames geometry column; #2334

# version 1.0-16

* `st_join()` no longer renames the geometry column; #2327

* `st_sample()` works when unprojected polygon geometry crosses the antemeridian; #2331

* clean up and modernization of S3 registration of methods and tests; #2285, #2288, #2316, #2341, #2342, by @olivroy

* `[.sfc` works when setting argument `op`; #2320

* `st_sample()` for polygons is sensitive to setting `oriented = TRUE` to prevent wrongly correcting ring directions; #2308

* add support for the GDAL `footprint` utility (requiring GDAL >= 3.8.0) to `gdal_utils`; #2305, by @goergen95

* existing environment variables `PROJ_LIB` and `PROJ_DATA` are (again) ignored on `sf` binary CRAN installations (win + macos), effectively by overwriting them during the R session and restoring them on exit; this does not happen if environment variable `R_SF_USE_PROJ_DATA` is set to `true`. #2298

* add `st_line_project()` to find how far a point is when projected on a line; #2291

* add `st_line_interpolate()` to obtain a point at a certain distance along a line; #2291

# version 1.0-15

* add `st_perimeter()` generic to cover both geographic and projected coordinates; #268, #2279, by @JosiahParry

* add `st_sample()` method for `bbox`, with special provisions for ellipsoidal coordinates; #2283

* documentation clean-up by @olivroy; #2266, #2285

* `st_convex_hull()` uses `s2::s2_convex_hull()` for geodetic coordinates; #2250

* add `directed` argument to `st_line_merge()`; #2264

* `st_union.sfc()` given `x` and `y` works consistently across geodetic and projected objects; #2262

* `st_union.sf()` given `x` and `y` unions pairwise if `by_feature = TRUE`; #2259

* `st_read()` work around issue with GPKG driver if `wkt_filter` is set; #2248

* `st_read()` uses GDAL's stream reading when `use_stream = TRUE`; #2238 by @paleolimbot

* `st_transform()` responds to in-session changes to `sf_proj_network()`; #2166

* `plot.sf()`: `key.width` is sensitive to pointsize graphics parameter `par("ps")`; keys with factor levels suggest a proper size if they won't fit.

* `plot.sf()`: `key.pos` can hold a second value in [0, 1] determining the relative position of the key in the available space 

* `[<-.sf` fixes the `agr` attribute when it is broken; #2211

* if the env. variable `ADD_SF_NAMESPACE` is set to `true`, `sf` objects get a new attribute, `.sf_namespace`, which forces loading the `sf` namespace when it has not been loaded so far, e.g. for proper printing or plotting of an `sf` object; #2212 by Mike Mahoney

* `distinct.sf()` is type-safe for `sf` objects with zero rows; #2204

* `summarise.sf()` raises an error if `.by` is given but no `across()` on the geometry; #2207

* `st_write()` matches fields on name first, than on position; this matters for formats that have pre-defined names, such as GPX; #2202 

# version 1.0-14

* fix `plot.sf()` when using a key for multiple factor variables; #2196, #2195

* fix use of `as.numeric_version` in a test, for upcoming change in r-devel

* code tidy-ing: fix many lintr suggestions, thanks to Michael Chirico (#2181 - #2191)

# version 1.0-13

* `gdal_utils()` adds `"ogrinfo"` utility (requires GDAL >= 3.7.0); #2160

* `st_as_sf()` catches errors when setting invalid crs values, raised by Jon Skøien

* add `rename_with.sf()` method; #1472

* use GEOS' overlayNG routines for (GEOS) Intersection, Difference, Union and SymDifference; #2143

* added `duplicated.sf()`; #2138, #2140, thanks to @bart1

* `select.sf()` allows selecting the same column twice under different names; #1886

* `st_as_sf.ppplist()` is deprecated; #1926

* `st_cast()` handles empty geometries; #1961

* don't repeat longlat messages in `summarise.sf()`; #1519

* fix random sampling on the sphere; #2133

# version 1.0-12

* update NAMESPACE to `useDynLib(sf, .registration=TRUE)`; #2127 thanks to @eddelbuettel

* fix call in `gdal_addo()`; #2124

* fix issues that came up with older GDAL version, use `GDAL_VERSION_NUM` consistently; #2123 #2121 #2119

# version 1.0-11

* `st_make_grid()` also accepts area units for `cellsize`, for square and hexagonal grids; #1505

* add `st_concave_hull()`, for concave hulls, if GEOS >= 3.11.0; #1964

* add `st_triangulate_constrained()`, for constrained Delaunay triangulation, if GEOS >= 3.10.0; #1964

* clean up the retrieval of length or angle units from WKT representations; https://lists.osgeo.org/pipermail/gdal-dev/2023-March/056994.html

* conversion to GEOS uses the `GEOS_PREC_VALID_OUTPUT` flag, which makes sure that the "[o]utput is always valid. Collapsed geometry elements (including both polygons and lines) are removed."

# version 1.0-10

* `gdal_utils()` has a `config_options` argument to set further GDAL options, just like `st_write()`; #2003

* fix slow writing of logical vectors in `st_write()`; #1409; #1689

* `st_drivers()` has an argument `regex` to filter on driver (long) name; #2090

* drop C++11 as a system requirement

* `c.sfc()` (and, consequently, `dplyr::bind_rows()`) gives an error if components have different CRS; #1884

* data imported from `maps` are associated with the Clark 1866 ellipsoid; #2080

* fix importing legacy `SpatialPolygon` objects without comments; #2063, #2069, https://github.com/rstudio/leaflet/issues/833

* `st_read()` no longer errors on mixes of `XY` and `XYZ` geometries; #2046 #1592

* in `plot.sf()`, when numeric `breaks` are given a legend key is always plotted; #2065

* `st_crs()$axes` returns a `data.frame` with axes properties (name, orientation, conversion factor) when GDAL >= 3.0.0

* clean up unit handling for geometry measures (length, area, distance) and crs; 

* `st_crs(x)$ud_unit` returns `NULL` if units are unknown; #2049

* `st_write()` substitutes an `NA` crs with `ENGCRS["Undefined Cartesian SRS with unknown unit"]`; #2049, #2054

* `st_can_transform()` checks whether a transformation between two crs exists; see https://github.com/dieghernan/tidyterra/issues/64; #2049

* the matrix returned by `st_coordinates()` has no row names, to reduce output size

# version 1.0-9

* adjust for changes how R-devel handles `POSIXlt`; #2028

* add `st_break_antimeridian()`; #1983, #1991 by Roger Bivand

* add `Fibonacci` as a spatial sampling type in `st_sample()`

* use the global `options("sf_use_s2")` to determine whether to use s2, rather than a value in a local environment; #1977

* fix utils `mdiminfo` and `mdimtranslate` in `gdal_utils()` 

* extend arguments of `gdal_read_mdim()` needed by `stars::read_mdim()` if `stars` >= 0.5-7; add `gdal_write_mdim()`

* add `drop_na()` method for `sf` objects; #1975

# version 1.0-8

* `st_drop_geometry.default()` returns `x` unmodified;

* `sf_project()` accepts 3- or 4-column matrices, containing z and t values;

* optimization for `st_sfc()` by @paleolimbot; #1938, #1925

* `[<-.sfc()` recomputes the bounding box; `st_sfc()` gets parameter `compute_bbox`; #1965

* add new algorithm and drop option to `st_make_valid()` when using GEOS and GEOS >= 3.10.1; #1655

* add `st_minimum_rotated_rectangle()`, available when GEOS >= 3.9.0; #1953

* fix `st_sample()` with `type = "hexagonal"` for corner case (n=1), add a `progress` argument for a progress bar; #1945

* add package `pbapply` to Suggests; #1945

* add pdf driver to windows build; #1942

* clarify `pipeline` argument in `st_transform()` when axis order is ambiguous; #1934

* handle argument `xpd` in calls to `plot.sfc_POLYGON()` and `plot.sfc_MULTIPOLYGON()`

* add `pivot_wider()` method, by Henning Teickner; #1915

* add `gdal_addo()` to add or remove overviews from raster images; #1921

* `st_layers()` returns `crs` of each layer in a `crs` list of `crs` objects

* restore `st_graticule()` behaviour to pre-sf 1.0-0; https://github.com/tidyverse/ggplot2/issues/4571

* `gdal_metadata()` sets metadata item names properly

* `st_read()` gains an argument `optional` passed on to `as.data.frame` to avoid changing column names; #1916

* GPX files are autodetected by `st_read()`; #1917

* unnecessary coordinate names are not returned in `st_sample()`, making the output size smaller; #1879

# version 1.0-7

* `st_drop_geometry()` is a generic; #1914

* `st_crs(x)$ud_unit` returns the unit of the coordinate reference system of `x`

* geometric predicates return `sgbp` objects omitting self-intersections etc. by passing `remove_self = TRUE` and unique symmetric relationship by passing `retain_unique = TRUE` (to `...` if needed); this simplifies identifying (and removing) duplicated geometries; duplicates are identified by e.g. by `st_equals(x, retain_unique = TRUE) |> unlist() |> unique()`; #1893

* fix compile issue against GDAL < 2.5.0 introduced in 1.0-6; #1899

# version 1.0-6

* adapt to new `spatstat.random` package; #1892

* `st_geometry<-()` also allows to rename a geometry column in an `sf` object; #1890

* for `sf` objects, the `st_as_sfc()` method is an alias for `st_geometry()`; #1882

* `st_make_grid()` speeded up; #1579 thanks to Krzysztof Dyba

* remove direct and indirect dependencies on `rgeos` and `rgdal`; #1869

* use `stats::dist` rather than GEOS for symmetric point-point Euclidian distance computation; #1874

# version 1.0-5

* package startup message reports status of `sf_use_s2()`; #1782

* `sf_use_s2()` uses `message()` to report a change; #1782

* `st_sample()` using regular sampling for ellipsoidal coordinates "works" as if coordinates were Cartesian; #1837

# version 1.0-4

* new function `st_delete()` deletes a data source, or layer(s) within a data source; #1828

* fix memory leak in `WKT1_ESRI` retrieval; #1690

# version 1.0-3

* cope with how GEOS >= 3.10.0 handles illegal geometries (e.g., non-closed rings); #1807

* `crs` objects have a `$srid` method to extract the SRID (as authority "name:code"); #1804

* `st_as_grob()` methods for `sfc_*` objects correctly handle empty geometries; #1789 with help from Hiroaki Yutani

* when writing objects with `NA` as CRS to GeoPackage, assign "Unknown Cartesian CRS" first - this is in line with using Cartesian geometry operations for objects with `NA` as CRS; #1776

* add coerce method from `sgbp` to `sparseMatrix`; #1750

* fix `st_cast()` for `GEOMETRYCOLLECTIONS` containing empty geometries; #1767

* fix `st_is_valid()` for bogus polygons and projected coordinates; #1666, #1760; #1761

# version 1.0-2

* `st_read()` and `st_write()` using GDAL handle binary attributes (OFTBinary fields) ; #1721

* a `pivot_longer` method is added for `sf` objects (the `data.frame` method works, but raises a warning)

* `rbind.sf` preserves primary geometry column; #1717

* `configure` constrains using `--static` to `Darwin` platform; #1702, #1712, #1713

* old-style `crs` objects created with sf < 0.9-0 generate a message, and will cause a warning in the future.

* when `st_crs()` is called with a WKT2 as text input, its `input` field will be replaced with the CRS name (if it has one).

* GEOS (>= 3.9.0) operations use `GEOSGeom_setPrecision_r` to set precision of geometries; #1535

* `st_read()` with specified `query` ignores argument `layers`, and warns if it is given; #1444

# version 1.0-1

* fix regression in `st_intersection()`: when using s2 attributes were assigned wrongly; #1704

* `crs` (sf) to `CRS` (sp) conversion no longer needs validation by `rgdal`; https://github.com/edzer/sp/issues/107

* retrieve ESRI's WKT version of CRS by `st_crs(id)$WKT1_ESRI`; #1690 

# version 1.0-0

* add `s2` to Imports:

* add Dewey Dunnington to contributors

* `sf_use_s2()` prints a message when using s2 has been switched to on or off.

* use `s2` spherical geometry as default when coordinates are ellipsoidal. This can
  be switched off (defaulting to planar geometry, using GEOS, as in sf < 1.0-0) 
  by setting environment variable `_SF_USE_S2` to `false` before package `sf` 
  is loaded, or by `sf_use_s2(FALSE)`; #1649

* `st_nearest_feature()` with missing `y` returns nearest features in the remaining set of `x`; https://github.com/r-spatial/s2/issues/111

* `st_write()` gains an argument `config_options` to set GDAL config options; #1618

* fix regression in `sf_project(..., keep = TRUE)`; #1635

# version 0.9-8

* add `st_as_sf()` method for terra's `SpatVector` class; #1567

* `distinct.sf()` works by default on all variables, and keeps active geometry active; #1613

* improve (fix?) polygonize/contour code; #1608

* `sf_proj_network()` reports whether PROJ uses network (CDN) grids, can switch it on or off, and can set the CDN url.

* `st_write()` returns obj, invisibly; #1597

* fix regression in n-ary `st_intersection()`, #1595, introduced at #1549

* `st_inscribed_circle()` computes the maximum inscribed circle for polygons (requires GEOS >= 3.9.0)

* allow to `st_cast()` from COMPOUNDCURVE, MULTISURFACE or CURVEPOLYGON to GEOMETRYCOLLECTION, and back; #1573

* Fixed a bug in `st_as_grob()` when plotting a mix of MULTI and non-MULTI geometries of the same base type

# version 0.9-7

* n-ary `st_intersection()` skips failing geometries, rather than returning an error; #1549

* use `s2_centroid()` for geographical coordinates if `sf_use_s2()` is `TRUE`.

* `st_as_text()` method for `crs` objects can return projjson (if GDAL >= 3.1.0 and PROJ > 6.2.0)

* `st_transform()` no longer warns on conversions like `"+proj=ob_tran +o_proj=longlat +o_lat_p=45 +o_lon_p=30"`

* `st_as_wkb()` takes `srid` from `wkt` field of `crs` when `input` field doesn't contain it; #1490

* `plot.sf()` adds `key.pos=0` option to run the logic behind the key without plotting it; #1487

* fix bug in `select.sf()` when selected variables were renamed; #1483

* `st_as_sf.stars(..., merge = TRUE)` now works if CRS is `NA`; #1389

* add (dynamically loaded) `as_wkb()` methods for `sf`, `sfc` and `sfg`, making `st_as_s2()` unnecessary

* `st_as_s2()` transforms non-longlat objects to EPSG:4326 first

# version 0.9-6

* `gdal_utils()` print (GDAL-style) progress bar if `quiet = FALSE` (except for `info` and `mdiminfo`)

* fix `CPL_gdal_warper` for multi bands; https://github.com/r-spatial/stars/issues/320

* `sf_proj_search_paths()` retrieves and sets the proj search path (if GDAL > 3.0.3)

* when loading sf, `sf_use_s2()` is set to `FALSE` unless environment variable `_SF_USE_S2` equals `true` (this changes to `TRUE` in sf 1.0-0)

* resolve GDAL/PROJ version vulnerabilities in CRS-crs conversion; #1479

* `st_sample()` gains an argument, `by_polygon`, to more clevery sample `MULTIPOLYGON` geometries; #1480

* `st_sample()` accepts non-integer sample sizes, with a (suppressable) warning and handles values of sizes that would round to zero; #1480

* `gdal_utils()` adds utils `mdiminfo` and `mdimtranslate` (requires GDAL >= 3.1)

* `st_union()` gains an argument `is_coverage`, which, when set to `TRUE`, leads to much faster unioning in case features form a coverage (polygons don't overlap); #1462 by Don Baston

* fix `gdal_utils("translate")` locking input file; #1452

* `st_make_grid()` no longer selects cells intersecting with `x`; #1447

* use `s2::s2_dwithin_matrix()` in `st_is_within_distance()`; #1367

# version 0.9-5

* Only when package `s2` >= 1.0.1 is available: support for spherical geometry operators (predicates, transformers, measures, nearest point/feature) for geographic coordinates in package `s2` is now by default switched off, and can be switched on by `sf_use_s2(TRUE)`; see https://www.r-spatial.org/r/2020/06/17/s2.html and vignette sf7. It is planned to be switched on by default in sf 1.0-0.

* drop Z and/or M coordinate in `st_as_s2()`, with message

* geometry predicates and transformers gain an ... argument to pass `s2::s2_options()`

* `dplyr::select()` now ensures the geometry column sticks to the back rather than the front of the data frame; #1425

* `dplyr::rename()` now preserves the active geometry column even when it is renamed; #1431

* proj units query adjusted to PROJ 7.1.0 release; #1434

# version 0.9-4

* empty geom generators take care of XYZ etc dim; #1400

* `write_sf()` and `read_sf()` no longer warn when reading tables without geometries

* `st_write()` writes non-spatial tables when given a plain `data.frame` or `tbl_df`; #1345

* the default for `stringsAsFactors` in `st_read` and `st_sf` is `FALSE` for R version >= 4.1.0

* the sf method for `dplyr::select()` supports renaming the geometry column; #1415

# version 0.9-3

* `st_is_valid()` is a generic

* Windows CRAN binaries use GDAL 3.0.4, PROJ 6.3.1 and GEOS 3.8.0, thanks to Jeroen Ooms' rwinlib work; #1275

* `plot.sf()` gains an `extent` argument to set the extent (xlim, ylim) of the plot; `extent` must be an object with an `st_bbox()` method, such as an `sf` or a `stars` object; #1193

# version 0.9-2

* `st_axis_order(TRUE)` gives and error if GDAL has version < 2.5.0

* loading PROJ units `link`, `us_in`, `ind_yd`, `ind_ft`, and `ind_ch` into the udunits database is no longer done at package load time, but when function `sf_add_proj_units()` is called.

* fix line sampling for small densities; #1365

* `sf_project()` handles `crs` objects when PROJ version is below 6 using proj.4 string representations.

* avoid using `isFALSE` in `st_write()`; #1342

* fix regression in `gdal_utils("translate", ...)`; #1339

# version 0.9-1

* fix an invalid read bug in `st_m_range()`; #1332

* `st_crs(4326) == st_crs("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")` returns `TRUE` for GDAL >= 3.0, irrespective authority compliance of axis order; see #1331 and https://github.com/ropensci/scrubr/issues/34

* `sf_project()` has a parameter `authority_compliant` to return coordinates in "visualisation order"; when `TRUE` it returns coordinates in authority compliant axis order (e.g. EPSG:4326 latitude longitude); default is `st_axis_order()`.

* fix test for Solaris and certain GDAL/PROJ versions

* fix error reading category table through GDAL; https://github.com/r-spatial/stars/issues/245

# version 0.9-0

* see r-spatial blog post: https://www.r-spatial.org/r/2020/03/17/wkt.html

* modify `crs` objects to reflect our post-proj4string world (#1146; #1225): crs objects contain two fields, `input` with the user input (if any), and `wkt` with a well-known-text  (or WKT2) representation of the coordinate reference system. `crs` objects have a `$` method to dynamically retrieve the `epsg` (integer) or `proj4string` representation, using e.g. `x$epsg`.

* support for PostGIS 3 using WKT and the new-style `crs` objects; #1234, #1303, #1308 by @etiennebr

* `st_write_db()` and `st_read_db()` are defunct. Use `st_write` and `st_read` instead.

* `st_write()` uses `append`, replacing (and deprecating) argument `update`; `st_write` fails when a layer already exists and `append` has not been set explicitly to `TRUE` (append) or `FALSE` (overwrite); #1266

* `st_proj_info()` was renamed into `sf_proj_info`; `sf_proj_info` can get and set the PROJ data search path and use of CDN; #1277

* adapt to new `dplyr` version; https://github.com/tidyverse/dplyr/issues/4917

* `st_sample()` is a generic

* write `stars` rasters with wkt info, rather than proj4strings

* when GEOS >= 3.8.0, `st_make_valid` is provided by `sf` rather than by `lwgeom` #989

* allow for single-sided buffers for linear geometries; #1001

* add `st_reverse()` methods to reverse points in a linestring (requires GEOS >= 3.7.0); #1246

* `st_make_grid()` returns grid cells or points that intersect with the target geometry, not its bounding box; #1260

* allow for PROJ >= 7; #1254

* `st_geometry_type()` accepts `by_geometry` argument; #1264

# version 0.8-1

* `st_as_sf.map()` no longer requires `maptools` and `sp`; dropped dependency on maptools.

* work around a bug in 6.0.0 <= PROJ < 6.3.1: replace `+init=epsg:XXXX ...` strings with the `XXXX` EPSG integer, to work around a bug in PROJ; see https://github.com/OSGeo/PROJ/pull/1875 and links therein. If `...` arguments are present, raise a warning that these are ignored. 

* `st_as_sf.map()` no longer requires `maptools` and `sp`; drop dependency on maptools.

* conversion between `spatstat` classes `owin`, `ppp` and `psp` and `sf` classes no longer use `maptools`; #1204

* `gdal_utils()` processes open options `-oo` and `-doo` properly; https://github.com/ITSLeeds/geofabric/issues/12

* `st_sample()` directly interfaces `spatstat` sampling methods, e.g. `type = "Thomas"` calls `spatstat::rThomas` after converting input arguments (window) and converts returned `ppp` object to `sf`'s `POINT` geometries; #1204 with help from Ege Rubak and Jakub Nowosad

* `sf_project()` gains an option `keep = TRUE` to return `Inf` values for points not projectable; #1228

* support `vctrs` methods for geometry list columns; this makes `unnest` work again (#1172); #1196 by Lionel Henry

* `st_as_sf.pq_geometry()` converts binary geom columns from RPostgres::dbGetQuery; #1195

* `st_cast()` can convert `MULTICURVE` to `MULTILINESTRING`; #1194

* `st_read()` gains a parameter `wkt_filter` for spatially filtering the features to be read; #1192

* `st_area()` and `st_length()` handle `+to_meter` argument in PROJ strings; #1170

* add `st_filter()` generic for filtering on spatial features only; #1148

* a new UBSAN error in `wkb_read()` was resolved; #1154, #1152

* new method `st_shift_longitude()` to re-center data for a Pacific view. #1218

* output of `st_as_text()` with `MULTIPOINT` has nested parentheses around points. E.g., `MULTIPOINT ((0 0), (1 1))` instead of `MULTIPOINT (0 0, 1 1)`; #1219, #1221

# version 0.8-0

* fix tests for PROJ 6.2.0 not accepting +units=

* fixes for tidyr 1.0-0 release; attempt to port `nest.sf()` and `unnest.sf()`; #1068, #1145

* `gdal_utils()` better closes connections after use; #1143

* `st_write()` gains a `drivers` options, to limit the drivers attempted; #1142

* rather than replacing, `st_write()` and `write_sf()` append to an existing layer if `update=TRUE`; #1126

* improve plotting of `POSIXct` and `Date` attributes (`Date` requiring classInt >= 0.4-2)

* `NULL` geometries read by GDAL are returned as empty geometries; #1119

* `gdal_utils('rasterize', ...)` accepts non-existing destinations, defined by e.g. resolution and extent options (see #1116 for an example), and overwrites if needed (see #1136 for an example)

* add Dan Baston as contributor; #1120 and many others

* in addition to `NULL`, `st_sfc()` also converts `NA` values into empty geometries; #1114.

* `st_join()` is a generic

# version 0.7-7

* `plot()` handles `POSIXct` values in legend

* constructor functions like `st_linestring()` check and break on `NA` coordinates; #1101, #1102

# version 0.7-6

* have examples of `st_write` write only to the temporary R session directory

# version 0.7-5

* `as(x, "Spatial")` gives a proper error message on empty geometries; #1093

* `st_cast()` takes care of empty polygons; #1094

* `st_nearest_*` functions warn in case they are used with geographic coordinates; #1081

* `st_union()` no longer segfaults on zero row `sf` objects; #1077

* `st_transform()` no longer breaks on zero row `sf` objects; #1075

* when PROJ >= 6.1.0 is available and sf comes with datum files (as is the case with statically linked Windows and OSX CRAN binaries), `PROJ_LIB` is no longer temporarily overwritten, but the PROJ C api is used to set the datum path; #1074, suggested by Jeroen Ooms

* sf compiles against GDAL 3.x and PROJ 6.1.0, using the new `proj.h` interface; #1070

* `st_distance()` returns `NA` for empty geometries, rather than 0; #1055

# version 0.7-4

* add example on how voronoi polygons can be tied back to the points they contain; #1030

* `st_difference(x, y)`, with `x` an `sfc` with zero feature geometries, returns `x`; #1024

* don't reset (base) plot device when `add = TRUE`

* `==` and `!=` return `NA` when one of the operands is an empty geometry; #1013

* `st_intersects()` is a generic

* drop requiring `proj_api.h` in favor of `proj.h`, this enables compatibility to PROJ 6.0.0 and GDAL 2.5.0-dev; #988

* fix regression in binary predicates introduced in #855; #999 reported by Barry Rowlingson

* fix bug in `gdal_utils` util `warper` on certain GDAL/OS combinations; https://github.com/r-spatial/stars/issues/117

* `c.sfc()` ignores the type (class) of empty `sfc` objects when choosing the result type; #985, #982

* rename the default value for `distance` to `"Euclidean"`, rather than  `"distance"` in `st_distance()`

# version 0.7-3

* add argument `exact` to `st_sample()`, defaulting to `FALSE`; #896

* fixed n-ary `st_difference()` for cases where geometries are entirely contained in others; #975, by Jonathan Marshall

* faster `Ops.sfc()`, added `st_normalize()`; #973 by Thomas Lin Pedersen

* new grob constructor for sfc objects; #971 by Thomas Lin Pedersen; add Thomas as contributor

* add `group_split()` and `group_map()` methods for `sf` objects (experimental); #969

* make `st_interpolate_aw()` a generic;

* argument `col` for `plot` of `GEOMETRY` `sfc`'s is `NA` (open) for (multi) polygon geometries

# version 0.7-2

* feature IDs are no longer returned as names on the geometry list column, but optionally returned by `st_read` as attribute column; #812

* when plotting multiple attributes, plot.sf adds a (single, common) key if `key.pos` is set

* precision can be specified in distance units; #901

* support log-scale in color legend by setting `logz` to `TRUE` in `plot.sf`

* `st_intersects()` etc. will prepare `y` when `y` is polygons and `x` is points; #885 by Dan Baston

* `st_write()` (and `write_sf()`) returns its first argument, invisibly; #889

# version 0.7-1

* fix bug that broke n-ary `st_intersection()` on platforms using clang; #867

# version 0.7-0

* adds several interfaces to GDAL functions, meant to be used by package `stars`

* `st_read()` receives a `query` argument that can run queries against OGR datasets; #834, by Barry Rowlingson and Michael Sumner

* `read_sf()` no longer first creates tibbles from `data.frame`s, but creates them directly; #853, db propagation by Etienne Racine

* check difference between compile-time and run-time GEOS versions; #844

* all GEOS routines are (more) robust against memory leaks, by using unique pointers; #822, #845, by Dan Baston

* `st_buffer()` receives the buffer styles `endCapStyle`, `joinStyle` and `mitreLimit`; #833, #842 by Michael Sumner

# version 0.6-4

* `st_area()` is a generic; https://github.com/r-spatial/stars/issues/32

* `st_write()` resolves `~` correctly; #456

* read and write feature IDs as sfc list column names; #812

* `st_centroid()` works for empty geometries, returning an empty point #769

* add `st_nearest_points()`, to obtain the (`LINESTRING` connecting the) two nearest points for pairs of geometries; #788

* add hexagonal tiling to `st_make_grid()`

* add regular and hexagonal sampling to `st_sample()`

* fixes for PROJ 5.0.1; #545

* fixes for GDAL 2.3.0; #759

* `st_sample()` supports regular sampling of `LINESTRING`; #725 by @statnmap 

* Support reading and writing of database `Pool` objects; #756

* fix plotting of `sf` objects without attributes; #755

* add reference to the [R Journal article](https://journal.r-project.org/archive/2018/RJ-2018-009/index.html) in CITATION

# version 0.6-3

* move dependency `RPostgreSQL` from Imports: back to Suggests:

* `st_centroid.sf()` and `st_point_on_surface.sf` also warn if attributes are not constant over geometries.

* `summarise()` allows the user to define geometries for summaries; #714, by Kirill Mueller

* `plot.sf()` emits a warning if `col` does not have length 1 or `nrow(x)`, and requires `pal` (rather than `col`) to set a palette for factors.

* `plot.sf()` provides control over legend keys using `key.length` and `key.width`, decrease default key length; #731

* `sgbp` objects receive an `as.data.frame` method; #715

# version 0.6-2

* GDAL read/write supports logical variables; #722

* add `st_crop()` to simplify cropping objects with a rectangular area; #720

* fix bug in `[<-` when columns are added to an `sf` object; #718

* use dynamic registration of S3 methods, similar to how hms does this; #710 by Kirill Mueller

* (partially) address writing GPKG to network drive, writing to temp file first; #628

* add Kirill Mueller as contributor

* `st_make_grid()` is faster; #708, by Dan Baston

* `st_read()` and `st_write()` are generic, with methods for directly reading from and writing to database connections; `st_read_db` and `st_write_db` are deprecated; #558, thanks to Etienne Racine @etiennebr

* Package `RPostgreSQL` moved from Suggests to Imports

* restore compatibility with GDAL 2.0.x versions (which won't have `gdal_utils`); #686

* `read_sf()` can also read tables without geometry; #684, by Andy Teucher

# version 0.6-1

* method `distinct()` works; #669, #672

* `+`, `-`, `*` and `/` for pairs of geometries (`sfg`, `sfc`) return geometric union, difference, intersection and symmetric difference, respectively.

* `st_cast()` from `MULTIPOLYGON` to `MULTILINESTRING` should work properly; #660

* all Rcpp interfaces needed by package `stars` have been moved into `sf`; pkg `stars` is R-only, and only `sf` needs linking to GDAL.

* `gdal_utils()` interfaces the 9 gdal utils using the C++ API

* improve resetting (base) plots; add `reset = FALSE` in a call to `plot` to enable adding to plots that have a legend

* `st_read()` returns a `data.frame` when a table contains no geometries, rather than giving an error; it does emit a warning in this case. See https://stat.ethz.ch/pipermail/r-sig-geo/2018-February/026344.html

* move `pillar` from `Imports:` to `Suggests:`

* update to the new rwinlib distribution of gdal (adds JPG2000); #639

* speed up computation of centroids for largest polygon; #623

* add `st_as_sfc.raw` method

* Bugfix: binary operations (`st_intersection`, `st_difference`, etc) no longer fail when operating on data frames of class `"tbl_df"` with common column names; #644

# version 0.6-0

* add `pillar` to Imports: to provide method for printing WKT geometries in tibbles

* `st_as_text`, and subsequently `format` and `print`, use argument `digits` (or `options(digits = n)`) to control the number of digits used for printing coordinates; default is `options("digits")`, which is typically 7.

* `st_is_within_distance` works with geographic coordinates

* `st_cast` from `MULTIPOLYGON` to `MULTILINESTRING` no longer changes the number of features/feature geometries, but conversion from `MULTIPOLYGON` to `LINESTRING` (typically) does; #596

* `st_distance` for long/lat geographic coordinates uses `lwgeom`, accepting all geometry types; argument `dist_fun` is deprecated as a consequence, and distance calculations are different from those in sf versions 0.5-5 or earlier; #593

* add package `lwgeom` to Suggests; `st_area`, `st_length`, `st_distance`, `st_segmentize` for long/lat CRS use package `lwgeom` instead of `geosphere`; #593

* `st_length` returns zero for polygon-type geometries; #593

* if present, add units of attribute to default plot title; #591

* add `unnest` method, which depends on `tidyr` > 0.7-2; #570 PR by @karldw

* add `largest` option to `st_join` to get largest intersection match only; #547, by @tiernanmartin

* change default maximum number of feature to print to 10, controllable by `options(sf_max_print)`; #556

* add `Hausdorff` (and `Frechet` for those with GEOS 3.7.0) as options to `st_distance`; add `par` for densified versions

* add `st_snap`, for snapping geometries to other geometries, within a tolerance

* make `st_wrap_dateline` a generic, with methods for `sf`, `sfc` and `sfg`; #541

* `plot.sf` and `st_as_grob` (used by ggplot2) are robust against misspecified ring directions (holes that have the same direction as the exterior rings), by using `rule = "evenodd"`; #540

* functions depending on `liblwgeom` (`st_make_valid`, `st_geohash`, `st_plit`) have been moved to their own package, https://github.com/r-spatial/lwgeom; argument `use_gdal` of `st_transform` has been deprecated, instead one can use `lwgeom::st_transform_proj`; sf no longer tries to link to liblwgeom; #509, #537, #487

* `st_read`, `st_sf` and `st_sfc` gain a parameter `check_ring_dir` (default: `FALSE`) that checks ring directions and corrects to: exterior counter clockwise, holes clockwise, when seen from above.

* get rid of `classInt::classIntervals` warning if number of unique values is smaller than the number of breaks asked for

# version 0.5-5

* have `classInt` in Imports:, to not break other package checks

* add vignettes 5: plotting sf objects and 6: miscellaneous; #324

* add (default) color key to `plot.sf` if single map is plotted, contributed by @hughjonesd; #528 

* `st_as_sfc` can read EWKT; #530

* argument `max.plot` takes its default from `options(sf_max.plot=n)`, if present; #516

* `plot.sf` gets an arguments `pal` to specify a color palette function; #526

* `plot.sf` gets arguments `breaks` and `nbreaks`; add support for `classInt::classIntervals` styles for finding class intervals (using `breaks`)

* add `st_as_sf` methods for `ppp`, `lpp` and `psp` objects from spatstat.

* allow for direct route to proj.4 ignoring GDAL (requiring liblwgeom); #509, #511

* add `print` method for `crs` objects; #517

* `sf_extSoftVersion` reveals whether GDAL was linked to GEOS; #510

* better check input of `st_polygon`; #514

* add `st_node`, similar to `rgeos::gNode`

* support for reading `OFTInteger64List` fields; #508

* sparse geometric binary predicate lists have a class, `sgbp`, and attributes `region.id` and `predicate`; #234, #524

* prevent `st_split` from stopping the R session; #492

* `st_intersection`, `st_union` and so on also print a message when used directly on long/lat coordinates; #496

* add `rep` method for `sfc` objects

* comparing two `crs` objects uses the GDAL function `IsSame`; #180

* add `st_collection_extract`, which, given an object with geometries of type `GEOMETRY` or `GEOMETRYCOLLECTION`, returns an object consisting only of elements of the specified type; by Andy Teucher, #482

* `st_write` exports GeoJSON with UTF-8 encoding on Windows; #444

* move package methods from Imports: to Depends: ; #478

* deal better with precision setting and propagation; #476

* fix bug in `st_layers` in case layers have no geometry; #334

* clarify argument `envelope` in `st_voronoi`; #474

* change aggregate to make it return the same geometry as 'by', padding attributes with NA where needed; #453 

# version 0.5-4

* fix compatibility problems introduced by `tidyr` 0.7-0 using rlang magic

* convert path names to UTF-8 in `st_read`, `st_write` and `st_layers`; #471

* `st_sfc` converts `NULL` values into empty geometries, and correctly identifies empty `POINT`s; #466, #463

* `st_write` abbreviates column names if driver is `ESRI Shapefile`; #464

* add `of_largest_polygon` argument to `st_centroid`, to get the centroid of the largest polygon; #450

* fix use of `st_relate` as join predicate for `st_join`; #454

* fix bug where `st_intersects` with empty second argument would crash; #458

* produce better WKT; #463

* fix bug in `st_cast.sf`; #461, #462

* change `st_read` SRS assignment logic; corrects reading projected geojson with gdal 2.2.0; #449

* `st_intersection` etc. on `tbl` also return `tbl`; #448

* `[.sf` preserves class, e.g. of `tbl`; #448

# version 0.5-3

* support and propagate all Proj.4 +units=xx length units; #446

* allow for arith ops on empty `sfc` objects

* have `st_graticule` return an empty graticule object when argument `datum` is `NA`; 

* export `as_Spatial`, to make it easier for packages to convert `sfc` objects without importing `sf`

* `st_distance` gains a parameter `by_element` to obtain pairwise distances; #437

* add the ability to `aggregate` using a simple feature `by` argument; #429

* make the `op` argument to `[.sf` work

* speed up `st_coordinates` for `POINT` geometries; #433

* fix performance regression for `st_bbox`; #418

* correct bug in `st_union`, `st_difference` and `st_sym_difference` introduced in 0.5-2; #431

* inform gdal about the CRS always through the proj4string, never through the epsg; see #424

* properly deal with kilometre units; #424 (fixed by Karl Dunkle Werner)

* add `st_is_within_distance`, only to return a sparse index matrix; #419

* have `st_graticule` work with world2 (0,360); #421, #422, fixed by Ben Best

* `st_graticule` to return graticules in native crs; https://github.com/tidyverse/ggplot2/issues/2200 (WIP)

* `st_graticule` to support data in `NA_crs_`; https://github.com/tidyverse/ggplot2/issues/2199

* fix bug when joining an sf-tibble with a `tibble`; #414

* read gdal `StringList`, `RealList`, and `IntegerList` fields into a list-column; #416

# version 0.5-2

* made ready for rwinlib/gdal2; #408

* make `[.sf` for selections including `NA` values like `x[c(1,NA,2)]`; #403

* add a `[<-` method for `sfc` objects; automatically replaces `NULL` with an empty geometry; #411

* add `st_point_on_surface()` to return a point that is guaranteed to be on the surface (standard compliance)

* `read_sf` returns an sf-tibble, an object of class `c("sf", "tbl_df", "tbl", "data.frame")`

* work around for `dplyr::filter` not dispatching geometry column subsetting to `sf::[.sfc`

* allow `units` object as `dist` argument to `st_buffer`; these must be convertable to `arc_degree` for geographic, and to a length unit for non-geographic data; #399

* prevent gdal from crashing when trying to `st_transform` an empty geometry; #398

* add `st_as_sfc` method for `bbox`, returning the bbox polygon; #377

* strip file name extension from default layer name in `st_write`; #392

* have `st_sf` replace `NULL` values in an `sfc` list-column with the appropriate empty geometry; #372

* allow setting `ndiscr` through `ggplot2::coords_sf` to improve graticule plotting in `geom_sf`; #396

# version 0.5-1

* add spatial indexes to most binary geometry operations; #394 and http://r-spatial.org/r/2017/06/22/spatial-index.html

* drastically reduce memory footprint of `st_intersection` and similar; #394

* support RSQLite 2.0 by providing an `st_as_sfc` method for list columns of class `blob`

* drop dependency on dbplyr

# version 0.5-0

* better handle empty/NULL geometries in shapefiles; #351

* add `unite_.sf` method

* deprecate `FUN` argument to `st_join`; #376

* improve graticule tic label placement in `ggplot2`; #375 and https://github.com/tidyverse/ggplot2/issues/2119

* improve `configure` logic to deal with libraries installed in custom locations; #335

* fix bug where `geom_sf` wouldn't deal with Z and/or M geoms; #373

* return more conveniently typed empty geoms; #372 

* fix subsetting with `[` of `sf` using `drop = TRUE`, #370

* in addition to `m`, allow `rad` units to `st_segmentize` 

* add example how to `st_read` GeoJSON from a string; #185

* add `separate_.sf` method

* add `st_split` to split geometries (only available if compiled against liblwgeom), #359

* fix bug reading and writing dates (months 1 off): #358

* [.sf and [.sfc also select on i when i is an `sfg` object, and accept a geometric predicate function with optional arguments; #352

* on reading through GDAL, empty (NULL) geometries no longer result in an error; on creation, they no longer automatically give a `GEOMETRY` object; #351

* on plotting with `ggplot2::geom_sf`, empty geometries no longer break; grid functions return `nullGrob()` for them; #351

* arith operations on empty geometries no longer break or give warnings; #351

* have `st_as_sf.data.frame` by default break on `NA` values in coordinates; #342

* have `st_join` accept further arguments, to be passed on to the `join` function (e.g. a pattern for `st_relate`)

* have WKB reader throw an error on (some) malformed inputs, and check for buffer bounds

# version 0.4-3

* back-port `do_union` argument to dplyr <= 0.5.0, using lazyeval

* all strings returned from OGR/GDAL get encoding set to `UTF-8`, making them work on non-UTF-8 platforms; #5

* `$.crs` retrieves proj4string components, such as `st_crs(4326)$datum` in addition to `epsg` and `proj4string`

* let `st_geohash` return geohash for (average) points (only when sf was linked to liblwgeom)

# version 0.4-2

* `summarise.sf` always returns an `sf` object, also for global (non-grouped) summaries.

* `summarise.sf` gains an argument `do_union` which determines whether to union the geometries for which a summary is given, or to `st_combine` them (not resolving boundaries); #331

* rename argument `union` of `aggregate.sf` into `do_union`, for consistency with `summarise`; #331

* add a `nest_` method for `sf` objects

* `st_relate` gets a `pattern` parameter, same as `rgeos::gRelate`; add examples to get rook and queen neighbour lists using this; #234

* support for direct reading of spatialite and sqlite geometry wkb blobs

* build proper support for `cbind` and `rbind` methods for `sf`, which work (as documented) when _all_ arguments are of class `sf`; `dplyr::bind_cols` or `st_sf(data.frame(sf, df))` work for binding `data.frame`s to an `sf` object.

* `st_segmentize()` and `st_line_sample()` accept units arguments

* document problem reading shapefiles from USB drives on OSX; #252

* improve docs of `st_is_valid` and `st_make_valid`; #296

* coercing `sf` to `data.frame` works better; #298

* `st_line_sample` gains argument `sample` to specify the points t.b. sampled; #299 #300 thanks to @joethorley

* add compatibility to upcoming dplyr 0.6.0; #304 #42

* write GDAL fields by name, not by number, fixing a KML problem #308

* `st_write` gains arguments `delete_layer` and `delete_dsn` to allow overwrite capability #307 #274

* `write_sf` defaults to `delete_layer=TRUE`, silently overwriting layers if they're already present

* compatibility with GDAL 2.2beta0; #303; #309

* replace `st_write_db` with a version that is fast for large datasets (#285), thanks to Josh London

* take out more memory leaking examples in tests

* the `aggregate` method for `sf` objects assumes the `by` argument to be identical to that of `stats::aggregate`

* `st_wrap_dateline` wraps (cuts up) geometries crossing the antimeridian, such that they no longer cross it.

# version 0.4-1

* restore 3.3.0 and c++11 requirement

* `st_read` respects time that is read as UTC

* `st_write` writes time always as UTC, since GDAL does not have a mechanism to define local timezones other than "unknown" or "local"

* `st_length` works for POINT and MULTIPOINT (returning 0); POLYGON and MULTIPOLYGON are converted to MULTILINESTRING before computing length, thus giving polygon perimeter (#268)

* `st_write` has `update` depend on driver; for databases, the default is `TRUE`, otherwise `FALSE` (it refers to update of the database, and not to overwriting the table in the database, this will by default not succeed); #274

* `st_read` supports reading objects with multiple geometry columns #257 #255

* support writing (exporting) objects with non-standard columns, such as `units` or `POSIXlt` #264

* catch dependencies on GEOS 3.3.5 (hence no 0.4-0 CRAN binary for MacOSX) #260

# version 0.4-0

* have `st_is_valid` catch corrupt geometries too, returning `NA` in that case (requiring GEOS 3.5.0)

* add `st_make_valid`, only available when sf was linked to `liblwgeom`

* add `st_coordinates` method, returning coordinates matrix with indexes

* remove `unlist.sfg` 

* add `as.matrix.sfg`; have as.matrix.sfg add indexes to coordinates

* add `st_bind_cols` method

* improve handling features that can't be projected 

* support uniform sampling over polygons on the sphere

* add `st_sample`, for sampling points on multipoints, linestrings, or polygons

* add `c` method for `sfc` objects

* import and export `magrittr::%>%`

* support ggplot'ing geometrycollections

* drop C++11 requirement, allowing build for older R versions

* add `st_proj_info`, modelled after `rgdal::projInfo`

* overwriting datasets with `st_write()` is no longer allowed; `update=TRUE` appends to them, permitted the driver supports appending.

* `st_write` gains an argument, `update`, which when `TRUE` will try to append to existing datasets (#204)

* added list of corresponding function for migration from sp, rgdal and rgeos to sf at https://github.com/edzer/sfr/wiki/migrating

* remove deprecated `st_list`

* rename `st_makegrid` to `st_make_grid`, and `st_linemerge` to `st_line_merge`
* add NEWS.md file (#207)

* faster conversion of `data.frame` into `POINT` `sf` object, using `st_as_sf` (Michael Sumner)

* `rbind` method for `sf` objects keeps coordinate reference system

# version 0.3-4, Feb 6, 2017

* add `st_contains_properly` spatial predicate

* GEOS functions (geometry operations) accept XYZ geometries (and ignore Z)

* make `prepared = TRUE` the default for all geometry binary operations

# version 0.3-2, Feb 4, 2017

* add user interrupt checks in all GEOS geometry operations

* make `st_graticule` do something useful for polar projections

* make `st_graticule` return `NA` labels when labels are useless

* add `merge.sf` methods to merge `sf` object and `data.frame` (#193)

* add `st_join` for table joins based on (user-defined) spatial predicates

* add `dplyr`-style non-spatial joins for `sf` objects (`left_join`, `full_join` etc.) (#193)

* allow for multiple non-gathered variables (#196)

* add missing meridian to `st_graticule` (#198)

# version 0.3-1, Jan 31, 2017

* add `merge` method (#193)

* `st_graticule` for laea (#198)

* allow `st_buffer` with feature-dependent buffer distance (#197)

* have `spread` return an `sf` object (#196)

* clarify `overwrite = TRUE` in write docs

* fix `st_as_sf.map` (#194)

* add `prepared` arg to spatial binary predicates, to speed up large intersections

* add `st_voronoi` interface (requires that lib GEOS >= 3.5.0)

* add `st_as_sf` methods for `map` objects (library maps)

* add RStudio project file

* have `st_bbox` return a `bbox` object which has an `st_crs` method

* rename `st_drop_zm` into `st_zm`, for general more handling of Z and M

* allow for 3D coordinates returned, when `+proj=geocent` (#172; #103)

* fix `NA_integer_` handling in shapefiles I/O (#184)

* add and fix `st_agr` API, to set and get attribute-to-geometry relationships

# version 0.2-8, Jan 5, 2017

