π₯ Breaking changes
GeometryEngine
interface has a new method:concaveHull()
DatabaseEngine::executeQuery()
implementations must now acceptbool
parametersDatabaseEngine::getParameterPlaceholder()
signature has changed to acceptbool
parametersDatabaseEngine::queryGeometry()
is nowfinal
GeometryException
constructor signature has changed
These breaking changes will likely not affect you, unless you're writing your own geometry engine.
β¨ New features
- New geometry engine:
GeosOpEngine
uses thegeosop
binary to perform geometry operations - New engine method:
GeometryEngine::concaveHull()
β¨ Improvements
- All
GeometryEngine
methods are now properly documented with@throws GeometryEngineException
π Bug fixes
WKTParser
andEWKTParser
now accept bothMULTIPOINT (1 2, 3 4)
andMULTIPOINT((1 2), (3 4))
syntaxes; this notably fixes interoperability issues with PostGIS
0.12.0 - 2025-03-09
π₯ Breaking changes
- Interface
GeometryEngine
has 2 new methods:lineInterpolatePoint()
,lineInterpolatePoints()
BoundingBox
's constructor is now private, useBoundingBox::new()
to create a new instanceCompoundCurve
can now only containLineString
andCircularString
instances; nestedCompoundCurve
instances are forbiddenGeometry
no longer implementsCountable
andIteratorAggregate
; subclasses implement these interfaces as needed, with proper types- The
SQLite3Exception
class has been removed - The
GeometryEngineException::operationNotSupportedByEngine()
method has been removed - The following classes are now
final
:BoundingBox
CoordinateSystem
- engines:
GEOSEngine
PDOEngine
SQLite3Engine
- exceptions:
CoordinateSystemException
EmptyGeometryException
GeometryEngineException
GeometryIOException
InvalidGeometryException
NoSuchGeometryException
UnexpectedGeometryException
- input/output:
EWKBReader
EWKBWriter
EWKTReader
EWKTWriter
GeoJSONReader
GeoJSONWriter
WKBReader
WKBWriter
WKTReader
WKTWriter
- The following classes are marked as
@internal
, and are no longer part of the public API:Attribute\NoProxy
Engine\GeometryParameter
IO\AbstractWKBReader
IO\AbstractWKBWriter
IO\AbstractWKTReader
IO\AbstractWKTWriter
IO\EWKBTools
IO\EWKTParser
IO\WKBBuffer
IO\WKBByteOrder
IO\WKBGeometryHeader
IO\WKBTools
IO\WKTParser
ποΈ Deprecations
- The following classes are marked as
@final
, and will be made final in a future version:CircularString
CompoundCurve
CurvePolygon
LineString
MultiLineString
MultiPoint
MultiPolygon
Point
TIN
Triangle
β¨ New features
- New engine methods:
GeometryEngine::lineInterpolatePoint()
,lineInterpolatePoints()
(#55 by @arminwinkt)
β¨ Improvements
- Improved documentation and return types for
Geometry::toArray()
methods PDOEngine
andSQLite3Engine
now wrap all underlying exceptions in aGeometryEngineException
- When an engine exception occurs,
GeometryEngineException
now includes the original exception message
0.11.5 - 2025-03-06
π Bug fixes
- The error mode of the PDO connection in
PDOEngine
could be left modified when an exception occurs - Uninitialized proxies would be broken when calling
with*()
methods
0.11.4 - 2025-03-03
π Bug fixes
GeoJSONWriter
erroneously refused to writeMultiPoint
,MultiLineString
andMultiPolygon
nested insideGeometryCollection
(#53)
β¨ New features
GeoJSONWriter
constructor now has a$lenient
flag to allow nestedGeometryCollection
objects
β¨ Improvements
- Improved exception messages in non-lenient mode in
GeoJSONReader
- Performance improvement in
GeoJSONWriter
when thebbox
attribute is not requested
0.11.3 - 2025-02-19
β¨ New features
- The following methods have been added:
CircularString::withAddedPoints()
CompoundCurve::withAddedCurves()
CurvePolygon::withExteriorRing()
,withInteriorRings()
,withAddedInteriorRings()
GeometryCollection::withAddedGeometries()
LineString::withAddedPoints()
Polygon::withExteriorRing()
,withInteriorRings()
,withAddedInteriorRings()
PolyhedralSurface::withAddedPatches()
0.11.2 - 2025-02-18
π Bug fixes
- extending an empty
BoundingBox
would get its immutability violated by setting a coordinate system
0.11.1 - 2024-08-19
β¨ New features
- New projector:
RoundCoordinatesProjector
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 - 2024-01-23
π₯ Breaking changes
- Minimum PHP version is now
8.1
- interface
GeometryEngine
has a new method:makeValid()
AbstractWKBWriter::setByteOrder()
now accepts aWKBByteOrder
enum instead of aWKBTools::*_ENDIAN
constant- constants
WKBTools::BIG_ENDIAN
andWKBTools::LITTLE_ENDIAN
have been removed - method
WKBTools::checkByteOrder()
has been removed
β¨ New features
- New engine method:
GeometryEngine::makeValid()
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 passingNaN
or infinite coordinates.GeometryEngine::pointOnSurface()
now returnsPoint
instead ofGeometry
.
π 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 - 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 - 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:
$lineString->length();
Should be replaced with:
$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 - 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 - 2021-11-06
π Fixes
- Fix a deprecation warning on PHP 8.1 (#35)
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 package in addition to brick/geo
.
0.6.2 - 2021-08-17
π Fixes
- Fixed bug when retrieving
GeometryCollection
on MySQL 8 usingDatabaseEngine
(#33)
0.6.1 - 2021-04-20
π Fixes
- Fixed bug with PDO MySQL when using non-emulated prepared statements
0.6.0 - 2021-03-16
β¨ New features
- Proper support for
Feature
andFeatureCollection
inGeoJSONReader
andGeoJSONWriter
- Support for auto-calculating the
bbox
attribute inGeoJSONWriter
- New method:
Geometry::transform()
transformsGeometry
coordinates to a new SRID - New method:
Geometry::toXY()
returns a newGeometry
with noZ
andM
coordinates - New method:
Geometry::withoutZ()
returns a newGeometry
with theZ
coordinate removed - New method:
Geometry::withoutM()
returns a newGeometry
with theM
coordinate removed - New method:
Geometry::getBoundingBox()
returns the south-west and north-east bounds of a Geometry - New method:
CoordinateSystem::isEqualTo()
compares against anotherCoordinateSystem
π Fixes
- Doctrine types could hydrate a parent Geometry proxy class, but now hydrate the correct Geometry proxy subclass 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 asFeature
andFeatureCollection
objects, instead ofGeometry
andGeometryCollection
objectsGeoJSONWriter
will now write GeometryCollections asGeometryCollection
type, instead ofFeatureCollection
The following breaks will only affect you if you're writing your own geometry engine, or your own WKB reader:
AbstractWKBReader::readGeometryHeader()
signature was changedWKBReader::read()
signature was changedGeometryEngine
has a newtransform()
methodProxyInterface
has a newisProxyBinary()
method
0.5.1 - 2021-04-20
π Fixes
- Fixed bug with PDO MySQL when using non-emulated prepared statements
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 nowprivate
, and must be provided through a parent constructor call.DatabaseEngine::executeQuery()
, when provided with geometry data, now takesGeometryParameter
objects instead ofGeometry
objects directly.
0.4.0 - 2020-12-29
β¨ New features
- New method
Point::azimuth()
(#17) thanks to @Kolyunya centroid()
is now available on the rootGeometry
class (#20) thanks to @Kolyunya- Psalm 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 anazimuth()
methodGeometryEngine::centroid()
now returnsPoint
- constants in
WKTParser
/EWKTParser
are nowprotected
WBKBuffer::readDoubles()
's$count
parameter is now typed
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 - 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 - 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 - 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 - 2019-01-26
Improvements to GeoJSON reader and writer classes:
GeoJSONReader
can now be lenient with documents containing wrong case types, such asPOINT
instead ofPoint
:
$reader = new GeoJSONReader(true); // case-insensitive
GeoJSONWriter
can now pretty-print the JSON output:
$writer = new GeoJSONWriter(true); // pretty-print
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 - 2017-11-08
Fixed a potential Error when an Exception is expected in WKBReader
and EWKBReader
.
0.2.0 - 2017-10-03
Minimum PHP version is now 7.1.
0.1.0 - 2017-10-03
First beta release.