Geolocation and Maps in PHP: Overview of Tools and Libraries
Working with geographic data is one of the key tasks of modern web applications. In PHP, despite the lack of built-in cartography support, there are many powerful libraries for processing geodata, geocoding, working with coordinates, and integrating with mapping services. In this article, we will review the most popular tools for working with geolocation and maps in PHP.
1. Libraries for Working with Geographic Data
geoPHP (phayes/geoPHP)
geoPHP is a library for working with geometric objects (points, lines, polygons) in WKT, WKB, GeoJSON, KML, GPX formats. It implements Open Geospatial Consortium (OGC) standards.
Key Features:
- Creating and manipulating geometric objects
- Conversion between formats (WKT ↔ GeoJSON ↔ KML)
- Calculating distances, areas, intersections
- Point-in-polygon checking
Code Example:
use geoPHP\\geoPHP;
// Creating a point$point = geoPHP::load('POINT(30.5234 50.4501)', 'wkt');echo $point->out('json'); // {"type":"Point","coordinates":[30.5234,50.4501]}
// Creating a polygon and checking point containment$polygon = geoPHP::load('POLYGON((30 50, 31 50, 31 51, 30 51, 30 50))', 'wkt');echo $point->intersects($polygon) ? 'Point inside' : 'Point outside';
// Calculating distance between two points (in meters)$point2 = geoPHP::load('POINT(30.7 50.5)', 'wkt');$distance = $point->distance($point2);echo "Distance: " . $distance . " meters";PHPGeo (mjaschen/phpgeo)
PHPGeo is a modern library for working with coordinates, distances, routes, and geo-fencing. It supports different Earth models (sphere, ellipsoid).
Features:
- Distance calculation using Vincenty, Haversine, Great Circle formulas
- Working with coordinates (latitude/longitude) and bearings
- Creating and checking geo-fences
- Support for various units of measurement (km, miles, nautical miles)
Code Example:
use Location\\Coordinate;use Location\\Distance\\Vincenty;use Location\\Formatter\\Coordinate\\DecimalDegrees;
$coord1 = new Coordinate(50.4501, 30.5234); // Kyiv$coord2 = new Coordinate(55.7558, 37.6173); // Moscow
$calculator = new Vincenty();$distance = $calculator->getDistance($coord1, $coord2);
echo "Distance between Kyiv and Moscow: " . round($distance / 1000, 1) . " km";
// Formatting coordinates$formatter = new DecimalDegrees();echo $coord1->format($formatter); // 50.45010 30.52340
// Creating a simple geo-fence (circle with radius 100 km)$center = new Coordinate(50.0, 30.0);$radius = 100000; // in meters$targetCoord = new Coordinate(50.5, 30.5);$distanceFromCenter = $calculator->getDistance($center, $targetCoord);
if ($distanceFromCenter <= $radius) { echo "Point inside zone";} else { echo "Point outside zone";}2. Integration with Mapping Services
Google Maps API via Guzzle
For working with the Google Maps API (geocoding, routes, places), it is recommended to use the HTTP client Guzzle. The library allows sending requests to the API and processing responses.
Geocoding Example:
require 'vendor/autoload.php';
use GuzzleHttp\\Client;
$apiKey = 'YOUR_API_KEY';$address = 'Kyiv, Khreshchatyk, 1';
$client = new Client();$response = $client->get('https://maps.googleapis.com/maps/api/geocode/json', [ 'query' => [ 'address' => $address, 'key' => $apiKey, 'language' => 'en' ]]);
$data = json_decode($response->getBody(), true);
if ($data['statu