Skip to main content

Session: Querying: How to Query a Spatial Index

Spatial indexes can be queried using the Spatial method which contains a full spectrum of spatial methods. The following article will cover these methods:

Spatial

IRavenQueryable<T> Spatial<T>(
Expression<Func<T, object>> path,
Func<SpatialCriteriaFactory, SpatialCriteria> clause);

IRavenQueryable<T> Spatial<T>(
string fieldName,
Func<SpatialCriteriaFactory, SpatialCriteria> clause);

IRavenQueryable<T> Spatial<T>(
Func<DynamicSpatialFieldFactory<T>, DynamicSpatialField> field,
Func<SpatialCriteriaFactory, SpatialCriteria> clause);

IRavenQueryable<T> Spatial<T>(
DynamicSpatialField field,
Func<SpatialCriteriaFactory, SpatialCriteria> clause);
Parameters
pathExpression<Func<T, object>>Path to spatial field in an index
fieldNamestringPath to spatial field in an index
fieldFunc<DynamicSpatialFieldFactory<T>, DynamicSpatialField> or DynamicSpatialFieldFactory or field that points to a dynamic field (used with auto-indexes). Either PointField or WktField
clauseFunc<SpatialCriteriaFactory, SpatialCriteria>Spatial criteria that will be executed on a given spatial field from the path parameter.

DynamicSpatialFieldFactory

PointField Point(
Expression<Func<T, object>> latitudePath,
Expression<Func<T, object>> longitudePath);

WktField Wkt(Expression<Func<T, object>> wktPath);
Parameters
latitudePath or longitudePath or wktPathExpression<Func<T, object>>Path to the field in a document containing either longitude, latitude or WKT

SpatialCriteriaFactory

