# Changelog

## [0.11.1](https://github.com/brick/geo/releases/tag/0.11.1) - 2024-08-19

✨ **New features**

- New projector: `RoundCoordinatesProjector`

## [0.11.0](https://github.com/brick/geo/releases/tag/0.11.0) - 2024-06-07

💥 **Breaking changes**

- interface `GeometryEngine` has a new method: `split()`
- method `GeometryEngine::boundingPolygons()` has been removed

✨ **New features**

- New engine method: `GeometryEngine::split()`

## [0.10.0](https://github.com/brick/geo/releases/tag/0.10.0) - 2024-01-23

💥 **Breaking changes**

- **Minimum PHP version is now `8.1`**
- interface `GeometryEngine` has a new method: `makeValid()`
- `AbstractWKBWriter::setByteOrder()` now accepts a `WKBByteOrder` enum instead of a `WKBTools::*_ENDIAN` constant
- constants `WKBTools::BIG_ENDIAN` and `WKBTools::LITTLE_ENDIAN` have been removed
- method `WKBTools::checkByteOrder()` has been removed

✨ **New features**

- New engine method: `GeometryEngine::makeValid()`

## [0.9.0](https://github.com/brick/geo/releases/tag/0.9.0) - 2022-11-22

💥 **Breaking changes**

- Proxies are now `@internal` and considered an implementation detail. This means that they are no longer part of the public API and can change at any time. This means that you should *always* type-hint against the base class and not the proxy.
- `Point` constructor now throws an exception when passing `NaN` or infinite coordinates.
- `GeometryEngine::pointOnSurface()` now returns `Point` instead of `Geometry`.

🐛 **Bug fixes**

- `Geometry::withSRID()` now properly propagates the SRID to all sub-geometries. Previously, only the top-level geometry was updated.
- `Point` constructor would error when destructuring an associative array.

✨ **New features**

- New `Projector` API to reproject geometry coordinates.
- New method: `Polygon::rings()`
- New method: `Geometry::isIdenticalTo()`

✨ **Improvements**

- `GeometryCollection::geometryN()` is now properly documented with generics.

## [0.8.1](https://github.com/brick/geo/releases/tag/0.8.1) - 2022-10-14

✨ **Improvements**

- Better Psalm annotations for geometry getters
- Removed outdated suggestion in `composer.json`
- Minor documentation fixes & proxy code style improvements

## [0.8.0](https://github.com/brick/geo/releases/tag/0.8.0) - 2022-10-11

💥 **Breaking changes**

**Minimum PHP version is now `8.0`.**

The global `GeometryEngineRegistry` is gone. All convenience methods that rely on the `GeometryEngineRegistry` have been removed.
You should now explicitly call the `GeometryEngine`, that you can get injected with your dependency injection container.

For example, the following call:

```php
$lineString->length();
```

Should be replaced with:

```php
$geometryEngine->length($lineString);
```

**Detail of breaking changes**

The following class has been removed:

- `GeometryEngineRegistry`

The following method has been added:

- `GeometryEngine::isRing()`

The following method signatures have been changed:

- `GeometryEngine::boundingPolygons()`

The following deprecated methods have been removed:

- `Curve::isClosed()`
- `Curve::isRing()`
- `Curve::length()`
- `Geometry::boundary()`
- `Geometry::buffer()`
- `Geometry::centroid()`
- `Geometry::contains()`
- `Geometry::convexHull()`
- `Geometry::crosses()`
- `Geometry::difference()`
- `Geometry::disjoint()`
- `Geometry::distance()`
- `Geometry::equals()`
- `Geometry::envelope()`
- `Geometry::intersection()`
- `Geometry::intersects()`
- `Geometry::isSimple()`
- `Geometry::isValid()`
- `Geometry::locateAlong()`
- `Geometry::locateBetween()`
- `Geometry::maxDistance()`
- `Geometry::overlaps()`
- `Geometry::relate()`
- `Geometry::simplify()`
- `Geometry::snapToGrid()`
- `Geometry::symDifference()`
- `Geometry::touches()`
- `Geometry::transform()`
- `Geometry::union()`
- `Geometry::within()`
- `MultiCurve::isClosed()`
- `MultiCurve::length()`
- `MultiSurface::area()`
- `MultiSurface::pointOnSurface()`
- `Point::azimuth()`
- `PolyhedralSurface::boundingPolygons()`
- `PolyhedralSurface::isClosed()`
- `Surface::area()`
- `Surface::pointOnSurface()`

The following change only affects you if you implement a custom `DatabaseEngine`:

- The signature of `DatabaseEngine::getParameterPlaceholder()` has changed

💥 **Non-breaking changes**

