Number of watchers on Github  932 
Number of open issues  7 
Main language  PHP 
Average time to merge a PR  about 21 hours 
Open pull requests  1+ 
Closed pull requests  0+ 
Last commit  over 1 year ago 
Repo Created  over 6 years ago 
Repo Last Updated  over 1 year ago 
Size  418 KB 
Organization / Author  mjaschen 
Contributors  3 
Page Updated  20180312 
Do you use phpgeo? Leave a review!  
View open issues (7)  
View phpgeo activity  
View on github  
Fresh, new opensource launches 🚀🚀🚀  
Trendy new open source projects in your inbox!
View examples

phpgeo provides abstractions to geographical coordinates (including support for different ellipsoids) and allows you to calculate geographical distances between coordinates with high precision.
Minimum required PHP version is 7.0.
The documentation is available at https://phpgeo.marcusjaschen.de/
API documentation is available as well: https://phpgeo.marcusjaschen.de/api/
Using Composer, just add it to your composer.json
by running:
composer require mjaschen/phpgeo
Starting with version 2.0.0 phpgeo is licensed under the MIT license. Older versions were GPLlicensed.
Info: Please visit the documentation site for complete and uptodate documentation!
phpgeo provides the following features (follow the links for examples):
Is this point contained in that area/polygon?
18 54 41 155 40 42
)This list is incomplete, please visit the documentation site for the full monty of documentation and examples!
Use the calculator object directly:
<?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)
or call the getDistance()
method of a Coordinate object by injecting a calculator object:
<?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)
Polylines can be simplified to save storage space or bandwidth. Simplification is done with the RamerDouglasPeucker algorithm (AKA DouglasPeucker algorithm).
<?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 geofence)
phpgeo has a polygon implementation which can be used to determinate if a point is contained in it or not.
A polygon consists of at least three points. Points are instances of the Coordinate
class.
Warning: The calculation gives wrong results if the polygons has points on both sides of the 180/180 degrees meridian.
<?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
You can format a coordinate in different styles.
<?php
use Location\Coordinate;
use Location\Formatter\Coordinate\DecimalDegrees;
$coordinate = new Coordinate(19.820664, 155.468066); // Mauna Kea Summit
echo $coordinate>format(new DecimalDegrees());
<?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
<?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 ] }