Geokit
Geokit — это набор инструментов PHP для решения задач, связанных с географией, таких как:
Установка
Установите последнюю версию с помощью Composer.
composer require geokit/geokit
Проверьте страницу Packagist для всех доступных версий.
Справочник
Экземпляр Distance позволяет удобно представить единицу измерения расстояния.
use Geokit\Distance;
$distance = new Distance(1000); // По умолчанию метры
// или
$distance = new Distance(1, Distance::UNIT_KILOMETERS);
$meters = $distance->meters();
$kilometers = $distance->kilometers();
$miles = $distance->miles();
$yards = $distance->yards();
$feet = $distance->feet();
$inches = $distance->inches();
$nauticalMiles = $distance->nautical();
Расстояние также можно создать из строки с необязательной единицей измерения.
use Geokit\Distance;
$distance = Distance::fromString('1000'); // По умолчанию метры
$distance = Distance::fromString('1000m');
$distance = Distance::fromString('1km');
$distance = Distance::fromString('100 miles');
$distance = Distance::fromString('100 yards');
$distance = Distance::fromString('1 foot');
$distance = Distance::fromString('1 inch');
$distance = Distance::fromString('234nm');
Position
— это фундаментальная конструкция, представляющая географическое положение в координатах x
(или longitude
) и y
(или latitude
).
Обратите внимание, что координаты x
/y
сохраняются как есть, а longitude
/latitude
нормализуются.
use Geokit\Position;
$position = new Position(181, 91);
$x = $position->x(); // Возвращает 181.0
$y = $position->y(); // Возвращает 91.0
$longitude = $position->longitude(); // Возвращает -179.0, нормализованное значение
$latitude = $position->latitude(); // Возвращает 89.0, нормализованное значение
Экземпляр BoundingBox представляет собой прямоугольник в географических координатах, включая тот, который пересекает 180-градусный меридиан долготы.
Он построен на основе левого нижнего (юго-западного) и правого верхнего (северо-восточного) углов.
use Geokit\BoundingBox;
use Geokit\Position;
$southWest = Position::fromXY(2, 1);
$northEast = Position::fromXY(2, 1);
$boundingBox = BoundingBox::fromCornerPositions($southWest, $northEast);
$southWestPosition = $boundingBox->southWest();
$northEastPosition = $boundingBox->northEast();
$center = $boundingBox->center();
$span = $boundingBox->span();
$boolean = $boundingBox->contains($position);
$newBoundingBox = $boundingBox->extend($position);
$newBoundingBox = $boundingBox->union($otherBoundingBox);
С помощью методов expand()
и shrink()
вы можете расширить или уменьшить экземпляр BoundingBox на расстояние.
use Geokit\Distance;
$expandedBoundingBox = $boundingBox->expand(
Distance::fromString('10km')
);
$shrinkedBoundingBox = $boundingBox->shrink(
Distance::fromString('10km')
);
Метод toPolygon()
преобразует... Преобразование BoundingBox в эквивалентный Polygon
$polygon = $boundingBox->toPolygon();
Экземпляр Polygon представляет двумерную форму соединённых отрезков и может быть как замкнутым (первая и последняя точки совпадают), так и разомкнутым.
use Geokit\BoundingBox;
use Geokit\Polygon;
use Geokit\Position;
$polygon = Polygon::fromPositions(
Position::fromXY(0, 0),
Position::fromXY(1, 0),
Position::fromXY(1, 1)
);
$closedPolygon = $polygon->close();
/** @var Position $position */
foreach ($polygon as $position) {
}
$polygon->contains(Position::fromXY(0.5, 0.5)); // true
/** @var BoundingBox $boundingBox */
$boundingBox = $polygon->toBoundingBox();
Geokit предоставляет несколько функций для выполнения географических расчётов.
distanceHaversine(Position $from, Position $to)
:
Вычисляет приблизительное расстояние по уровню моря между двумя точками по формуле Хаверсайна.distanceVincenty(Position $from, Position $to)
:
Рассчитывает геодезическое расстояние между двумя точками с использованием обратной формулы Винсенти для эллипсоидов.use function Geokit\distanceHaversine;
use function Geokit\distanceVincenty;
$distance1 = distanceHaversine($from, $to);
$distance2 = distanceVincenty($from, $to);
Обе функции возвращают экземпляр Distance.
Функция circle()
вычисляет замкнутый круг Polygon с учётом центра, радиуса и шагов для точности.
use Geokit\Distance;
use Geokit\Position;
use function Geokit\circle;
$circlePolygon = circle(
Position::fromXY(8.50207515, 49.50042565),
Distance::fromString('5km'),
32
);
Другие полезные функции:
heading(Position $from, Position $to)
: Вычисляет (начальный) курс от первой точки до второй точки в градусах.midpoint(Position $from, Position $to)
: Рассчитывает промежуточную точку на геодезической линии между двумя заданными точками.endpoint(Position $start, float $heading, Geokit\Distance $distance)
:
Определяет конечную точку вдоль геодезической, учитывая начальный курс и расстояние, исходя из заданной начальной точки.Copyright (c) 2011-2022 Jan Sorgalla. Released under the MIT License.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )