Geospatial types
DataStax Enterprise 5.0+ adds types for representing geospatial data. The three
new geospatial types are point, line string and polygon. These types can be
specified directly in a query string using well-known text (WKT) or can be
bound to a query using the following objects:
Dse\Point
,
Dse\LineString
and
Dse\Polygon
.
Point
A point is a 2-dimensional location in space represented by two, double
precision floating numbers. Tables with columns of this type are created using
the type org.apache.cassandra.db.marshal.PointType
or the shorter PointType
.
$session = Dse::cluster()->build()->connect("examples");
# Create table and add a coordinate for the point of interest using the `Point`
# type
$session->execute(new Dse\SimpleStatement("CREATE TABLE IF NOT EXISTS points_of_interest
(name varchar PRIMARY KEY, coords 'PointType')"));
$session->execute(new Dse\SimpleStatement("INSERT INTO points_of_interest (name, coords) VALUES (?, ?)"),
new Dse\ExecutionOptions(array("arguments" => array("Eiffel Tower", new Dse\Point(48.8582, 2.2945)))));
# Get the coordinates for the inserted location
$row = $session->execute(new Dse\SimpleStatement("SELECT * FROM
points_of_interest"))->first();
echo "Name: '{$row['name']}' Coords: ({$row['coords']})" . PHP_EOL;
Line String
A line string is a 2-dimensional set of lines represented by a string of points.
Tables with columns of this type are created using the type
org.apache.cassandra.db.marshal.LineStringType
or the shorter
LineStringType
.
# Create table for trail paths
$session->execute(new Dse\SimpleStatement("CREATE TABLE IF NOT EXISTS trails
(name varchar PRIMARY KEY, path 'LineStringType')"));
# Add a new trail path using the `LineString` type
$path = new Dse\LineString(new Dse\Point(38, 78), new Dse\Point(39, 78), new Dse\Point(39.5, 79)); # ...
$session->execute(new Dse\SimpleStatement("INSERT INTO trails (name, path) VALUES (?, ?)"),
new Dse\ExecutionOptions(array("arguments" => array("Appalachian National Scenic Trail", $path))));
# Get the trail's path coordinates
$row = $session->execute(new Dse\SimpleStatement("SELECT * FROM trails"))->first();
echo "Name: '{$row['name']}'" . PHP_EOL;
echo "Path: " . implode(" --> ", $row['path']->points()) . PHP_EOL;
Polygon
A polygon is a bound set of line segments that form a closed loop. It is
characterized by a set of rings formed by line strings. The first ring
represents the external bounds of the polygon and all follow up rings represent
holes. The rings must be closed loops so they must be at least four points with
the first and last points being the same location. Tables with columns of this
type are created using the type org.apache.cassandra.db.marshal.PolygonType
or the shorter PolygonType
.
# Create a table to represent boundaries of places in the world (in this case a state)
$session->execute(new Dse\SimpleStatement("CREATE TABLE IF NOT EXISTS boundaries
(name varchar PRIMARY KEY, boundary 'PolygonType')"));
# Use a `LineString` to represent the exterior boundary of the state
$stateBoundary = new Dse\LineString(new Dse\Point(35, 10),
new Dse\Point(45, 45),
new Dse\Point(15, 40),
new Dse\Point(10, 20),
new Dse\Point(35, 10));
# Use a `LineString` to represent the boundary of a county inside the state's
# exteriro boundary
$countyBoundary = new Dse\LineString(new Dse\Point(20, 30),
new Dse\Point(35, 35),
new Dse\Point(30, 20),
new Dse\Point(20, 30));
# Add the state's boundary using the `Polygon` type
$boundary = new Dse\Polygon($stateBoundary, $countyBoundary);
$session->execute(new Dse\SimpleStatement("INSERT INTO boundaries (name, boundary) VALUES (?, ?)"),
new Dse\ExecutionOptions(array("arguments" => array("California", $boundary))));
$ Get the state's boundary
$row = $session->execute(new Dse\SimpleStatement("SELECT * FROM boundaries"))->first();
echo "Name: '{$row['name']}'" . PHP_EOL;
echo "State Boundary: " . implode("; ", $row['boundary']->exteriorRing()->points()) . PHP_EOL;
foreach ($row['boundary']->interiorRings() as $countyBoundary) {
echo "County Boundary: " . implode("; ", $countyBoundary->points()) . PHP_EOLo
}