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
[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_LNGsigue 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()yjsonSerialize()). Por esocoordinates()devuelve lo guardado,[longitud, latitud], en los dos modos. Antes de la 4.0.0, conORDER_LAT_LNGel getter devolvía[latitud, longitud]. - Una
GeoJsoncon modo explícito se lo impone a cadaFeatureque recibe (addFeature()o el constructor) y pierde el suyo. UnaGeoJsonsin modo (null, lo habitual) deja a cadaFeaturecon 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
| 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;
$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)
$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; 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
| 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 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.
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.
- 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.