mjaschen/phpgeo

简单而强大的地理库


README

phpgeo 提供了地理坐标(包括对不同椭球体的支持)的抽象,并允许您以高精度计算坐标之间的地理距离。

Latest Stable Version Total Downloads phpgeo Tests Documentation Status Scrutinizer Code Quality License

要求

最低所需的 PHP 版本是 8.1。 phpgeo 已在 PHP 8.3 上进行测试。

新功能只会进入主分支,不会回滚。

可以为旧版本的 PHP 安装 phpgeo 的旧版本。请参考以下兼容性矩阵表

文档

文档可在 phpgeo.marcusjaschen.de 获取。

安装

使用 Composer,只需在运行

composer require mjaschen/phpgeo

升级

更新项目 composer.json 中的版本约束并运行 composer update 或通过运行来要求新版本

composer require mjaschen/phpgeo:^5.0

升级到 5.x

phpgeo 在 5.x 版本中有些破坏性更改。请参考以下列表查看更改了什么以及您需要做什么来升级您的代码。

许可证

从版本 2.0.0 开始,phpgeo 采用 MIT 许可证。旧版本采用 GPL 许可证。

功能

信息:请访问 文档网站 以获取完整且最新的文档,其中包含许多示例!

phpgeo 提供以下功能(点击链接查看示例)

示例/用法

此列表不完整,请访问文档站点以获取完整的文档和示例!

两点之间的距离(Vincenty公式)

直接使用计算器对象

<?php

use Location\Coordinate;
use Location\Distance\Vincenty;

$coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit
$coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit

$calculator = new Vincenty();

echo $calculator->getDistance($coordinate1, $coordinate2); // returns 128130.850 (meters; ≈128 kilometers)

或通过注入计算器对象调用坐标对象的getDistance()方法

<?php

use Location\Coordinate;
use Location\Distance\Vincenty;

$coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit
$coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit

echo $coordinate1->getDistance($coordinate2, new Vincenty()); // returns 128130.850 (meters; ≈128 kilometers)

简化折线

折线可以简化以节省存储空间或带宽。简化使用Ramer–Douglas–Peucker算法(也称为Douglas-Peucker算法)。

<?php

use Location\Coordinate;
use Location\Polyline;
use Location\Distance\Vincenty;

$polyline = new Polyline();
$polyline->addPoint(new Coordinate(10.0, 10.0));
$polyline->addPoint(new Coordinate(20.0, 20.0));
$polyline->addPoint(new Coordinate(30.0, 10.0));

$processor = new Simplify($polyline);

// remove all points which perpendicular distance is less
// than 1500 km from the surrounding points.
$simplified = $processor->simplify(1500000);

// simplified is the polyline without the second point (which
// perpendicular distance is ~1046 km and therefore below
// the simplification threshold)

多边形包含一个点(例如“GPS地理围栏”)

phpgeo有一个多边形实现,可以用来确定一个点是否包含在其中。多边形至少由三个点组成。点是Coordinate类的实例。

警告:如果多边形在180/-180度子午线上有点,则计算结果将不正确。

<?php

use Location\Coordinate;
use Location\Polygon;

$geofence = new Polygon();

$geofence->addPoint(new Coordinate(-12.085870,-77.016261));
$geofence->addPoint(new Coordinate(-12.086373,-77.033813));
$geofence->addPoint(new Coordinate(-12.102823,-77.030938));
$geofence->addPoint(new Coordinate(-12.098669,-77.006476));

$outsidePoint = new Coordinate(-12.075452, -76.985079);
$insidePoint = new Coordinate(-12.092542, -77.021540);

var_dump($geofence->contains($outsidePoint)); // returns bool(false) the point is outside the polygon
var_dump($geofence->contains($insidePoint)); // returns bool(true) the point is inside the polygon

坐标的格式化输出

您可以以不同的样式格式化坐标。

十进制度

<?php

use Location\Coordinate;
use Location\Formatter\Coordinate\DecimalDegrees;

$coordinate = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit

echo $coordinate->format(new DecimalDegrees());

度/分/秒(DMS)

<?php

use Location\Coordinate;
use Location\Formatter\Coordinate\DMS;

$coordinate = new Coordinate(18.911306, -155.678268); // South Point, HI, USA

$formatter = new DMS();

echo $coordinate->format($formatter); // 18° 54′ 41″ -155° 40′ 42″

$formatter->setSeparator(", ")
    ->useCardinalLetters(true)
    ->setUnits(DMS::UNITS_ASCII);

echo $coordinate->format($formatter); // 18° 54' 41" N, 155° 40' 42" W

GeoJSON

<?php

use Location\Coordinate;
use Location\Formatter\Coordinate\GeoJSON;

$coordinate = new Coordinate(18.911306, -155.678268); // South Point, HI, USA

echo $coordinate->format(new GeoJSON()); // { "type" : "point" , "coordinates" : [ -155.678268, 18.911306 ] }

开发

运行测试

在提交pull请求之前,请确保运行所有检查和测试,并确保一切正常。

  • 使用composer ci:lint检查PHP文件的语法错误:
  • 使用Psalm运行静态分析并报告错误:composer ci:psalm
  • 使用PHPUnit运行单元测试:composer ci:tests

要一次性运行所有检查和测试,只需使用composer ci

当然,可以直接使用测试运行器,例如PHPUnit

./vendor/bin/phpunit

Psalm

./vendor/bin/psalm

在本地运行GitHub Actions

可以使用act在本地运行整个CI测试矩阵。

act --rm -P ubuntu-latest=shivammathur/node:latest

致谢