Search by

longitude-one / spatial-types

Alexandre-T

This library implements PHP spatial types: their interfaces and their geometric and geographic classes.

Package info

github.com/longitude-one/spatial-types

pkg:composer/longitude-one/spatial-types

Statistics

Installs: 308

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 5

1.0.0-beta 2026-10-04 17:20 UTC

README

PHP library providing spatial types and their geometric and geographic classes.

If you want to persist spatial data in a database, you should use the longitude-one/doctrine2-spatial package.

Current status

longitude-one/spatial--types Stable release Minimum PHP Version Packagist License

Oldest PHP test Latest PHP test Downloads Coverage Status

Installation

composer require longitude-one/spatial-types

Usage

use LongitudeOne\SpatialTypes\Types\Dimension2\Geometry\LineString;
use LongitudeOne\SpatialTypes\Types\Dimension2\Geometry\Point;

$point = new Point(1, 2);
echo $point->getX(); // 1
echo $point->getY(); // 2

$lineString = new LineString([
    new Point(1, 2, 4326),
    new Point(3, 4, 4326),
    new Point(5, 6, 4326),
], 4326);
$lineString->getSrid(); // 4326

For the complete catalogue of concrete types, constructors, accessors, and mutability rules, see Instantiable spatial types.

Type class hierarchy

The following tree describes class inheritance in Types, rather than the file layout. Intermediate abstract classes are hidden; only AbstractSpatialType and instantiable classes are shown. {Dimension2, Dimension3m, Dimension3z, Dimension4zm} represents one branch for each listed coordinate dimension and {Geometry, Geography} one concrete class for each spatial model. For the complete hierarchy, including intermediate abstract classes, see Type class hierarchy.

AbstractSpatialType
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\Point
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\LineString
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\Polygon
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\CircularString
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\CompoundCurve
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\Triangle
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\MultiPoint
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\MultiLineString
├── Dimension{2,3m,3z,4zm}\{Geometry,Geography}\MultiPolygon
├── Dimension{3z,4zm}\{Geometry,Geography}\PolyhedralSurface
├── Dimension{2,3m,3z,4zm}\Geometry\GeometryCollection
└── Dimension{2,3m,3z,4zm}\Geography\GeographyCollection

Types not yet available

CurvePolygon, MultiCurve, MultiSurface and TIN do not yet have instantiable classes. See Instantiable spatial types for the complete coverage matrix.

Immutability

Spatial values are immutable and safe to share: their coordinates, SRID, and aggregate membership are set at construction time and never changed through the public API. Use withCoordinates() with an immutable Value\Coordinates value to represent another location, or withSpatialReference() to associate the same coordinates with another declared reference. Both return new objects.

LineString, Polygon, Triangle, and PolyhedralSurface also provide withArrayOfCoordinates() to create a new instance with replacement coordinates. This preserves their family, dimension, and SRID without changing the source object.

This prevents a value shared by other aggregates from silently changing them. See Immutability for the rationale, examples, and the complete contract.

Spatial reference system (SRS)

Every spatial object has a Reference\SpatialReference. Its legacy integer projection remains available through getSrid(), while getSpatialReference() preserves the optional authority (for example EPSG:4326). Constructors and factories accept either a legacy integer or a SpatialReference instance.

Supplied members retain their declared references; compatibility is not validated automatically. Use withSpatialReference() (or the legacy withSrid()) to relabel a copy and its descendants without reprojection.

See Spatial reference systems for reference handling, and Spatial validation for the separation of representation from explicit functional validation.