DSE Geometry Types

This section shows how to query and work with the geometric types provided by DSE.

These types are enabled implicitly by creating the Session from cassandra.cluster.Cluster. This module implicitly registers these types for use in the driver. This extension provides some simple representative types in cassandra.util for inserting and retrieving data:

from cassandra.cluster import Cluster
from cassandra.util import Point, LineString, Polygon
session = Cluster().connect()

session.execute("INSERT INTO ks.geo (k, point, line, poly) VALUES (%s, %s, %s, %s)",
                0, Point(1, 2), LineString(((1, 2), (3, 4))), Polygon(((1, 2), (3, 4), (5, 6))))

Queries returning geometric types return the dse.util types. Note that these can easily be used to construct types from third-party libraries using the common attributes:

from shapely.geometry import LineString
shapely_linestrings = [LineString(res.line.coords) for res in session.execute("SELECT line FROM ks.geo")]

For prepared statements, shapely geometry types can be used interchangeably with the built-in types because their defining attributes are the same:

from shapely.geometry import Point
prepared = session.prepare("UPDATE ks.geo SET point = ? WHERE k = ?")
session.execute(prepared, (0, Point(1.2, 3.4)))

In order to use shapely types in a CQL-interpolated (non-prepared) query, one must update the encoder with those types, specifying the same string encoder as set for the internal types:

from cassandra import util
from shapely.geometry import Point, LineString, Polygon

encoder_func = session.encoder.mapping[util.Point]
for t in (Point, LineString, Polygon):
    session.encoder.mapping[t] = encoder_func

session.execute("UPDATE ks.geo SET point = %s where k = %s", (0, Point(1.2, 3.4)))