clonixdev/geokit

PHP 地理工具包

dev-master 2022-12-07 14:04 UTC

This package is auto-updated.

Last update: 2024-09-07 18:04:12 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):使用哈夫曼公式计算两点之间的大圆(地球)距离的近似值。
  • 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 度。超过 180 或低于 -180 的经度被归一化。例如,480、840 和 1200 都会被归一化到 120 度。
  • 纬度范围在 -90 到 90 度之间,包括 -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 实例。

$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受到了以下库的启发,并/或包含移植的代码