定制 philiprehberger/php-geo 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

philiprehberger/php-geo

Composer 安装命令:

composer require philiprehberger/php-geo

包简介

Geospatial utilities for distance, bounding box, and point-in-polygon calculations

README 文档

README

Tests Latest Version on Packagist Last updated

Geospatial utilities for distance, bounding box, and point-in-polygon calculations.

Requirements

  • PHP 8.2+

Installation

composer require philiprehberger/php-geo

Usage

Distance Calculation (Haversine)

use PhilipRehberger\Geo\Coordinate;
use PhilipRehberger\Geo\Geo;

$nyc = new Coordinate(40.7128, -74.0060);
$la = new Coordinate(33.9425, -118.4081);

$km = Geo::distance($nyc, $la);          // ~3944 km
$miles = Geo::distance($nyc, $la, 'mi'); // ~2451 mi

Vincenty Distance

$km = Geo::distanceVincenty($nyc, $la); // More accurate for long distances

Bounding Box

$center = new Coordinate(40.7128, -74.0060);
$box = Geo::boundingBox($center, 10.0); // 10 km radius

$box->contains($center); // true
$box->toArray();          // ['min_lat' => ..., 'max_lat' => ..., 'min_lng' => ..., 'max_lng' => ...]

Point in Polygon

$polygon = [
    new Coordinate(40.800, -73.970),
    new Coordinate(40.800, -73.950),
    new Coordinate(40.760, -73.950),
    new Coordinate(40.760, -73.970),
];

$point = new Coordinate(40.780, -73.960);
Geo::contains($polygon, $point); // true

Bearing

$bearing = Geo::bearing($nyc, $la); // Initial bearing in degrees (0-360)

Midpoint

$mid = Geo::midpoint($nyc, $la); // Geographic midpoint

Destination

// Travel 100 km north from the equator
$start = new Coordinate(0.0, 0.0);
$dest = Geo::destination($start, 0.0, 100.0); // bearing=0 (north), 100 km

Compass Direction

$bearing = Geo::bearing($nyc, $la);
$direction = Geo::compassDirection($bearing); // e.g. 'SW'

Geo::compassDirection(0.0);   // 'N'
Geo::compassDirection(90.0);  // 'E'
Geo::compassDirection(225.0); // 'SW'

Elevation

$coord = new Coordinate(40.7128, -74.0060);
$elevated = $coord->withElevation(100.5); // New Coordinate with elevation
$elevated->getElevation(); // 100.5
$coord->getElevation();    // null (original unchanged)

Polygon Area

$polygon = [
    new Coordinate(0.0, 0.0),
    new Coordinate(0.0, 1.0),
    new Coordinate(1.0, 1.0),
    new Coordinate(1.0, 0.0),
];

$area = Geo::area($polygon); // Area in square meters

Geohash Encoding/Decoding

$coord = new Coordinate(57.64911, 10.40744);
$hash = Geo::encodeGeohash($coord);          // 'u4pruydqqvj8'
$decoded = Geo::decodeGeohash($hash);        // Coordinate near original
$bounds = Geo::geohashBounds($hash);         // BoundingBox of geohash cell

Polyline Encoding/Decoding

$coordinates = [
    new Coordinate(38.5, -120.2),
    new Coordinate(40.7, -120.95),
    new Coordinate(43.252, -126.453),
];

$encoded = Geo::encodePolyline($coordinates);  // '_p~iF~ps|U_ulLnnqC_mqNvxq`@'
$decoded = Geo::decodePolyline($encoded);      // Array of Coordinate objects

Route Distance

$route = [
    new Coordinate(40.7128, -74.0060),
    new Coordinate(41.8781, -87.6298),
    new Coordinate(33.9425, -118.4081),
];

$total = Geo::routeDistance($route); // Total distance in km

Units

Supported units: km (kilometers), mi (miles), m (meters), nmi (nautical miles).

Geo::distance($a, $b, 'mi');   // miles
Geo::distance($a, $b, 'm');    // meters
Geo::distance($a, $b, 'nmi');  // nautical miles

API

Method Description
Geo::distance($a, $b, $unit) Haversine distance between two coordinates
Geo::distanceVincenty($a, $b, $unit) Vincenty distance between two coordinates
Geo::boundingBox($center, $radius, $unit) Bounding box around a center point
Geo::contains($polygon, $point) Point-in-polygon test (ray casting)
Geo::bearing($from, $to) Initial bearing in degrees
Geo::midpoint($a, $b) Geographic midpoint
Geo::destination($start, $bearing, $distance, $unit) Destination from start given bearing and distance
Geo::compassDirection($bearing) Convert bearing to cardinal/intercardinal direction
Geo::area($polygon) Polygon area in square meters (Shoelace formula)
Geo::encodeGeohash($coord, $precision) Encode coordinate to geohash string
Geo::decodeGeohash($hash) Decode geohash to coordinate (center of cell)
Geo::geohashBounds($hash) Get bounding box of a geohash cell
Geo::encodePolyline($coordinates) Encode coordinates to Google polyline string
Geo::decodePolyline($encoded) Decode Google polyline string to coordinates
Geo::routeDistance($coordinates, $unit) Total distance along a multi-point route
Coordinate::withElevation($meters) Return new Coordinate with elevation
Coordinate::getElevation() Get elevation in meters or null

Development

composer install
vendor/bin/phpunit
vendor/bin/pint --test

Support

If you find this project useful:

Star the repo

🐛 Report issues

💡 Suggest features

❤️ Sponsor development

🌐 All Open Source Projects

💻 GitHub Profile

🔗 LinkedIn Profile

License

MIT

philiprehberger/php-geo 适用场景与选型建议

philiprehberger/php-geo 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 58 次下载、GitHub Stars 达 1, 最近一次更新时间为 2026 年 03 月 15 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「geo」 「distance」 「geospatial」 「Point-in-polygon」 「haversine」 「bounding-box」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 philiprehberger/php-geo 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 philiprehberger/php-geo 我们能提供哪些服务?
定制开发 / 二次开发

基于 philiprehberger/php-geo 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 58
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 40
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-03-15