clonixdev / geokit
Requires
- php: ^7.3|^8.0
- ext-json: *
Requires (Dev)
- doctrine/coding-standard: ^6.0
- phpunit/phpunit: ^7.5
- vimeo/psalm: ^3.3
This package is auto-updated.
Last update: 2024-09-07 18:04:12 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)
:使用哈夫曼公式计算两点之间的大圆(地球)距离的近似值。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受到了以下库的启发,并/或包含移植的代码