Geospatial utilities for distance, bounding box, and point-in-polygon calculations
composer require philiprehberger/php-geoGeospatial utilities for distance, bounding box, and point-in-polygon calculations.
composer require philiprehberger/php-geo
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
$km = Geo::distanceVincenty($nyc, $la); // More accurate for long distances
$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' => ...]
$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 = Geo::bearing($nyc, $la); // Initial bearing in degrees (0-360)
$mid = Geo::midpoint($nyc, $la); // Geographic midpoint
// 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
$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'
$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 = [
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
$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
$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 = [
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
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
| 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 |
composer install
vendor/bin/phpunit
vendor/bin/pint --test
If you find this project useful: