mjaschen / phpgeo
简单而强大的地理库
Requires
- php: ^8.1
Requires (Dev)
- phpunit/phpunit: ^10.0
- squizlabs/php_codesniffer: ^3.7
- vimeo/psalm: ^5.0
- dev-main
- 5.0.0
- 4.2.1
- 4.2.0
- 4.1.0
- 4.0.0
- 3.2.1
- 3.2.0
- 3.1.0
- 3.0.1
- 3.0.0
- 2.6.1
- 2.6.0
- 2.5.0
- 2.4.1
- 2.4.0
- 2.3.1
- 2.3.0
- 2.2.0
- 2.1.0
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.3.8
- 1.3.7
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.1
- 1.2.0
- 1.1.1
- 1.1.0
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- 0.3.0
- 0.2.3
- 0.2.2
- v0.2.1
- v0.2.0
- v0.1.0
- dev-task/update-docs-vincenty
- dev-dev/5.x
- dev-docs
- dev-dev/4.x
- dev-fix/96
This package is auto-updated.
Last update: 2024-08-31 08:29:39 UTC
README
phpgeo 提供了地理坐标(包括对不同椭球体的支持)的抽象,并允许您以高精度计算坐标之间的地理距离。
要求
最低所需的 PHP 版本是 8.1。 phpgeo 已在 PHP 8.3 上进行测试。
新功能只会进入主分支,不会回滚。
可以为旧版本的 PHP 安装 phpgeo 的旧版本。请参考以下兼容性矩阵表
文档
文档可在 phpgeo.marcusjaschen.de 获取。
安装
使用 Composer,只需在运行
composer require mjaschen/phpgeo
升级
更新项目 composer.json
中的版本约束并运行 composer update
或通过运行来要求新版本
composer require mjaschen/phpgeo:^5.0
升级到 5.x
phpgeo 在 5.x 版本中有些破坏性更改。请参考以下列表查看更改了什么以及您需要做什么来升级您的代码。
许可证
从版本 2.0.0 开始,phpgeo 采用 MIT 许可证。旧版本采用 GPL 许可证。
功能
信息:请访问 文档网站 以获取完整且最新的文档,其中包含许多示例!
phpgeo 提供以下功能(点击链接查看示例)
- 几个几何对象的抽象(坐标/点、线、多线/GPS 轨迹、多边形)
- 支持不同的 椭球体,例如 WGS-84
- 使用不同的实现(Haversine、Vincenty)进行 长度/距离/周长计算
- 地理围栏 计算,即回答“这个点是否包含在该区域/多边形内?”以及不同几何体之间的其他 交集 检查
- 格式化和输出 几何对象(GeoJSON、漂亮的字符串,例如
18° 54′ 41″ -155° 40′ 42″
) - 计算两点之间的 方位角(球面或使用 Vincenty 公式)
- 计算给定起始点、方位角和距离的 目标点(球面或使用 Vincenty 公式)
- 计算点与线之间的 垂直距离
- 计算两点之间的 基本距离
- 获取折线的段/多边形的段,
- 反转折线/多边形的方向
示例/用法
此列表不完整,请访问文档站点以获取完整的文档和示例!
两点之间的距离(Vincenty公式)
直接使用计算器对象
<?php use Location\Coordinate; use Location\Distance\Vincenty; $coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit $coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit $calculator = new Vincenty(); echo $calculator->getDistance($coordinate1, $coordinate2); // returns 128130.850 (meters; ≈128 kilometers)
或通过注入计算器对象调用坐标对象的getDistance()
方法
<?php use Location\Coordinate; use Location\Distance\Vincenty; $coordinate1 = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit $coordinate2 = new Coordinate(20.709722, -156.253333); // Haleakala Summit echo $coordinate1->getDistance($coordinate2, new Vincenty()); // returns 128130.850 (meters; ≈128 kilometers)
简化折线
折线可以简化以节省存储空间或带宽。简化使用Ramer–Douglas–Peucker算法(也称为Douglas-Peucker算法)。
<?php use Location\Coordinate; use Location\Polyline; use Location\Distance\Vincenty; $polyline = new Polyline(); $polyline->addPoint(new Coordinate(10.0, 10.0)); $polyline->addPoint(new Coordinate(20.0, 20.0)); $polyline->addPoint(new Coordinate(30.0, 10.0)); $processor = new Simplify($polyline); // remove all points which perpendicular distance is less // than 1500 km from the surrounding points. $simplified = $processor->simplify(1500000); // simplified is the polyline without the second point (which // perpendicular distance is ~1046 km and therefore below // the simplification threshold)
多边形包含一个点(例如“GPS地理围栏”)
phpgeo有一个多边形实现,可以用来确定一个点是否包含在其中。多边形至少由三个点组成。点是Coordinate
类的实例。
警告:如果多边形在180/-180度子午线上有点,则计算结果将不正确。
<?php use Location\Coordinate; use Location\Polygon; $geofence = new Polygon(); $geofence->addPoint(new Coordinate(-12.085870,-77.016261)); $geofence->addPoint(new Coordinate(-12.086373,-77.033813)); $geofence->addPoint(new Coordinate(-12.102823,-77.030938)); $geofence->addPoint(new Coordinate(-12.098669,-77.006476)); $outsidePoint = new Coordinate(-12.075452, -76.985079); $insidePoint = new Coordinate(-12.092542, -77.021540); var_dump($geofence->contains($outsidePoint)); // returns bool(false) the point is outside the polygon var_dump($geofence->contains($insidePoint)); // returns bool(true) the point is inside the polygon
坐标的格式化输出
您可以以不同的样式格式化坐标。
十进制度
<?php use Location\Coordinate; use Location\Formatter\Coordinate\DecimalDegrees; $coordinate = new Coordinate(19.820664, -155.468066); // Mauna Kea Summit echo $coordinate->format(new DecimalDegrees());
度/分/秒(DMS)
<?php use Location\Coordinate; use Location\Formatter\Coordinate\DMS; $coordinate = new Coordinate(18.911306, -155.678268); // South Point, HI, USA $formatter = new DMS(); echo $coordinate->format($formatter); // 18° 54′ 41″ -155° 40′ 42″ $formatter->setSeparator(", ") ->useCardinalLetters(true) ->setUnits(DMS::UNITS_ASCII); echo $coordinate->format($formatter); // 18° 54' 41" N, 155° 40' 42" W
GeoJSON
<?php use Location\Coordinate; use Location\Formatter\Coordinate\GeoJSON; $coordinate = new Coordinate(18.911306, -155.678268); // South Point, HI, USA echo $coordinate->format(new GeoJSON()); // { "type" : "point" , "coordinates" : [ -155.678268, 18.911306 ] }
开发
运行测试
在提交pull请求之前,请确保运行所有检查和测试,并确保一切正常。
- 使用
composer ci:lint
检查PHP文件的语法错误: - 使用Psalm运行静态分析并报告错误:
composer ci:psalm
- 使用PHPUnit运行单元测试:
composer ci:tests
要一次性运行所有检查和测试,只需使用composer ci
。
当然,可以直接使用测试运行器,例如PHPUnit
./vendor/bin/phpunit
Psalm
./vendor/bin/psalm
在本地运行GitHub Actions
可以使用act在本地运行整个CI测试矩阵。
act --rm -P ubuntu-latest=shivammathur/node:latest
致谢
- Marcus Jaschen [email protected] 和 所有贡献者
- Chris Veness - JavaScript实现用于距离计算的Vincenty公式
- Ersts,P.J.,Horning, N.,和M. Polin[Internet] Perpendicular Distance Calculator(版本1.2.2)文档。美国自然历史博物馆,生物多样性保护中心。可从http://biodiversityinformatics.amnh.org/open_source/pdc获取。访问日期:2013-07-07。
- W. Randolph Franklin,PNPOLY - 点在多边形内的测试文档