MIT License

项目介绍

mjaschen/phpgeo 是一个托管在 GitHub 上的开源项目,主要使用 PHP 编写,采用 MIT License 许可证,目前获得 1.6k 个 Star、196 次 Fork。

仓库全名
mjaschen/phpgeo
开源许可证
MIT License
Star 数
1.6k
Fork 数
196
未关闭 Issue
21

README 摘要

phpgeo - A Simple Geo Library for PHP phpgeo provides abstractions to geographical coordinates (including support for different ellipsoids) and allows you to calculate geographical distances between coordinates with high precision. Requirements The minimum required PHP version is 8.2. phpgeo is tested up to PHP 8.5. New features will only go into the main branch and won't be backported. It's possible to install…

完整内容见 GitHub 原始 README 或本页 。

常见问题

phpgeo 用什么语言开发?

主要使用 PHP 编写,采用 MIT License 许可证,目前有 1.6k 个 Star。

phpgeo 可以免费商用吗?

仓库采用 MIT License 许可证,可免费使用与修改,商业使用请遵守许可证条款(例如保留版权声明与许可声明)。

如何获取 phpgeo 的源码?

可以直接克隆仓库:git clone https://github.com/mjaschen/phpgeo.git,默认分支为 main;安装与运行步骤见仓库 README。

phpgeo 最近还在维护吗?

仓库最近一次更新为 8月6日,当前有 21 个未关闭 Issue;Star 数为 1.6k,可作为社区活跃度的参考。

README

phpgeo - A Simple Geo Library for PHP

phpgeo provides abstractions to geographical coordinates (including support for different ellipsoids) and allows you to calculate geographical distances between coordinates with high precision.

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

Requirements

The minimum required PHP version is 8.2. phpgeo is tested up to PHP 8.5.

New features will only go into the main branch and won’t be backported.

It’s possible to install older versions of phpgeo for older PHP versions. Please refer to the following table for the compatibility matrix:

PHP Version phpgeo Version Support Status Composer Install
8.5 6.x ✅ active composer require mjaschen/phpgeo
8.4 6.x ✅ active composer require mjaschen/phpgeo
8.3 6.x ✅ active composer require mjaschen/phpgeo
8.2 6.x ✅ active composer require mjaschen/phpgeo
8.1 5.x ⚠️ security only composer require mjaschen/phpgeo:^5.0
8.0 4.x ⚠️ security only composer require mjaschen/phpgeo:^4.0
7.4 4.x ⚠️ security only composer require mjaschen/phpgeo:^4.0
7.3 4.x ⚠️ security only composer require mjaschen/phpgeo:^4.0
7.2 3.x ❌ end of life composer require mjaschen/phpgeo:^3.0
7.1 2.x ❌ end of life composer require mjaschen/phpgeo:^2.0
7.0 2.x ❌ end of life composer require mjaschen/phpgeo:^2.0
5.6 1.x ❌ end of life composer require mjaschen/phpgeo:^1.0
5.5 1.x ❌ end of life composer require mjaschen/phpgeo:^1.0
5.4 1.x ❌ end of life composer require mjaschen/phpgeo:^1.0

Documentation

The documentation is available at phpgeo.marcusjaschen.de.

Installation

Using Composer, just add it to your composer.json by running:

composer require mjaschen/phpgeo

Upgrading

Update the version constraint in the project’s composer.json and run composer update or require the new version by running:

composer require mjaschen/phpgeo:^6.0

Upgrading to 6.x

phpgeo has some breaking changes in the 6.x release line. Please refer to the following list to see what has changed and what you need to do to upgrade your code.

Change Description Action
Line, Polygon, and Polyline classes are now implementing a new interface GeometryLinesInterface provides the getSegments() method. There’s no need to change anything if you don’t extend those classes.
getBounds() method was added to GeometryInterface Ensure your class has a getBounds() method if you implement GeometryInterface
removed support for PHP 8.1 Older PHP versions are no longer supported. Upgrade to at least PHP 8.2 or keep using phpgeo 5.x

Upgrading to 5.x

phpgeo has some breaking changes in the 5.x release line. Please refer to the following list to see what has changed and what you need to do to upgrade your code.

Change Description Action
setPoint1() and setPoint2() methods removed from Line The Line class now is immutable. Use the constructor to create a new instance of Line.
removed support for PHP 7.3, 7.4 and 8.0 Older PHP versions are no longer supported. Upgrade to at least PHP 8.1.

License

Starting with version 2.0.0 phpgeo is licensed under the MIT license. Older versions were GPL-licensed.

Features

Info: Please visit the documentation site for complete and up-to-date documentation with many examples!

phpgeo provides the following features (follow the links for examples):

Examples/Usage

This list is incomplete, please visit the documentation site for the full monty of documentation and examples!

Distance between two coordinates (Vincenty’s Formula)

Use the calculator object directly:

<?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)

or call the getDistance() method of a Coordinate object by injecting a calculator object:

<?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)

Simplifying a polyline

Polylines can be simplified to save storage space or bandwidth. Simplification is done with the Ramer–Douglas–Peucker algorithm (AKA Douglas-Peucker algorithm).

<?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)

Polygon contains a point (e.g. “GPS geofence”)

phpgeo has a polygon implementation which can be used to determinate if a point is contained in it or not. A polygon consists of at least three points. Points are instances of the Coordinate class.

Warning: The calculation gives wrong results if the polygons has points on both sides of the 180/-180 degrees meridian.

<?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

Formatted output of coordinates

You can format a coordinate in different styles.

Decimal Degrees
<?php

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

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

echo $coordinate->format(new DecimalDegrees());
Degrees/Minutes/Seconds (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 ] }

Development

Run Tests

Before submitting a pull request, please be sure to run all checks and tests and ensure everything is green.

  • lint PHP files for syntax errors: composer ci:lint
  • run static analysis with [Psalm][] and report errors: composer ci:psalm
  • run unit tests with PHPUnit: composer ci:tests

To run all checks and tests at once, just use composer ci.

Of course, it’s possible to use the test runners directly, e.g. for PHPUnit:

./vendor/bin/phpunit

PHPStan:

./vendor/bin/phpstan

Running GitHub Actions locally

It’s possible to run the whole CI test matrix locally with act:

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

Credits

评论

暂无评论