clonix / geokit
Requires
- php: ^7.1
- ext-json: *
Requires (Dev)
- doctrine/coding-standard: ^6.0
- phpunit/phpunit: ^7.5
- vimeo/psalm: ^3.3
This package is not auto-updated.
Last update: 2024-09-29 13:06:41 UTC
README
Geokit 是一个 PHP 工具包,用于解决地理相关任务,例如
- 距离计算。
- 航向、中点和终点计算。
- 矩形边界框计算。
安装
使用 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受到以下库的启发,并/或包含从以下库移植的代码: