Git Product home page Git Product logo

geo's Introduction

Brick\Geo

A collection of classes to work with GIS geometries.

Build Status Coverage Status Latest Stable Version Total Downloads License

Introduction

This library is a PHP implementation of the OpenGIS specification.

It is essentially a wrapper around a third-party GIS engine, to which it delegates most of the complexity of the geometry calculations. Several engines are supported, from native PHP extensions such as GEOS to GIS-compatible databases such as MySQL or PostgreSQL.

Requirements and installation

This library requires 7.1 or later. for PHP 5.6 and PHP 7.0 support, use version 0.1.

We recommend installing it with Composer. Just define the following requirement in your composer.json file:

{
    "require": {
        "brick/geo": "0.2.*"
    }
}

Then head on to the Configuration section to configure a GIS geometry engine.

Failure to configure a geometry engine would result in a GeometryEngineException being thrown when trying to use a method that requires one.

Project status & release process

This library is still under development.

The current releases are numbered 0.x.y. When a non-breaking change is introduced (adding new methods, optimizing existing code, etc.), y is incremented.

When a breaking change is introduced, a new 0.x version cycle is always started.

It is therefore safe to lock your project to a given release cycle, such as 0.2.*.

If you need to upgrade to a newer release cycle, check the release history for a list of changes introduced by each further 0.x.0 version.

Configuration

Configuring the library consists in choosing the most convenient GeometryEngine implementation for your installation. The following implementations are available:

  • PDOEngine: communicates with a GIS-compatible database over a PDO connection.
    This engine currently supports the following databases:
    • MySQL version 5.6 or greater.
      Note: MySQL currently only supports 2D geometries.
    • MariaDB version 5.5 or greater.
    • PostgreSQL with the PostGIS extension.
  • SQLite3Engine: communicates with a SQLite3 database with the SpatiaLite extension.
  • GEOSEngine: uses the GEOS PHP bindings.

Following is a step-by-step guide for all the possible configurations:

Using PDO and MySQL 5.6 or greater

  • Ensure that your MySQL version is at least 5.6.
    Earlier versions only have partial GIS support based on bounding boxes and are not supported.

  • Use this bootstrap code in your project:

      use Brick\Geo\Engine\GeometryEngineRegistry;
      use Brick\Geo\Engine\PDOEngine;
    
      $pdo = new PDO('mysql:host=localhost', 'root', '');
      GeometryEngineRegistry::set(new PDOEngine($pdo));
    

Update the code with your own connection parameters, or use an existing PDO connection if you have one (recommended).

Using PDO and MariaDB 5.5 or greater

MariaDB is a fork of MySQL, so you can follow the same procedure as for MySQL. Just ensure that your MariaDB version is 5.5 or greater.

Using PDO and PostgreSQL with PostGIS

  • Ensure that PostGIS is installed on your server

  • Enable PostGIS on the database server if needed:

      CREATE EXTENSION postgis;
    
  • Use this bootstrap code in your project:

      use Brick\Geo\Engine\GeometryEngineRegistry;
      use Brick\Geo\Engine\PDOEngine;
    
      $pdo = new PDO('pgsql:host=localhost', 'postgres', '');
      GeometryEngineRegistry::set(new PDOEngine($pdo));
    

Update the code with your own connection parameters, or use an existing PDO connection if you have one (recommended).

Using PDO and SQLite with SpatiaLite

Due to limitations in the PDO_SQLITE driver, it is currently not possible to load the SpatiaLite extension with a SELECT LOAD_EXTENSION() query, hence you cannot use SpatiaLite with the PDO driver.

You need to use the SQLite3 driver instead. Note that you can keep using your existing PDO_SQLITE code, all you need to do is create an additional in-memory SQLite3 database just to power the geometry engine.

Using SQLite3 with SpatiaLite

  • Ensure that SpatiaLite is installed on your system.

  • Ensure that the SQLite3 extension is enabled in your php.ini:

      extension=sqlite3.so
    
  • Ensure that the SQLite3 extension dir where SpatiaLite is installed is configured in your php.ini:

      [sqlite3]
      sqlite3.extension_dir = /usr/lib
    
  • Use this bootstrap code in your project:

      use Brick\Geo\Engine\GeometryEngineRegistry;
      use Brick\Geo\Engine\SQLite3Engine;
    
      $sqlite3 = new SQLite3(':memory:');
      $sqlite3->loadExtension('mod_spatialite.so');
      GeometryEngineRegistry::set(new SQLite3Engine($sqlite3));
    

In this example we have created an in-memory database for our GIS calculations, but you can also use an existing SQLite3 connection.

Using GEOS PHP bindings

  • Ensure that the PHP bindings for GEOS are installed on your server (GEOS 3.6.0 onwards; previous versions require compiling GEOS with the --enable-php flag).

  • Ensure that the GEOS extension is enabled in your php.ini:

      extension=geos.so
    
  • Use this bootstrap code in your project:

      use Brick\Geo\Engine\GeometryEngineRegistry;
      use Brick\Geo\Engine\GEOSEngine;
    
      GeometryEngineRegistry::set(new GEOSEngine());
    

Geometry hierarchy

All geometry objects reside in the Brick\Geo namespace, and extend a base Geometry class:

Geometry exceptions

All geometry exceptions reside in the Brick\Geo\Exception namespace, and extend a base GeometryException object.

Geometry exceptions are fine-grained: only subclasses of the base GeometryException class are thrown throughout the project. This leaves to the user the choice to catch only specific exceptions, or all geometry-related exceptions.

Here is a list of all exceptions:

  • CoordinateSystemException is thrown when mixing objects with different SRID or dimensionality (e.g. XY with XYZ)
  • EmptyGeometryException is thrown when trying to access a non-existent property on an empty geometry
  • GeometryEngineException is thrown when a functionality is not supported by the current geometry engine
  • GeometryIOException is thrown when an error occurs while reading or writing (E)WKB/T data
  • InvalidGeometryException is thrown when creating an invalid geometry, such as a LineString with only one Point
  • NoSuchGeometryException is thrown when attempting to get a geometry at an non-existing index in a collection
  • UnexpectedGeometryException is thrown when a geometry is not an instance of the expected sub-type, for example when calling Point::fromText() with a LineString WKT.

Example

use Brick\Geo\Polygon;

$polygon = Polygon::fromText('POLYGON ((0 0, 0 3, 3 3, 0 0))');
echo $polygon->area(); // 4.5

$centroid = $polygon->centroid();
echo $centroid->asText(); // POINT (1 2)

Spatial Function Reference

This is a list of all functions which are currently implemented in the geo project. Some functions are only available if you use a specific geometry engine, sometimes with a minimum version. This table also shows which functions are part of the OpenGIS standard.

Function Name GEOS PostGIS MySQL MariaDB SpatiaLite OpenGIS standard
area
boundary
buffer
centroid
contains
convexHull 5.7.6
crosses
difference
disjoint
distance
envelope
equals
intersects
intersection
isSimple
isValid 5.7.6
length
locateAlong
locateBetween
maxDistance
overlaps
pointOnSurface
relate
simplify 5.7.6 4.1.0
snapToGrid
symDifference
touches
union
within

geo's People

Contributors

benmorel avatar cevou avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.