- The following signatures have changed, but are not a breaking change due to LSP:
  - `DatabaseEngine::getParameterPlaceholder(mixed $parameter): string`
  - `GeometryEngine::length(Curve|MultiCurve $g): float`
  - `GeometryEngine::area(Surface|MultiSurface $g): float`
  - `GeometryEngine::pointOnSurface(Surface|MultiSurface $g): Geometry`

🐛 **Fixes**

- Fixed a potential bug when destructuring associative arrays in Geometry class constructors

## [0.7.2](https://github.com/brick/geo/releases/tag/0.7.2) - 2022-10-10

🗑️ **Deprecations**

**The `GeometryEngineRegistry` class has been deprecated.** All convenience methods on Geometry classes that rely on the
`GeometryEngineRegistry` are deprecated, and **will be removed in version `0.8`**.

You should now explicitly call the `GeometryEngine`, that you can get injected with your dependency injection container.

Deprecated methods:

- `Curve::isClosed()`
- `Curve::isRing()`
- `Curve::length()`
- `Geometry::boundary()`
- `Geometry::buffer()`
- `Geometry::centroid()`
- `Geometry::contains()`
- `Geometry::convexHull()`
- `Geometry::crosses()`
- `Geometry::difference()`
- `Geometry::disjoint()`
- `Geometry::distance()`
- `Geometry::equals()`
- `Geometry::envelope()`
- `Geometry::intersection()`
- `Geometry::intersects()`
- `Geometry::isSimple()`
- `Geometry::isValid()`
- `Geometry::locateAlong()`
- `Geometry::locateBetween()`
- `Geometry::maxDistance()`
- `Geometry::overlaps()`
- `Geometry::relate()`
- `Geometry::simplify()`
- `Geometry::snapToGrid()`
- `Geometry::symDifference()`
- `Geometry::touches()`
- `Geometry::transform()`
- `Geometry::union()`
- `Geometry::within()`
- `MultiCurve::isClosed()`
- `MultiCurve::length()`
- `MultiSurface::area()`
- `MultiSurface::pointOnSurface()`
- `Point::azimuth()`
- `PolyhedralSurface::boundingPolygons()`
- `PolyhedralSurface::isClosed()`
- `Surface::area()`
- `Surface::pointOnSurface()`

## [0.7.1](https://github.com/brick/geo/releases/tag/0.7.1) - 2021-11-06

🐛 **Fixes**

