Polygon

A polygon consists of an ordered list of locations, i.e. instances of the Coordinate class. It’s very similar to a polyline, but its start and end points are connected.

Create a polygon

To create a polygon, just instantiate the class and add points:

<?php

use Location\Coordinate;
use Location\Polygon;

$polygon = new Polygon();
$polygon->addPoint(new Coordinate(52.5, 13.5));
$polygon->addPoint(new Coordinate(54.5, 12.5));
$polygon->addPoint(new Coordinate(55.5, 14.5));
?>

It’s possible to add points to the end at every time.

Get list of points

getPoints() is used to get the list of points, the number of points can be retrieved by calling getNumberOfPoints():

<?php

use Location\Coordinate;
use Location\Formatter\Coordinate\DMS;
use Location\Polygon;

$polygon = new Polygon();
$polygon->addPoint(new Coordinate(52.5, 13.5));
$polygon->addPoint(new Coordinate(54.5, 12.5));
$polygon->addPoint(new Coordinate(55.5, 14.5));

printf("The polygon consists of %d points:\n", $polygon->getNumberOfPoints());

foreach ($polygon->getPoints() as $point) {
    echo $point->format(new DMS()) . PHP_EOL;
}

The code above will produce the output below:

The polygon consists of 3 points:
52° 30′ 00″ 013° 30′ 00″
54° 30′ 00″ 012° 30′ 00″
55° 30′ 00″ 014° 30′ 00″

Segments

It’s possible to get a list of polygon segments. Segments are returned as an array of Line instances.

<?php

use Location\Coordinate;
use Location\Distance\Haversine;
use Location\Polygon;

$polygon = new Polygon();
$polygon->addPoint(new Coordinate(52.5, 13.5));
$polygon->addPoint(new Coordinate(54.5, 12.5));
$polygon->addPoint(new Coordinate(55.5, 14.5));

foreach ($polygon->getSegments() as $line) {
    printf("%0.3f m\n", $line->getLength(new Haversine()));
}

The code above will produce the output below:

232011.020 m
169207.795 m
339918.069 m

Length/Perimeter

Length calculation is described in the Distance and Length section.

Area

It’s possible to calculate the area of a polygon. The result is given in square meters (m²).

WARNING: The calculation gives inaccurate results. For relatively small polygons the error should be less than 1 %.

<?php

use Location\Coordinate;
use Location\Polygon;

$formatter = new \Location\Formatter\Coordinate\DecimalDegrees(' ', 10);

$polygon = new Polygon();
$polygon->addPoint(new Coordinate(0.0000000000, 0.0000000000));
$polygon->addPoint(new Coordinate(0.0000000000, 0.0008983153));
$polygon->addPoint(new Coordinate(0.0009043695, 0.0008983153));
$polygon->addPoint(new Coordinate(0.0009043695, 0.0000000000));

printf(
    'Polygon Area = %f m², Perimeter = %f m%s',
    $polygon->getArea(),
    $polygon->getPerimeter(new \Location\Distance\Vincenty()),
    PHP_EOL
);

The code above produces the output below:

Polygon Area = 10044.905261 m², Perimeter = 400.000000 m

Geofence

It’s possible to check if a geometry object (point, line, polyline, polygon) lies inside a polygon. The documentation can be found in the <<Geofence>> @TODO section.

Reverse Direction

It’s possible to get a new instance with reversed direction while the original polygon stays unchanged:

<?php

use Location\Coordinate;
use Location\Polygon;
use Location\Formatter\Coordinate\DecimalDegrees;

$polygon = new Polygon();
$polygon->addPoint(new Coordinate(52.5, 13.5));
$polygon->addPoint(new Coordinate(64.1, - 21.9));
$polygon->addPoint(new Coordinate(40.7, - 74.0));
$polygon->addPoint(new Coordinate(33.9, - 118.4));

$reversed = $polygon->getReverse();

foreach ($reversed->getPoints() as $point) {
    echo $point->format(new DecimalDegrees(', ')) . PHP_EOL;
}

The code above produces the output below:

33.90000, -118.40000
40.70000, -74.00000
64.10000, -21.90000
52.50000, 13.50000