NAME

Geo::Geos - Perl interface for GEOS C++ library

SYNOPSIS

use Geo::Geos::Coordinate;
use Geo::Geos::PrecisionModel qw/TYPE_FLOATING/;
use Geo::Geos::GeometryFactory;

my $srid = 3857; # coordinate system
my $pm   = Geo::Geos::PrecisionModel->new(TYPE_FLOATING);
my $gf   = Geo::Geos::GeometryFactory::create($pm, 3857);
my $lr   = $gf->createLinearRing([
    Geo::Geos::Coordinate->new(1,2),
    Geo::Geos::Coordinate->new(5,2),
    Geo::Geos::Coordinate->new(5,0),
    Geo::Geos::Coordinate->new(1,0),
    Geo::Geos::Coordinate->new(1,2),
], 2);

my $polygon = $gf->createPolygon($lr);
my $point   = $gf->createPoint(Geo::Geos::Coordinate->new(5,4));

# query
$polygon->getArea;              # => is 8
$polygon->getLength;            # => is 12
$polygon->distance($point);     # => is 2
$polygon->getCentroid;          # => is 'POINT (3.0000000000000000 1.0000000000000000)'

# operations
$polygon->symDifference($polygon);    # => is 'GEOMETRYCOLLECTION EMPTY'
$polygon->intersection($point);       # => is 'GEOMETRYCOLLECTION EMPTY'

# relations
$polygon->within($point);      # => ''
$polygon->contains($point);    # => ''
$polygon->covers($point);      # => ''
$polygon->touches($point);     # => ''
$polygon->intersects($point);  # => ''

$polygon->isValid;             # => success

# Well-Known Text (WKT) I/O
use Geo::Geos::WKTWriter;
use Geo::Geos::WKTReader;
my $string0 = Geo::Geos::WKTWriter->new->write($point);  # => 'POINT (5.0000000000000000 4.0000000000000000)'
my $g0  = Geo::Geos::WKTReader::read($string0);          # => isa 'Geo::Geos::Geometry'

# Well-Known Binary (WKB) I/O
use Geo::Geos::WKBReader;
use Geo::Geos::WKBWriter;
my $writer = Geo::Geos::WKBWriter->new;
my $string1 = $writer->write($point);
my $string2 = $writer->writeHEX($point);
my $g1 = Geo::Geos::WKBReader::read($string1);       # => isa 'Geo::Geos::Geometry'
my $g2 = Geo::Geos::WKBReader::readHEX($string2);    # => isa 'Geo::Geos::Geometry'

DESCRIPTION

This is Perl interface for GEOS C++ library. It is build around C++ API, which is a bit more convenient, but without stability guarantees.

Capabilities include:

Geometries: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection
Predicates: Intersects, Touches, Disjoint, Crosses, Within, Contains, Overlaps, Equals, Covers
Operations: Union, Distance, Intersection, Symmetric Difference, Convex Hull, Envelope, Buffer, Simplify, Polygon Assembly, Valid, Area, Length
Prepared geometries (pre-spatially indexed)
STR spatial index
OGC Well Known Text (WKT) and Well Known Binary (WKB) encoders and decoders.

The GEOS C++ is used by PostGIS project.

EXCLUDED C++ CLASSES

It is not possible or there is no need to have perl interface for all C++ classes of the library, partly because it is not possible to have perlish interface (safe, without memory leaks, without explicit dispose calls), partly because classes are not documented and/or buggy and some classes are seems internal to the library and no need to export them.

Here is a list of C++ classes, without Perl interface:

geos::geom::CoordinateFilter

geos::geom::CoordinateLessThen

geos::geom::CoordinateSequence (use Array of Coordinate*)

geos::geom::CoordinateSequenceFactory

geos::geom::CoordinateSequenceFilter

geos::geom::CoordinateArraySequence (use Array of Coordinate*)

geos::geom::GeometryFilter

geos::geom::GeometryComponentFilter

geos::geom::Location

geos::algorithm::RayCrossingCounter (duplicates methods in CGAlgorithms)

geos::noding::SegmentNodeList

geos::noding::snapround::HotPixel

geos::noding::MCIndexNoder

geos::noding::MCIndexSegmentSetMutualIntersector

geos::noding::SegmentSetMutualIntersector

geos::index::chain::MonotoneChainSelectAction

geos::index::bintree::* (Buggy interface)

geos::index::quadtree::* (See high-level wrapper Geo::Geos::Index::Quadtree)

geos::index::strtree::* (See high-level wrapper Geo::Geos::Index::STRtree)

geos::index::ItemVisitor (use CODEREF instead)

geos::index::sweepline::SweepLineIndex

geos::index::intervalrtree::SortedPackedIntervalRTree

geos::planargraph::* (Safe interface is not possible)

geos::geomgraph::* (Safe interface is not possible)

geos::operation::* (All main operations are wrapped as methods of Geo::Geos::Operation)

AUTHOR

Ivan Baidakou <i.baydakov@crazypanda.ru>, Crazy Panda, CP Decision LTD

SEE ALSO

GEOS C++ Library

PostGIS

Geo::Geos::Algorithm

Geo::Geos::Algorithm::HCoordinate

Geo::Geos::Algorithm::LineIntersector

Geo::Geos::Algorithm::MinimumDiameter

Geo::Geos::Coordinate

Geo::Geos::Dimension

Geo::Geos::Envelope

Geo::Geos::Geometry

Geo::Geos::GeometryCollection

Geo::Geos::GeometryFactory

Geo::Geos::Index::MonotoneChain

Geo::Geos::Index::MonotoneChainOverlapAction

Geo::Geos::Index::Quadtree

Geo::Geos::Index::SpatialIndex

Geo::Geos::Index::STRtree

Geo::Geos::IntersectionMatrix

Geo::Geos::LinearRing

Geo::Geos::LineSegment

Geo::Geos::LineString

Geo::Geos::MultiLineString

Geo::Geos::MultiPoint

Geo::Geos::MultiPolygon

Geo::Geos::Noding

Geo::Geos::Noding::BasicSegmentString

Geo::Geos::Noding::IntersectionAdder

Geo::Geos::Noding::IntersectionFinderAdder

Geo::Geos::Noding::IteratedNoder

Geo::Geos::Noding::NodedSegmentString

Geo::Geos::Noding::Noder

Geo::Geos::Noding::ScaledNoder

Geo::Geos::Noding::SegmentIntersectionDetector

Geo::Geos::Noding::SegmentIntersector

Geo::Geos::Noding::SegmentNode

Geo::Geos::Noding::SegmentString

Geo::Geos::Noding::SimpleNoder

Geo::Geos::Noding::SimpleSnapRounder

Geo::Geos::Noding::SingleInteriorIntersectionFinder

Geo::Geos::Noding::SinglePassNoder

Geo::Geos::Operation

Geo::Geos::Point

Geo::Geos::Polygon

Geo::Geos::Precision

Geo::Geos::Precision::GeometryPrecisionReducer

Geo::Geos::Precision::SimpleGeometryPrecisionReducer

Geo::Geos::PrecisionModel

Geo::Geos::Prep::Geometry

Geo::Geos::Prep::GeometryFactory

Geo::Geos::Triangle

Geo::Geos::Triangulate::DelaunayTriangulationBuilder

Geo::Geos::Triangulate::VoronoiDiagramBuilder

Geo::Geos::WKBConstants

Geo::Geos::WKBReader

Geo::Geos::WKBWriter

Geo::Geos::WKTReader

Geo::Geos::WKTWriter

LICENSE

You may distribute this code under the same terms as Perl itself.