artisanweblab / geojson
PHP的GeoJSON实现
dev-master
2022-11-04 07:54 UTC
Requires
- php: ^8.0
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^9.5.4
This package is auto-updated.
Last update: 2024-09-06 12:24:47 UTC
README
此库实现了GeoJSON格式规范。
GeoJson
命名空间包括GeoJSON规范中定义的每个数据结构的类。核心GeoJSON对象包括几何形状、要素和集合。几何形状从原始点延伸到更复杂的多边形。类还包括边界框和坐标参考系统。
安装
$ composer require "artisanweblab/geojson"
用法
此库中的类是不可变的。
GeoJson构造函数
几何对象使用单个坐标数组构造。这可能是一个Point
的情况下的元组,一个LineString
的坐标数组的数组等。每个类的构造函数将验证坐标数组,并在错误时抛出InvalidArgumentException
。
更原始的几何对象也可以用于构建复杂对象。例如,可以使用点对象数组构造LineString
。
要素对象由几何对象、关联属性数组和标识符构造,这些都是可选的。
要素和几何集合对象由其各自类型的数组构造。
JSON序列化
use ArtisanWebLab\GeoJson\Geometry\Point; $point = Point::latLng([50.4019514, 30.3926095]); $json = json_encode($point);
打印$json
变量会产生(没有空白)
{ "type": "Point", "coordinates": [30.3926095, 50.4019514] }
JSON反序列化
核心GeoJson
类实现了一个内部JsonUnserializable
接口,该接口定义了一个静态工厂方法jsonUnserialize()
,可用于从json_decode()
的返回值创建对象。
use ArtisanWebLab\GeoJson\GeoJson; $json = '{ "type": "Point", "coordinates": [30.3926095, 50.4019514] }'; $point = GeoJson::jsonUnserialize($json);
如果在反序列化过程中遇到错误,jsonUnserialize()
将抛出UnserializationException
。可能的错误包括
- 缺少属性(例如,
type
不存在) - 意外的值(例如,
coordinates
属性不是数组) - 解析GeoJSON对象或CRS时遇到不支持的
type
字符串
折线解码器
$origin = 'Маріїнський палац, 5A, вулиця Михайла Грушевського, Київ, 01008'; $destination = 'Києво-Печерська лавра, вулиця Лаврська, 15, Київ, 01015'; $request = Http::get('https://maps.googleapis.com/maps/api/directions/json', [ 'origin' => $origin, 'destination' => $destination, 'language' => 'ua', 'key' => '...', ]); $response = $request->json(); $lineStrings = []; foreach ($response['routes'] as $route) { $polylineFromGoogleMapsAPI = $route['overview_polyline']['points']; $lineStrings[] = GeoJson::decodePolyline($polylineFromGoogleMapsAPI); }
{ "type":"LineString", "coordinates":[ [30.5385,50.4478], [30.53711,50.44677], //.. [30.55699,50.43555], [30.55701,50.43553] ] }