Search by

piecesphp / geojson

vmorantes

Tratamiento y generación de GeoJSON

Package info

bitbucket.org/piecesphp/geojson

pkg:composer/piecesphp/geojson

Statistics

Installs: 252

Dependents: 0

Suggesters: 0

v4.0.0 2026-10-26 16:59 UTC

This package is auto-updated.

Last update: 2026-10-26 17:16:10 UTC


README

Genera GeoJSON desde PHP: colecciones, features y geometrías que se convierten a JSON con json_encode().

Solo genera. No lee ni valida GeoJSON existente.

Es parte del framework PiecesPHP, pero no depende de él.

Requisitos

  • PHP >=8.5 <8.6.
  • Extensiones date, pcre, json, ctype y mbstring.
  • Sin dependencias de ejecución.

Instalación

composer require piecesphp/geojson

⚠ Antes de nada: el orden de las coordenadas

  • La entrada es siempre [longitud, latitud].
  • La salida, por defecto, es [longitud, latitud] (GeometryInterface::ORDER_LNG_LAT): GeoJSON estándar, RFC 7946, lo que esperan Leaflet, Mapbox, OpenLayers o PostGIS. Desde la 4.0.0 no hace falta pasar ningún modo.
  • GeometryInterface::ORDER_LAT_LNG sigue existiendo como opción explícita, pero está @deprecated: produce un GeoJSON que no es estándar. Solo cambia la salida.
  • Las geometrías guardan siempre [longitud, latitud] y aplican el orden solo al serializar (schema() y jsonSerialize()). Por eso coordinates() devuelve lo guardado, [longitud, latitud], en los dos modos. Antes de la 4.0.0, con ORDER_LAT_LNG el getter devolvía [latitud, longitud].
  • Una GeoJson con modo explícito se lo impone a cada Feature que recibe (addFeature() o el constructor) y pierde el suyo. Una GeoJson sin modo (null, lo habitual) deja a cada Feature con el suyo.
  • Un valor de modo que no sea 0 ni 1 en una geometría se ignora y queda el predeterminado (ORDER_LNG_LAT).

Qué trae

ClaseQué es
PiecesPHP\GeoJson\GeoJsonUna FeatureCollection
PiecesPHP\GeoJson\FeatureUna geometría con sus propiedades
PiecesPHP\GeoJson\Geometry\PointPunto
PiecesPHP\GeoJson\Geometry\LineStringLínea
PiecesPHP\GeoJson\Geometry\PolygonPolígono de un solo anillo
PiecesPHP\GeoJson\Geometry\MultiLineStringVer límites
PiecesPHP\GeoJson\Geometry\MultiPolygonVer límites
PiecesPHP\GeoJson\Geometry\GeometryInterfaceEl contrato común y las constantes de orden

Ojo con las mayúsculas del namespace: GeoJson, no GeoJSON.

Uso

Una colección con un punto (GeoJSON estándar)

use PiecesPHP\GeoJson\GeoJson;
use PiecesPHP\GeoJson\Feature;
use PiecesPHP\GeoJson\Geometry\Point;

$coleccion = new GeoJson();
$coleccion->addFeature(new Feature([-74.08, 4.6], Point::TYPE, ['nombre' => 'Bogotá']));

echo json_encode($coleccion, JSON_UNESCAPED_UNICODE);
// {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-74.08,4.6]},"properties":{"nombre":"Bogotá"}}]}

Una línea

use PiecesPHP\GeoJson\Geometry\LineString;

$feature = new Feature(
    [[-74.08, 4.6], [-75.56, 6.25]],   // pares [longitud, latitud]
    LineString::TYPE,
    ['ruta' => 'A']
);
// {"type":"Feature","geometry":{"type":"LineString","coordinates":[[-74.08,4.6],[-75.56,6.25]]},"properties":{"ruta":"A"}}

Una geometría suelta

$punto = new Point(-74.08, 4.6); // (longitud, latitud)
$punto->coordinates(); // [-74.08, 4.6]

El orden antiguo, a propósito

use PiecesPHP\GeoJson\Geometry\GeometryInterface;

$punto = new Point(-74.08, 4.6, GeometryInterface::ORDER_LAT_LNG); // en desuso
$punto->jsonSerialize()['coordinates']; // [4.6, -74.08]: la salida va invertida
$punto->coordinates();                  // [-74.08, 4.6]: lo guardado no cambia

Referencia

Feature::__construct(array $coordinates, ?string $typeGeometry = null, array $properties = [], ?int $coordinateOrderMode = null)

  • $typeGeometry es obligatorio en la práctica: usa Point::TYPE, LineString::TYPE, Polygon::TYPE, MultiLineString::TYPE o MultiPolygon::TYPE. Con null u otro valor lanza \TypeError.
  • Las propiedades solo se pasan al construir; vacías salen como {}.

GeoJson

MétodoQué hace
__construct(array $features = [], ?int $coordinateOrderMode = null)
addFeature(Feature $feature)Añade; si la colección tiene modo, reconfigura la geometría con él. Devuelve $this
features(?array $features = null)Sin argumento, devuelve las features; con un array, las añade y devuelve $this

Geometrías

ClaseConstructorPares mínimos
Point(float $longitude, float $latitude, ?int $modo = null)—
LineString, MultiLineString(array $coordinates = [], ?int $modo = null)2
Polygon, MultiPolygon(array $coordinates = [], ?int $modo = null)4

Todas tienen coordinates(?array $valor = null): sin argumento devuelve las coordenadas guardadas, siempre [longitud, latitud] y sin importar el modo; con un array las fija. coordinates(coordinates()) no cambia nada en Point y LineString (probado). *En Polygon y las `Multi no es así**: el getter devuelve la forma anidada y el setter espera una lista plana de pares, así que no son simétricos. Las de varias coordenadas tienen además hasData(): bool. Una entrada con menos pares de los necesarios lanza \TypeError`.

Límites conocidos

  • Todas las geometrías de varias coordenadas reciben una lista plana de pares. Polygon la envuelve en un único anillo; MultiLineString y MultiPolygon la envuelven en una sola línea o un solo polígono. No se pueden expresar huecos ni varias líneas o polígonos.
  • No hay MultiPoint ni GeometryCollection.
  • No se comprueba que el anillo de un polígono esté cerrado.
  • La validación de una lista acepta la entrada si al menos un par es válido; los inválidos no se descartan.
  • Tampoco hay altitud (un tercer valor por par) ni se rechazan pares inválidos de forma estricta (ver el punto anterior).

Pruebas

No hay PHPUnit en este paquete, a propósito: no se añadió una dependencia. La verificación es PHPStan (bin/phpstan), los ejemplos de este README y un guion del orden de las coordenadas:

composer install
php examples/readme.php            # ejecuta los ejemplos de este README; sale con 1 si alguno no da lo que dice
php tests/geometry-order.php       # 19 comprobaciones del orden; sale con 1 si falla alguna

Cambios

Ver CHANGELOG.md.

Licencia

MIT. Ver LICENSE.