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("INSERT INTO points (k, v) VALUES ('point0', 'POINT (1.0 2.0)')"); $row = $session->execute("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("INSERT INTO points (k, v) VALUES ('point1', ?)", array("arguments" => array($point))); $row = $session->execute("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("INSERT INTO linestrings (k, v) VALUES ('linestring0', 'LINESTRING (0.0 1.0, 2.0 3.0, 4.0 5.0)')"); $row = $session->execute("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( "INSERT INTO linestrings (k, v) VALUES ('linestring1', ?)", array("arguments" => array($linestring)) ); $row = $session->execute("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( "INSERT INTO linestrings (k, v) VALUES ('linestring_empty', ?)", array("arguments" => array($linestring)) ); $row = $session->execute("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( "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("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( "INSERT INTO polygons (k, v) VALUES ('polygon1', ?)", array("arguments" => array($polygon)) ); $row = $session->execute("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 a polygon by binding a `Polygon` object that was created with a well-known-text string
- Given
- the following example:
$cluster = Dse::cluster()->build(); $session = $cluster->connect("simplex"); $polygon = new Dse\Polygon("POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))"); $session->execute( "INSERT INTO polygons (k, v) VALUES ('polygon1', ?)", array("arguments" => array($polygon)) ); $row = $session->execute("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( "INSERT INTO polygons (k, v) VALUES ('polygon_empty', ?)", array("arguments" => array($polygon)) ); $row = $session->execute("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