|
|
|
|
# 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.
|
|
|
|
|
|