DSE Geospatial Types
DSE 5.0 introduced geospatial types. The Point, LineString and Polygon
geospatial type objects are used to represent these types in your
application. These objects can be bound to queries and returned in columns
values.
Background
- Given
- a running DSE cluster
- And
- the following schema:
CREATE KEYSPACE simplex WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': 1 }; USE simplex; CREATE TABLE points (k text PRIMARY KEY, v 'PointType'); CREATE TABLE linestrings (k text PRIMARY KEY, v 'LineStringType'); CREATE TABLE polygons (k text PRIMARY KEY, v 'PolygonType');
Create a point using well-known text embedded in the query string
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $session->execute(new Dse\SimpleStatement("INSERT INTO points (k, v) VALUES ('point0', 'POINT (1.0 2.0)')")); $row = $session->execute(new Dse\SimpleStatement("SELECT * FROM points WHERE k = 'point0'"))->first(); $point = $row['v']; echo "X coord: {$point->x()}" . PHP_EOL; echo "Y coord: {$point->y()}" . PHP_EOL; echo "Coords as a string: $point" . PHP_EOL; echo "Point as WKT: {$point->wkt()}" . PHP_EOL; - When
- it is executed
- Then
- its output should contain:
X coord: 1 Y coord: 2 Coords as a string: 1,2 Point as WKT: POINT (1 2)
Create a point by binding a `Point` object
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $point = new Dse\Point(1.0, 2.0); $session->execute(new Dse\SimpleStatement("INSERT INTO points (k, v) VALUES ('point1', ?)"), new Dse\ExecutionOptions(array("arguments" => array($point)))); $row = $session->execute(new Dse\SimpleStatement("SELECT * FROM points WHERE k = 'point1'"))->first(); $point = $row['v']; echo "X coord: {$point->x()}" . PHP_EOL; echo "Y coord: {$point->y()}" . PHP_EOL; echo "Point as a string: $point" . PHP_EOL; echo "Point as WKT: {$point->wkt()}" . PHP_EOL; - When
- it is executed
- Then
- its output should contain:
X coord: 1 Y coord: 2 Point as a string: 1,2 Point as WKT: POINT (1 2)
Create a line string using well-known text embedded in the query string
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $session->execute(new Dse\SimpleStatement("INSERT INTO linestrings (k, v) VALUES ('linestring0', 'LINESTRING (0.0 1.0, 2.0 3.0, 4.0 5.0)')")); $row = $session->execute(new Dse\SimpleStatement("SELECT * FROM linestrings WHERE k = 'linestring0'"))->first(); $linestring = $row['v']; echo "First point: {$linestring->point(0)}" . PHP_EOL; echo "Second point: {$linestring->point(1)}" . PHP_EOL; echo "Third point: {$linestring->point(2)}" . PHP_EOL; echo "LineString as a string: $linestring" . PHP_EOL; echo "LineString as WKT: {$linestring->wkt()}" . PHP_EOL; - When
- it is executed
- Then
- its output should contain:
First point: 0,1 Second point: 2,3 Third point: 4,5 LineString as a string: 0,1 to 2,3 to 4,5 LineString as WKT: LINESTRING (0 1, 2 3, 4 5)
Create a line string by binding a `LineString` object
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $linestring = new Dse\LineString(new Dse\Point(0.0, 1.0), new Dse\Point(2.0, 3.0), new Dse\Point(4.0, 5.0)); $session->execute(new Dse\SimpleStatement("INSERT INTO linestrings (k, v) VALUES ('linestring1', ?)"), new Dse\ExecutionOptions(array("arguments" => array($linestring)))); $row = $session->execute(new Dse\SimpleStatement("SELECT * FROM linestrings WHERE k = 'linestring1'"))->first(); $linestring = $row['v']; echo "First point: {$linestring->point(0)}" . PHP_EOL; echo "Second point: {$linestring->point(1)}" . PHP_EOL; echo "Third point: {$linestring->point(2)}" . PHP_EOL; echo "LineString as a string: $linestring" . PHP_EOL; echo "LineString as WKT: {$linestring->wkt()}" . PHP_EOL; - When
- it is executed
- Then
- its output should contain:
First point: 0,1 Second point: 2,3 Third point: 4,5 LineString as a string: 0,1 to 2,3 to 4,5 LineString as WKT: LINESTRING (0 1, 2 3, 4 5)
Create empty line string
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $linestring = new Dse\LineString(); $session->execute(new Dse\SimpleStatement("INSERT INTO linestrings (k, v) VALUES ('linestring_empty', ?)"), new Dse\ExecutionOptions(array("arguments" => array($linestring)))); $row = $session->execute(new Dse\SimpleStatement("SELECT * FROM linestrings WHERE k = 'linestring_empty'"))->first(); $linestring = $row['v']; echo "LineString as WKT: {$linestring->wkt()}" . PHP_EOL; - When
- it is executed
- Then
- its output should contain:
LineString as WKT: LINESTRING EMPTY
Create a polygon using well-known text embedded in the query string
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $session->execute(new Dse\SimpleStatement("INSERT INTO polygons (k, v) VALUES ('polygon0', 'POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))')")); $row = $session->execute(new Dse\SimpleStatement("SELECT * FROM polygons WHERE k = 'polygon0'"))->first(); $polygon = $row['v']; echo "Exterior ring: {$polygon->exteriorRing()}" . PHP_EOL; echo "Interior ring: {$polygon->interiorRings()[0]}" . PHP_EOL; echo "Polygon as a string: " . PHP_EOL; echo $polygon . PHP_EOL; echo "Polygon as wkt {$polygon->wkt()}" . PHP_EOL; - When
- it is executed
- Then
- its output should contain:
Exterior ring: 35,10 to 45,45 to 15,40 to 10,20 to 35,10 Interior ring: 20,30 to 35,35 to 30,20 to 20,30 Polygon as a string: Exterior ring: 35,10 to 45,45 to 15,40 to 10,20 to 35,10 Interior rings: 20,30 to 35,35 to 30,20 to 20,30 Polygon as wkt POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))
Create a polygon by binding a `Polygon` object
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $linestring0 = 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)); $linestring1 = new Dse\LineString(new Dse\Point(20, 30), new Dse\Point(35, 35), new Dse\Point(30, 20), new Dse\Point(20, 30)); $polygon = new Dse\Polygon($linestring0, $linestring1); $session->execute(new Dse\SimpleStatement("INSERT INTO polygons (k, v) VALUES ('polygon1', ?)"), new Dse\ExecutionOptions(array("arguments" => array($polygon)))); $row = $session->execute(new Dse\SimpleStatement("SELECT * FROM polygons WHERE k = 'polygon1'"))->first(); $polygon = $row['v']; echo "Exterior ring: {$polygon->exteriorRing()}" . PHP_EOL; echo "Interior ring: {$polygon->interiorRings()[0]}" . PHP_EOL; echo "Polygon as a string: " . PHP_EOL; echo $polygon . PHP_EOL; echo "Polygon as wkt {$polygon->wkt()}" . PHP_EOL; - When
- it is executed
- Then
- its output should contain:
Exterior ring: 35,10 to 45,45 to 15,40 to 10,20 to 35,10 Interior ring: 20,30 to 35,35 to 30,20 to 20,30 Polygon as a string: Exterior ring: 35,10 to 45,45 to 15,40 to 10,20 to 35,10 Interior rings: 20,30 to 35,35 to 30,20 to 20,30 Polygon as wkt POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))
Create empty polygon
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $polygon = new Dse\Polygon(); $session->execute(new Dse\SimpleStatement("INSERT INTO polygons (k, v) VALUES ('polygon_empty', ?)"), new Dse\ExecutionOptions(array("arguments" => array($polygon)))); $row = $session->execute(new Dse\SimpleStatement("SELECT * FROM polygons WHERE k = 'polygon_empty'"))->first(); $polygon = $row['v']; echo "Polygon as WKT: {$polygon->wkt()}" . PHP_EOL; - When
- it is executed
- Then
- its output should contain:
Polygon as WKT: POLYGON EMPTY