mbolli / php-geobuf
PHP library for the geobuf compact geospatial format
Fund package maintenance!
mbolli
paypal.me/bolli
Installs: 12 857
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 2
Open Issues: 0
Requires
- php: ^8.0
- ext-json: *
- google/protobuf: ^3.19
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.2
- pestphp/pest: ^1.20
- phpstan/phpstan: ^1.9
README
PHP library for the geobuf compact geospatial format.
This is essentially a PHP port of the great pygeobuf.
Geobuf stores GeoJSON 6-8 times smaller and TopoJSON 2-3 times smaller. Depending on the $precision
attribute, lossless compression is possible. More information about Geobuf is available in the JS implementation or the Python implementation.
Quick size comparison: An example 745 kB GeoJSON was converted to a 90 kB Geobuf file – more than 8 times less.
Beware: Experimental state – it works for my purposes but there probably are some bugs.
Installation
composer require mbolli/php-geobuf
Usage
The following methods are exposed:
Encoder
encode()
reads a JSON string. Returns a geobuf-encoded string- string
$dataJson
a JSON string
- string
encodeToFile()
reads a JSON string and writes to a file. Returns the filesize of the resulting file or false- string
$filePath
where to store the resulting geobuf file - string
$dataJson
a JSON string
- string
encodeFileToBufFile()
reads from a JSON file and writes to a file. Returns the filesize of the resulting file or false- string
$jsonFile
path to the JSON file - string
$geobufFile
where to store the resulting geobuf file
- string
encodeFileToBuf()
reads from a JSON file. Returns a geobuf-encoded string- string
$fileName
path to the JSON file
- string
All encoding methods support the following two non-mandatory arguments:
- int
$precision
max number of digits after the decimal point in coordinates, 6 by default (10 cm). - int
$dim
number of dimensions in coordinates, 2 by default.
Decoder
decodeToArray()
returns a PHP array- string
$encodedInput
geobuf input
- string
decodeFileToArray()
returns a PHP array- string
$fileName
path to the geobuf file
- string
decodeToJson()
returns a JSON string- string
$encodedInput
geobuf input
- string
decodeFileToJson()
returns a JSON string- string
$fileName
path to the geobuf file
- string
decodeFileToJsonFile()
writes to a file and returns the filesize of the resulting JSON file or false- string
$geobufFile
path to the geobuf file - string
$jsonFile
where to store the resulting JSON file
- string
Example
<?php require_once('./vendor/autoload.php'); $jsonFile = './my.geojson'; $geobufFile = basename($jsonFile) . '.geobuf'; try { // encodes a json string to geobuf $geobufString = \MBolli\PhpGeobuf\Encoder::encode( file_get_contents($jsonFile), // (string) a json string 6, // (int) precision: max number of digits after the decimal point in coordinates, 6 by default 2 // (int) dimensions: number of dimensions in coordinates, 2 by default. ); // decodes a geobuf file to json $jsonString = \MBolli\PhpGeobuf\Decoder::decodeToJson( file_get_contents($geobufFile) // (string) expects a geobuf string ) } catch (\MBolli\PhpGeobuf\GeobufException $e) { var_dump($e); } catch (\Throwable $e) { var_dump($e); }
Contribute
Pull requests are encouraged. Code style is enforced by PHP-CS-Fixer:
composer run lint # lint source files and show problems (read-only) composer run lint-diff # lint source files and show diff to the files fixed state (read-only) composer run fix # lint source files and fix the problems composer run test # execute all tests composer run analyse # run phpstan static analyzer
If the PR is about the Encoder or Decoder, please add a test JSON to the tests/geojson
folder. The test suite will automatically pick it up and test it when executed.
Background: Proto compilation
Classes were generated by the proto compiler using this command:
bin/protoc --proto_path=src --php_out=build src/geobuf.proto
Used was this proto file, lightly modified from the mapbox/geobuf proto file for proto3 compatibility and automated namespace generation.