SpatialCriteria RelatesToShape(
string shapeWkt,
SpatialRelation relation,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria RelatesToShape(
string shapeWkt,
SpatialRelation relation,
SpatialUnits units,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria Intersects(
string shapeWkt,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria Intersects(
string shapeWkt,
SpatialUnits units,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria Contains(
string shapeWkt,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria Contains(
string shapeWkt,
SpatialUnits units,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria Disjoint(
string shapeWkt,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria Disjoint(
string shapeWkt,
SpatialUnits units,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria Within(
string shapeWkt,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria Within(
string shapeWkt,
SpatialUnits units,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);

SpatialCriteria WithinRadius(
double radius,
double latitude,
double longitude,
SpatialUnits? radiusUnits = null,
double distErrorPercent = Constants.Documents.Indexing.Spatial.DefaultDistanceErrorPct);
Parameters
shapeWktstringWKT-based shape to be used in operation
relationSpatialRelationShape relation. Can be Within, Contains, Disjoint, Intersects
distErrorPercentdoubleMaximum distance error tolerance in percents. Default: 0.025
radius or latitude or longitudedoubleUsed to define a radius circle
radiusUnitsSpatialUnitsDetermines if circle should be calculated in Kilometers or Miles units

Example I

// return all matching entities
// within 10 kilometers radius
// from 32.1234 latitude and 23.4321 longitude coordinates
List<House> results = session
.Query<House>()
.Spatial(
factory => factory.Point(x => x.Latitude, x => x.Longitude),
criteria => criteria.WithinRadius(10, 32.1234, 23.4321))
.ToList();

Example II

// return all matching entities
// within 10 kilometers radius
// from 32.1234 latitude and 23.4321 longitude coordinates
// this equals to WithinRadius(10, 32.1234, 23.4321)
List<House> results = session
.Query<House>()
.Spatial(
factory => factory.Point(x => x.Latitude, x => x.Longitude),
criteria => criteria.RelatesToShape("Circle(32.1234 23.4321 d=10.0000)", SpatialRelation.Within))
.ToList();

OrderByDistance

To sort by distance from given point use the OrderByDistance method. The closest results will come first.

// From point
IOrderedQueryable<T> OrderByDistance<T>(
Func<DynamicSpatialFieldFactory<T>, DynamicSpatialField> field,
double latitude,
double longitude);

IOrderedQueryable<T> OrderByDistance<T>(
DynamicSpatialField field,
double latitude,
double longitude);

IOrderedQueryable<T> OrderByDistance<T>(
Expression<Func<T, object>> path,
double latitude,
double longitude);

IOrderedQueryable<T> OrderByDistance<T>(
string fieldName,
double latitude,
double longitude);

// From center of WKT shape
IOrderedQueryable<T> OrderByDistance<T>(
Func<DynamicSpatialFieldFactory<T>, DynamicSpatialField> field,
string shapeWkt);

IOrderedQueryable<T> OrderByDistance<T>(
DynamicSpatialField field,
string shapeWkt);

IOrderedQueryable<T> OrderByDistance<T>(
Expression<Func<T, object>> path,
string shapeWkt);

IOrderedQueryable<T> OrderByDistance<T>(
string fieldName,
string shapeWkt);

// Rounding
IOrderedQueryable<T> OrderByDistance<T>(
Expression<Func<T, object>> path,
double latitude,
double longitude,
double roundFactor);

IOrderedQueryable<T> OrderByDistance<T>(
string fieldName,
double latitude,
double longitude,
double roundFactor);

IOrderedQueryable<T> OrderByDistance<T>(
Expression<Func<T, object>> path,
string shapeWkt,
double roundFactor);

IOrderedQueryable<T> OrderByDistance<T>(
string fieldName,
string shapeWkt,
double roundFactor);
Parameters
pathExpression<Func<T, object>>Path to spatial field in index
fieldNamestringPath to spatial field in index
fieldFunc<DynamicSpatialFieldFactory<T>, DynamicSpatialField> or DynamicSpatialFieldFactory or field that points to a dynamic field (used with auto-indexes). Either PointField or WktField
shapeWktstringWKT-based shape to be used as a point from which distance will be measured. If the shape is not a single point, then the center of the shape will be used as a reference.
latitude or longitudedoubleUsed to define a point from which distance will be measured

Example

// return all matching entities
// within 10 kilometers radius
// from 32.1234 latitude and 23.4321 longitude coordinates
// sort results by distance from 32.1234 latitude and 23.4321 longitude point
List<House> results = session
.Query<House>()
.Spatial(
factory => factory.Point(x => x.Latitude, x => x.Longitude),
criteria => criteria.WithinRadius(10, 32.1234, 23.4321))
.OrderByDistance(
factory => factory.Point(x => x.Latitude, x => x.Longitude), 32.1234, 23.4321)
.ToList();

OrderByDistanceDescending

To sort by distance from given point use the OrderByDistanceDescending method. The farthest results will come first.

// From point
IOrderedQueryable<T> OrderByDistanceDescending<T>(
Func<DynamicSpatialFieldFactory<T>, DynamicSpatialField> field,
double latitude,
double longitude);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
DynamicSpatialField field,
double latitude,
double longitude);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
Expression<Func<T, object>> path,
double latitude,
double longitude);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
string fieldName,
double latitude,
double longitude);

// From center of WKT shape
IOrderedQueryable<T> OrderByDistanceDescending<T>(
Func<DynamicSpatialFieldFactory<T>, DynamicSpatialField> field,
string shapeWkt);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
DynamicSpatialField field,
string shapeWkt);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
Expression<Func<T, object>> path,
string shapeWkt);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
string fieldName,
string shapeWkt);

// Rounding
IOrderedQueryable<T> OrderByDistanceDescending<T>(
Expression<Func<T, object>> path,
double latitude,
double longitude,
double roundFactor);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
string fieldName,
double latitude,
double longitude,
double roundFactor);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
Expression<Func<T, object>> path,
string shapeWkt,
double roundFactor);

IOrderedQueryable<T> OrderByDistanceDescending<T>(
string fieldName,
string shapeWkt,
double roundFactor);
Parameters
pathExpression<Func<T, object>>Path to spatial field in an index
fieldNamestringPath to spatial field in an index
fieldFunc<DynamicSpatialFieldFactory<T>, DynamicSpatialField> or DynamicSpatialFieldFactory or field that points to a dynamic field (used with auto-indexes). Either PointField or WktField
shapeWktstringWKT-based shape to be used as a point from which distance will be measured. If the shape is not a single point, then the center of the shape will be used as a reference.
latitude or longitudedoubleUsed to define a point from which distance will be measured

Example

// return all matching entities
// within 10 kilometers radius
// from 32.1234 latitude and 23.4321 longitude coordinates
// sort results by distance from 32.1234 latitude and 23.4321 longitude point
List<House> results = session
.Query<House>()
.Spatial(
factory => factory.Point(x => x.Latitude, x => x.Longitude),
criteria => criteria.WithinRadius(10, 32.1234, 23.4321))
.OrderByDistanceDescending(
factory => factory.Point(x => x.Latitude, x => x.Longitude), 32.1234, 23.4321)
.ToList();

Remarks

By default, distances are measured in kilometers.