- Fix a deprecation warning on PHP 8.1 (#35)

## [0.7.0](https://github.com/brick/geo/releases/tag/0.7.0) - 2021-10-10

💥 **Breaking change**

The Doctrine mapping types & functions have been moved to a separate package.

If you don't use these, you don't need to do anything to upgrade.
If you use them, just require the [brick/geo-doctrine](https://github.com/brick/geo-doctrine) package in addition to `brick/geo`.

## [0.6.2](https://github.com/brick/geo/releases/tag/0.6.2) - 2021-08-17

🐛 **Fixes**

- Fixed bug when retrieving `GeometryCollection` on MySQL 8 using `DatabaseEngine` (#33)

## [0.6.1](https://github.com/brick/geo/releases/tag/0.6.1) - 2021-04-20

🐛 **Fixes**

- Fixed bug with PDO MySQL when using non-emulated prepared statements

## [0.6.0](https://github.com/brick/geo/releases/tag/0.6.0) - 2021-03-16

✨ **New features**

- **Proper support for `Feature` and `FeatureCollection` in `GeoJSONReader` and `GeoJSONWriter`**
- **Support for auto-calculating the `bbox` attribute in `GeoJSONWriter`**
- New method: `Geometry::transform()` transforms `Geometry` coordinates to a new SRID
- New method: `Geometry::toXY()` returns a new `Geometry` with no `Z` and `M` coordinates
- New method: `Geometry::withoutZ()` returns a new `Geometry` with the `Z` coordinate removed
- New method: `Geometry::withoutM()` returns a new `Geometry` with the `M` coordinate removed
- New method: `Geometry::getBoundingBox()` returns the south-west and north-east bounds of a Geometry
- New method: `CoordinateSystem::isEqualTo()` compares against another `CoordinateSystem`

🐛 **Fixes**

- Doctrine types could hydrate a parent Geometry proxy class, but now hydrate the correct Geometry proxy sub-class by introspecting the WKB without fully loading it

✨ **Improvements**

- Proxy data is now always sent as is to the `DatabaseEngine`

💥 **BC breaks**

- **Minimum PHP version is now 7.4**
- New signature for `CoordinateSystemException::sridMix()`
- New signature for `CoordinateSystemException::dimensionalityMix()`

The following breaks only affect you if you use the GeoJSON reader/writer:

- `GeoJSONReader` now instantiates Features and FeatureCollections as `Feature` and `FeatureCollection` objects, instead of `Geometry` and `GeometryCollection` objects
- `GeoJSONWriter` will now write GeometryCollections as `GeometryCollection` type, instead of `FeatureCollection`

The following breaks will only affect you if you're writing your own geometry engine, or your own WKB reader:

- `AbstractWKBReader::readGeometryHeader()` signature was changed
- `WKBReader::read()` signature was changed
- `GeometryEngine` has a new `transform()` method
- `ProxyInterface` has a new `isProxyBinary()` method

## [0.5.1](https://github.com/brick/geo/releases/tag/0.5.1) - 2021-04-20

🐛 **Fixes**

- Fixed bug with PDO MySQL when using non-emulated prepared statements

## [0.5.0](https://github.com/brick/geo/releases/tag/0.5.0) - 2021-03-05

🐛 **Fixes**

- Fixed illegal parameter data type issue on MariaDB

💥 **BC breaks**

Note: these breaks will likely not affect you, unless you're writing your own geometry engine.

- `DatabaseEngine::$useProxy` is now `private`, and must be provided through a parent constructor call.
- `DatabaseEngine::executeQuery()`, when provided with geometry data, now takes `GeometryParameter` objects instead of `Geometry` objects directly.

## [0.4.0](https://github.com/brick/geo/releases/tag/0.4.0) - 2020-12-29

✨ **New features**

- New method `Point::azimuth()` (#17) thanks to @Kolyunya
- `centroid()` is now available on the root `Geometry` class (#20) thanks to @Kolyunya
- [Psalm](https://psalm.dev/) annotations on the whole codebase

🐛 **Fixes**

- Fixed wrongly documented return types

💥 **BC breaks**

Note: these breaks will likely not affect you, unless you're writing your own geometry engine or WK(B|T) parser.

- `GeometryEngine` interface adds an `azimuth()` method
- `GeometryEngine::centroid()` now returns `Point`
- constants in `WKTParser` / `EWKTParser` are now `protected`
- `WBKBuffer::readDoubles()`'s `$count` parameter is now typed

## [0.3.0](https://github.com/brick/geo/releases/tag/0.3.0) - 2020-12-14

✨ **New features**

- **compatibility with PHP 8**
- compatibility with brick/reflection `0.4`

💥 **Breaking changes**

- **minimum PHP version is now 7.2**
- deprecated Doctrine function `EarthDistanceFunction` has been removed

Earth distance calculations should be delegated to the geometry engine, that should be able to handle geographic computations; MySQL 8, for example, supports calculating distances in meters between two SRID 4326 points.

## [0.2.6](https://github.com/brick/geo/releases/tag/0.2.6) - 2019-12-24

**Deprecations**

Doctrine function `EarthDistanceFunction` is now deprecated, and **will be removed in `0.3.0`**.

**Improvements**

This version extends compatibility to `brick/reflection` version `0.3`.

## [0.2.5](https://github.com/brick/geo/releases/tag/0.2.5) - 2019-03-30

**New methods**

- `Geometry::withSRID()`
- `CoordinateSystem::withSRID()`

These methods return a copy of the original object, with the SRID altered.

## [0.2.4](https://github.com/brick/geo/releases/tag/0.2.4) - 2019-03-30

**New method**: `Geometry::swapXY()`

This methods returns a copy of the Geometry, with X and Y coordinates swapped. It is useful when needing to convert geometries from `Lat, Lng` to `Lng, Lat` and conversely.

## [0.2.3](https://github.com/brick/geo/releases/tag/0.2.3) - 2019-01-26

Improvements to GeoJSON reader and writer classes:

- `GeoJSONReader` can now be lenient with documents containing wrong case types, such as `POINT` instead of `Point`:

```php
$reader = new GeoJSONReader(true); // case-insensitive
```

- `GeoJSONWriter` can now pretty-print the JSON output:

```php
$writer = new GeoJSONWriter(true); // pretty-print
```

## [0.2.2](https://github.com/brick/geo/releases/tag/0.2.2) - 2019-01-24

This version adds support for importing from and exporting to GeoJSON:

- `Brick\Geo\IO\GeoJSONReader`
- `Brick\Geo\IO\GeoJSONWriter`

Thanks @michaelcurry 👍

## [0.2.1](https://github.com/brick/geo/releases/tag/0.2.1) - 2017-11-08

Fixed a potential Error when an Exception is expected in `WKBReader` and `EWKBReader`.

## [0.2.0](https://github.com/brick/geo/releases/tag/0.2.0) - 2017-10-03

Minimum PHP version is now **7.1**.

## [0.1.0](https://github.com/brick/geo/releases/tag/0.1.0) - 2017-10-03

First beta release.