piecesphp / geojson
Tratamiento y generación de GeoJSON
Requires
- php: >=8.5 <8.6
- ext-ctype: *
- ext-date: *
- ext-json: *
- ext-mbstring: *
- ext-pcre: *
Requires (Dev)
- phpstan/phpstan: ^2.1
- phpstan/phpstan-deprecation-rules: ^2.0
- rector/rector: ^2.3
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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,ctypeymbstring. - 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
Featureañadida a una colección conaddFeature()toma el modo de la colección y pierde el suyo. Si la colección no recibió modo, sale[latitud, longitud].
Qué trae
| Clase | Qué es |
|---|---|
PiecesPHP\GeoJson\GeoJson | Una FeatureCollection |
PiecesPHP\GeoJson\Feature | Una geometría con sus propiedades |
PiecesPHP\GeoJson\Geometry\Point | Punto |
PiecesPHP\GeoJson\Geometry\LineString | Línea |
PiecesPHP\GeoJson\Geometry\Polygon | Polígono de un solo anillo |
PiecesPHP\GeoJson\Geometry\MultiLineString | Ver límites |
PiecesPHP\GeoJson\Geometry\MultiPolygon | Ver límites |
PiecesPHP\GeoJson\Geometry\GeometryInterface | El 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)
$typeGeometryes obligatorio en la práctica: usaPoint::TYPE,LineString::TYPE,Polygon::TYPE,MultiLineString::TYPEoMultiPolygon::TYPE. Connullu otro valor lanza\TypeError.- Las propiedades solo se pasan al construir; vacías salen como
{}.
GeoJson
| Método | Qué 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
| Clase | Constructor | Pares 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.
Polygonla envuelve en un único anillo;MultiLineStringyMultiPolygonla 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
MultiPointniGeometryCollection. - 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.