LibGEOS.jl
LibGEOS.jl copied to clipboard
Julia package for manipulation and analysis of planar geometric objects
LibGEOS.jl
LibGEOS is a package for manipulation and analysis of planar geometric objects, based on the libraries GEOS (the engine of PostGIS) and JTS (from which GEOS is ported). This package wraps the GEOS C API, see its usage and reference docs.
Among other things, it allows you to parse Well-known Text (WKT).
p1 = readgeom("POLYGON((0 0,1 0,1 1,0 0))")
p2 = readgeom("POLYGON((0 0,1 0,1 1,0 1,0 0))")
p3 = readgeom("POLYGON((2 0,3 0,3 1,2 1,2 0))")
Add a buffer around them
g1 = buffer(p1, 0.5)
g2 = buffer(p2, 0.5)
g3 = buffer(p3, 0.5)
and take the union of different geometries
polygon = LibGEOS.union(g1, g3)
GEOS functionality is extensive, so coverage is incomplete, but the basic functionality for working with geospatial data is already available. I'm learning as I go along, so documentation is lacking, but if you're interested, you can have a look at the examples in the examples/
folder, or the tests in test/test_geo_interface.jl
and test/test_geos_operations.jl
.
Conversion to/from GeoInterface objects
GeoInterface.jl compatible geometries from many packages including GeometryBasics.jl, Shapefile.jl, GeoJSON.jl, KML.jl, ArchGDAL.jl, GADM.jl and others can be easily converted to LibGEOS geometries using:
GeoInterface.convert(LibGEOS, other_package_geometry)
To broadcast this over a vector or iterable we need to use Ref
on LibGEOS
:
GeoInterface.convert.(Ref(LibGEOS), iterable_of_geometries)
The same applies in reverse, such as for interop with the Makie.jl/GeometryBasics.jl ecosystem:
GeoInterface.convert(GeometryBasics, libgeos_geometry)
For packages like Shapefile.jl and GeoJSON.jl, converting to their objects isn't possible, as theyre not particularly useful on their own. Instead, we can just write directly:
Shapefile.write("myfile.shp", libgeos_geometry)
GeoInterface methods
GeoInterace.jl OGC standards methods work on LibGEOS objects:
-
GeoInterface.distance
-
GeoInterface.buffer
-
GeoInterface.convexhull
-
GeoInterface.equals
-
GeoInterface.disjoint
-
GeoInterface.intersects
-
GeoInterface.touches
-
GeoInterface.within
-
GeoInterface.contains
-
GeoInterface.overlaps
-
GeoInterface.crosses
-
GeoInterface.symdifference
-
GeoInterface.difference
-
GeoInterface.intersection
-
GeoInterface.union
See the GeoInterface.jl API docs for details.
Exported LibGEOS geometries:
-
GeometryCollection
-
LineString
-
LinearRing
-
MultiLineString
-
MultiPoint
-
MultiPolygon
-
Point
-
Polygon
-
STRtree
Exported LibGEOS functions:
-
area
-
boundary
-
buffer
-
bufferWithStyle
-
centroid
-
constrainedDelaunayTriangulation
-
containsproperly
-
convexhull
-
coveredby
-
covers
-
crosses
-
delaunayTriangulation
-
delaunayTriangulationEdges
-
difference
-
disjoint
-
distance
-
endPoint
-
envelope
-
equals
-
equalsexact
-
exteriorRing
-
geomLength
-
getGeometries
-
getGeometry
-
getPrecision
-
getXMax
-
getXMin
-
getYMax
-
getYMin
-
hasZ
-
hausdorffdistance
-
interiorRing
-
interiorRings
-
interpolate
-
interpolateNormalized
-
intersection
-
intersects
-
isClosed
-
isEmpty
-
isRing
-
isSimple
-
isValid
-
lineMerge
-
minimumRotatedRectangle
-
nearestPoints
-
node
-
numGeometries
-
numPoints
-
overlaps
-
pointOnSurface
-
polygonize
-
prepareGeom
-
project
-
projectNormalized
-
query
-
readgeom
-
setPrecision
-
sharedPaths
-
simplify
-
snap
-
startPoint
-
symmetricDifference
-
topologyPreserveSimplify
-
touches
-
unaryUnion
-
union
-
uniquePoints
-
within
-
writegeom
Installation
- At the Julia prompt, run
pkg> add LibGEOS
This will install both the Julia package and GEOS shared libraries together. The GEOS build comes from GEOS_jll, and the build script can be found in Yggdrasil.
- Test that
LibGEOS
works by runnning
pkg> test LibGEOS
Ecosystem
- All GeoInterface.jl compatible geometries will work in LibGEOS without conversion.
- Makie support for LibGEOS is available via LibGEOSMakie.jl
- LibGEOS integrates with GeoInterface.jl making it easy to combine LibGEOS with other geometry packages.