phpgeo предоставляет абстракции географических координат (включая поддержку различных эллипсоидов) и позволяет с высокой точностью рассчитывать географические расстояния между координатами.
Минимальная необходимая версия PHP — 8.1. phpgeo протестирован до PHP 8.3.
Новые функции войдут только в основную ветку и не будут перенесены обратно.
Для старых версий PHP можно установить более старые версии phpgeo . Матрицу совместимости см. в следующей таблице:
PHP-версия | Версия phpgeo | Статус поддержки | Установка композитора |
---|---|---|---|
8.3 | 5.х | активный | composer require mjaschen/phpgeo |
8.2 | 5.х | активный | composer require mjaschen/phpgeo |
8.1 | 5.х | активный | composer require mjaschen/phpgeo |
8.0 | 4.х | composer require mjaschen/phpgeo:^4.0 | |
7.4 | 4.х | composer require mjaschen/phpgeo:^4.0 | |
7.3 | 4.х | composer require mjaschen/phpgeo:^4.0 | |
7.2 | 3.х | конец жизни | composer require mjaschen/phpgeo:^3.0 |
7.1 | 2.х | конец жизни | composer require mjaschen/phpgeo:^2.0 |
7.0 | 2.х | конец жизни | composer require mjaschen/phpgeo:^2.0 |
5,6 | 1.х | конец жизни | composer require mjaschen/phpgeo:^1.0 |
5,5 | 1.х | конец жизни | composer require mjaschen/phpgeo:^1.0 |
5.4 | 1.х | конец жизни | composer require mjaschen/phpgeo:^1.0 |
Документация доступна по адресу phpgeo.marcusjaschen.de.
Используя Composer, просто добавьте его в свой composer.json
, выполнив:
composer require mjaschen/phpgeo
Обновите ограничение версии в composer.json
проекта и запустите composer update
или запросите новую версию, выполнив:
composer require mjaschen/phpgeo:^5.0
В phpgeo есть некоторые критические изменения в версии 5.x. Обратитесь к следующему списку, чтобы узнать, что изменилось и что вам нужно сделать для обновления кода.
Изменять | Описание | Действие |
---|---|---|
Методы setPoint1() и setPoint2() удалены из Line | Класс Line теперь является неизменяемым. | Используйте конструктор, чтобы создать новый экземпляр Line . |
удалена поддержка PHP 7.3, 7.4 и 8.0 | Старые версии PHP больше не поддерживаются. | Обновите PHP как минимум до 8.1. |
Начиная с версии 2.0.0 phpgeo лицензируется по лицензии MIT. Старые версии имели лицензию GPL.
Информация: Посетите сайт документации для получения полной и актуальной документации со множеством примеров!
phpgeo предоставляет следующие возможности (примеры можно найти по ссылкам):
18° 54′ 41″ -155° 40′ 42″
)Этот список неполон. Посетите сайт документации, чтобы ознакомиться с полным набором документации и примерами!
Используйте объект калькулятора напрямую:
<?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)
Полилинии можно упростить для экономии места для хранения или пропускной способности. Упрощение выполняется с помощью алгоритма Рамера-Дугласа-Пейкера (алгоритм АКА Дугласа-Пейкера).
<?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)
В 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 ());
<?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
<?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 ] }
Прежде чем отправлять запрос на включение, обязательно выполните все проверки и тесты и убедитесь, что все горит зеленым.
composer ci:lint
composer ci:psalm
composer ci:tests
Чтобы запустить все проверки и тесты одновременно, просто используйте composer ci
.
Конечно, можно использовать средства запуска тестов напрямую, например, для PHPUnit:
./vendor/bin/phpunit
Псалом:
./vendor/bin/psalm
Можно запустить всю матрицу тестов CI локально с помощью act :
act --rm -P ubuntu-latest=shivammathur/node:latest