Search by

piecesphp / geojson

vmorantes

Tratamiento y generación de GeoJSON

Package info

bitbucket.org/piecesphp/geojson

pkg:composer/piecesphp/geojson

Statistics

Installs: 248

Dependents: 0

Suggesters: 0

v3.0.0 2026-08-28 21:08 UTC

This package is auto-updated.

Last update: 2026-10-13 06:10:27 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 [latitud, longitud] (GeometryInterface::ORDER_LAT_LNG). Eso no es GeoJSON estándar: la RFC 7946 pide [longitud, latitud], y es lo que esperan Leaflet, Mapbox, OpenLayers o PostGIS.
  • Para un GeoJSON estándar, pasa GeometryInterface::ORDER_LNG_LAT. El modo solo cambia la salida.
  • Una Feature añadida a una colección con addFeature() toma el modo de la colección y pierde el suyo. Si la colección no recibió modo, sale [latitud, longitud].

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;
use PiecesPHP\GeoJson\Geometry\GeometryInterface;

$coleccion = new GeoJson([], GeometryInterface::ORDER_LNG_LAT);
$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'],
    GeometryInterface::ORDER_LNG_LAT
);

Una geometría suelta

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

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 y reconfigura la geometría con el modo de la colección. 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 en el orden de salida; con un array las fija. 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.
  • Sin suite de pruebas: la verificación es PHPStan (bin/phpstan) y los ejemplos de este README, que se ejecutan con:

    composer install
    php examples/readme.php            # ejecuta los ejemplos de este README; sale con 1 si alguno no da lo que dice
    

Cambios

Ver CHANGELOG.md.

Licencia

MIT. Ver LICENSE.