Geo-Toolkit for PHP.
Available items
The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:
Geokit is a PHP toolkit to solve geo-related tasks like:
Install the latest version with Composer.
composer require geokit/geokit
Check the Packagist page for all available versions.
A Distance instance allows for a convenient representation of a distance unit of measure.
use Geokit\Distance;$distance = new Distance(1000); // Defaults to meters // or $distance = new Distance(1, Distance::UNIT_KILOMETERS);
$meters = $distance->meters(); $kilometers = $distance->kilometers(); $miles = $distance->miles(); $yards = $distance->yards(); $feet = $distance->feet(); $inches = $distance->inches(); $nauticalMiles = $distance->nautical();
A Distance can also be created from a string with an optional unit.
use Geokit\Distance;$distance = Distance::fromString('1000'); // Defaults to meters $distance = Distance::fromString('1000m'); $distance = Distance::fromString('1km'); $distance = Distance::fromString('100 miles'); $distance = Distance::fromString('100 yards'); $distance = Distance::fromString('1 foot'); $distance = Distance::fromString('1 inch'); $distance = Distance::fromString('234nm');
A
Positionis a fundamental construct representing a geographical position in
x(or
longitude) and
y(or
latitude) coordinates.
Note, that
x/
ycoordinates are kept as is, while
longitude/
latitudeare normalized.
use Geokit\Position;$position = Position::fromXY(181, 91);
$x = $position->x(); // Returns -179.0, normalized $y = $position->y(); // Returns 89.0, normalized
A BoundingBox instance represents a rectangle in geographical coordinates, including one that crosses the 180 degrees longitudinal meridian.
It is constructed from its left-bottom (south-west) and right-top (north-east) corner points.
use Geokit\BoundingBox; use Geokit\Position;$southWest = Position::fromXY(2, 1); $northEast = Position::fromXY(2, 1);
$boundingBox = BoundingBox::fromCornerPositions($southWest, $northEast);
$southWestPosition = $boundingBox->southWest(); $northEastPosition = $boundingBox->northEast();
$center = $boundingBox->center();
$span = $boundingBox->span();
$boolean = $boundingBox->contains($position);
$newBoundingBox = $boundingBox->extend($position); $newBoundingBox = $boundingBox->union($otherBoundingBox);
With the
expand()and
shrink()methods, you can expand or shrink a BoundingBox instance by a distance.
use Geokit\Distance;$expandedBoundingBox = $boundingBox->expand( Distance::fromString('10km') );
$shrinkedBoundingBox = $boundingBox->shrink( Distance::fromString('10km') );
The
toPolygon()method converts the BoundingBox to an equivalent Polygon instance.
$polygon = $boundingBox->toPolygon();
A Polygon instance represents a two-dimensional shape of connected line segments and may either be closed (the first and last point are the same) or open.
use Geokit\BoundingBox; use Geokit\Polygon; use Geokit\Position;$polygon = Polygon::fromPositions( Position::fromXY(0, 0), Position::fromXY(1, 0), Position::fromXY(1, 1) );
$closedPolygon = $polygon->close();
/** @var Position $position */ foreach ($polygon as $position) { }
$polygon->contains(Position::fromXY(0.5, 0.5)); // true
/** @var BoundingBox $boundingBox */ $boundingBox = $polygon->toBoundingBox();
Geokit provides several functions to perform geographic calculations.
distanceHaversine(Position $from, Position $to): Calculates the approximate sea level great circle (Earth) distance between two points using the Haversine formula.
distanceVincenty(Position $from, Position $to): Calculates the geodetic distance between two points using the Vincenty inverse formula for ellipsoids.
use function Geokit\distanceHaversine; use function Geokit\distanceVincenty;$distance1 = distanceHaversine($from, $to); $distance2 = distanceVincenty($from, $to);
Both functions return a Distance instance.
The
circle()function calculates a closed circle Polygon given a center, radius and steps for precision.
use Geokit\Distance; use Geokit\Position; use function Geokit\circle;$circlePolygon = circle( Position::fromXY(8.50207515, 49.50042565), Distance::fromString('5km'), 32 );
Other useful functions are:
heading(Position $from, Position $to): Calculates the (initial) heading from the first point to the second point in degrees.
midpoint(Position $from, Position $to): Calculates an intermediate point on the geodesic between the two given points.
endpoint(Position $start, float $heading, Geokit\Distance $distance): Calculates the destination point along a geodesic, given an initial heading and distance, from the given start point.
Copyright (c) 2011-2020 Jan Sorgalla. Released under the MIT License.