geotools 不是官方 composer 包,未发布到 packagist;推荐使用 phpgeo(composer require mjaschen/phpgeo),它支持 vincenty 等高精度距离计算、wgs84 椭球模型、geojson 兼容,且维护活跃、适配 php 8.0+。

Geotools 库在 Composer 中根本不存在
直接说结论:geotools 不是官方 Composer 包,也没有被发布到 Packagist。你执行 composer require geotools/geotools 会报错:Could not find package geotools/geotools。这不是配置问题,是这个库压根没以标准方式托管在 Packagist 上。
实际可用的替代方案:使用 brick/math + geojson 或 phpgeo
真正稳定、维护活跃、支持现代 PHP(8.0+)且能做高精度距离计算(大圆距离、椭球模型、Vincenty、Haversine)的是 phpgeo。它轻量、无外部依赖、文档清晰,且已发布到 Packagist。
-
composer require mjaschen/phpgeo即可安装 - 支持 WGS84 椭球模型下的
Vincenty计算(比 Haversine 更准,尤其跨长距离或高纬度) -
GeoJson兼容良好,可直接解析 GeoJSON 坐标点 - 不依赖
ext-gmp或ext-bcmath(默认启用 float 算法;如需更高精度可手动启用bcmath)
典型距离计算代码怎么写(避免精度陷阱)
别直接用 sqrt() + sin/cos 手写 Haversine——浮点误差累积快,且赤道/极地附近偏差可达 0.3% 以上。用 phpgeo 的 Vincenty 实现更可靠:
use PhpGeo\Coordinate; use PhpGeo\Distance\Vincenty; $coord1 = new Coordinate(40.7128, -74.0060); // 纽约 $coord2 = new Coordinate(51.5074, -0.1278); // 伦敦 $distance = (new Vincenty())->getDistance($coord1, $coord2); // 返回米(float) echo round($distance / 1000, 1); // → 5570.5 km
注意:Vincenty 内部迭代收敛,默认最大 100 次;若两点几乎对跖(如 ±180° 经度差),可能收敛慢或失败——此时可 fallback 到 Haversine:
- 用
PhpGeo\Distance\Haversine替代实例化 - 或捕获
PhpGeo\Exception\ComputationException - 不要假设所有坐标都是 WGS84;若来源是 GCJ-02(中国火星坐标系),必须先纠偏,
phpgeo不处理这个
为什么别折腾 fork 或手动 require geotools 源码
网上能找到的所谓 “geotools” 通常指一个早已归档、PHP 5.6 时代的 GitHub 项目(michelf/php-geotools),其 composer.json 缺少 autoload 配置,类名不遵循 PSR-4,且最后一次 commit 是 2015 年。强行 git clone + autoload "files" 会导致:
- 命名冲突(例如
Geotools类与你自己命名空间撞车) - 无法用 IDE 自动跳转、类型提示失效
- PHP 8+ 下
create_function()等废弃函数直接 fatal error - 没有单元测试,距离结果未验证过椭球参数(WGS84 vs GRS80)
真要复用旧逻辑,只取其中 Haversine 公式片段即可,别整个引入。











