clonix/geokit

PHP 地理工具包

v2.0 2020-07-10 17:59 UTC

This package is not auto-updated.

Last update: 2024-09-29 13:06:41 UTC


README

Geokit 是一个 PHP 工具包,用于解决地理相关任务,例如

  • 距离计算。
  • 航向、中点和终点计算。
  • 矩形边界框计算。

Build Status Code Coverage

安装

使用 Composer 安装最新版本。

composer require geokit/geokit

查看所有可用版本请访问 Packagist 页面

参考

数学

Math 实例可用于在 Position 和 BoundingBox 实例上执行地理计算。

仅使用 世界大地测量系统 1984 (WGS84) 作为坐标参考系统。

$math = new Geokit\Math();

距离计算

Math 实例提供两种方法来计算地球表面上两点之间的距离

  • distanceHaversine(Geokit\Position $from, Geokit\Position $to):使用 Haversine 公式计算两点之间的大圆距离(海平面近似)。
  • distanceVincenty(Geokit\Position $from, Geokit\Position $to):使用椭球体的 Vincenty 反公式计算两点之间的测地距离。
$distance1 = $math->distanceHaversine($from, $to);
$distance2 = $math->distanceVincenty($from, $to);

两种方法都返回一个 Distance 实例。

变换

circle() 方法根据中心、半径和精度步数计算一个封闭的多边形。

$circlePolygon = $math->circle(
    new Geokit\Position(8.50207515, 49.50042565), 
    Geokit\Distance::fromString('5km'),
    32
);

其他计算

其他有用的方法包括

  • heading(Geokit\Position $from, Geokit\Position $to):计算从第一个点到第二个点的航向(以度为单位)。
  • midpoint(Geokit\Position $from, Geokit\Position $to):计算两个给定点之间的地球测线上一个中间点。
  • endpoint(Geokit\Position $start, float $heading, Geokit\Distance $distance):根据初始航向和距离,从给定的起点计算测线上一个目的地点。

距离

Distance 实例允许方便地表示距离单位。

$distance = new Geokit\Distance(1000); // Defaults to meters
// or
$distance = new Geokit\Distance(1, Geokit\Distance::UNIT_KILOMETERS);

$meters = $distance->meters();
$kilometers = $distance->kilometers();
$miles = $distance->miles();
$yards = $distance->yards();
$feet = $distance->feet();
$inches = $distance->inches();
$nauticalMiles = $distance->nautical();

也可以从一个包含可选单位的字符串创建 Distance。

$distance = Geokit\Distance::fromString('1000'); // Defaults to meters
$distance = Geokit\Distance::fromString('1000m');
$distance = Geokit\Distance::fromString('1km');
$distance = Geokit\Distance::fromString('100 miles');
$distance = Geokit\Distance::fromString('100 yards');
$distance = Geokit\Distance::fromString('1 foot');
$distance = Geokit\Distance::fromString('1 inch');
$distance = Geokit\Distance::fromString('234nm');

位置

Position 是一个基本构造,表示地理坐标中的位置,在 x(或 经度)和 y(或 纬度)坐标中。

注意,x/y 坐标保持不变,而 longitude/latitude 则被归一化。

  • 经度范围在 -180 到 180 度之间,包括两端。大于 180 或小于 -180 的经度将被归一化。例如,480、840 和 1200 都将被归一化为 120 度。
  • 纬度范围在 -90 到 90 度之间,包括两端。大于 90 或小于 -90 的纬度将被归一化。例如,100 将被归一化为 80 度。
$position = new Geokit\Position(181, 91);

$x = $position->x(); // Returns 181.0
$y = $position->y(); // Returns 91.0
$longitude = $position->longitude(); // Returns -179.0, normalized
$latitude = $position->latitude(); // Returns 89.0, normalized

边界框

BoundingBox 实例表示地理坐标中的一个矩形,包括跨越 180 度经线圈的矩形。

它由其左下角(西南角)和右上角(东北角)的点构建。

$southWest = new Geokit\Position(2, 1);
$northEast = new Geokit\Position(2, 1);

$boundingBox = new Geokit\BoundingBox($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 实例。

$expandedBoundingBox = $boundingBox->expand(
    Geokit\Distance::fromString('10km')
);

$shrinkedBoundingBox = $boundingBox->shrink(
    Geokit\Distance::fromString('10km')
);

toPolygon() 方法将 BoundingBox 转换为等效的多边形实例。

$polygon = $boundingBox->toPolygon();

多边形

Polygon 实例表示由连接线段组成的二维形状,可以是封闭的(第一个点和最后一个点是相同的)或开放的。

$polygon = new Geokit\Polygon([
    new Geokit\Position(0, 0),
    new Geokit\Position(1, 0),
    new Geokit\Position(1, 1)
]);

$closedPolygon = $polygon->close();

/** @var Geokit\Position $position */
foreach ($polygon as $position) {
}

$polygon->contains(Geokit\Position(0.5, 0.5)); // true

/** @var Geokit\BoundingBox $boundingBox */
$boundingBox = $polygon->toBoundingBox();

许可证

版权所有 (c) 2011-2019 Jan Sorgalla。在MIT许可证下发布。

致谢

Geokit受到以下库的启发,并/或包含从以下库移植的代码: