artisanweblab/geojson

PHP的GeoJSON实现

dev-master 2022-11-04 07:54 UTC

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]
    ]
}