Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
b9070a2
updated spatial get type
ArnabChatterjee20k Sep 5, 2025
b5ea4d1
Merge pull request #688 from utopia-php/spatial-type-change
abnegate Sep 5, 2025
bf1aad0
reduced the spatial query dimension to avoid nested array on the user…
ArnabChatterjee20k Sep 7, 2025
57358ac
Merge pull request #689 from utopia-php/sptial-query-fix
abnegate Sep 8, 2025
46f1a46
* Add support for distance calculation between multidimension geometr…
ArnabChatterjee20k Sep 8, 2025
158e7c1
Fix spatial distance error messages and improve validation for geomet…
ArnabChatterjee20k Sep 8, 2025
ab3a235
Refactor spatial query handling and improve error messages in databas…
ArnabChatterjee20k Sep 8, 2025
8d85d66
updated types
ArnabChatterjee20k Sep 8, 2025
297b29a
lint
ArnabChatterjee20k Sep 8, 2025
f06a57a
Merge pull request #692 from utopia-php/spatial-distance-fix
abnegate Sep 8, 2025
79e7eba
updated spatial update attribute
ArnabChatterjee20k Sep 9, 2025
78ca0c7
replaced database exception with query exception
ArnabChatterjee20k Sep 9, 2025
2df73ea
updated tests
ArnabChatterjee20k Sep 9, 2025
16f96e5
Merge pull request #693 from utopia-php/spatial-attribute-update-fix
abnegate Sep 10, 2025
0d4f2ec
added long-lat order to constant in the mariadb/mysql adapter
ArnabChatterjee20k Sep 10, 2025
796310b
spatial types filter
ArnabChatterjee20k Sep 10, 2025
7f08617
updated condition for returning value in the filters encode/decode
ArnabChatterjee20k Sep 10, 2025
adb82de
refactor spatial attribute handling to support NULL values and improv…
ArnabChatterjee20k Sep 10, 2025
d291d6a
linting
ArnabChatterjee20k Sep 10, 2025
7ed30f4
updated index validator for spatial types
ArnabChatterjee20k Sep 10, 2025
4f7bae7
updated spatial type tests with spatial index and non spatial combiation
ArnabChatterjee20k Sep 10, 2025
7123d28
fixed postgres test failing due to 0 length varchar
ArnabChatterjee20k Sep 10, 2025
1bac5c6
Merge pull request #694 from utopia-php/spatial-filter
abnegate Sep 11, 2025
4abe0ef
updated array conditon for filter
ArnabChatterjee20k Sep 11, 2025
c7dcfd8
Merge pull request #696 from utopia-php/spatial-filter
abnegate Sep 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/Database/Adapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -578,10 +578,11 @@ abstract public function createAttributes(string $collection, array $attributes)
* @param bool $signed
* @param bool $array
* @param string|null $newKey
* @param bool $required
*
* @return bool
*/
abstract public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null): bool;
abstract public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null, bool $required = false): bool;

/**
* Delete Attribute
Expand Down Expand Up @@ -1077,6 +1078,13 @@ abstract public function getSupportForSpatialIndexOrder(): bool;
*/
abstract public function getSupportForBoundaryInclusiveContains(): bool;

/**
* Does the adapter support calculating distance(in meters) between multidimension geometry(line, polygon,etc)?
*
* @return bool
*/
abstract public function getSupportForDistanceBetweenMultiDimensionGeometryInMeters(): bool;

/**
* Get current attribute count from collection document
*
Expand Down
91 changes: 68 additions & 23 deletions src/Database/Adapter/MariaDB.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Utopia\Database\Exception as DatabaseException;
use Utopia\Database\Exception\Duplicate as DuplicateException;
use Utopia\Database\Exception\NotFound as NotFoundException;
use Utopia\Database\Exception\Query as QueryException;
use Utopia\Database\Exception\Timeout as TimeoutException;
use Utopia\Database\Exception\Truncate as TruncateException;
use Utopia\Database\Helpers\ID;
Expand Down Expand Up @@ -409,16 +410,16 @@ public function getSchemaAttributes(string $collection): array
* @param bool $signed
* @param bool $array
* @param string|null $newKey
* @param bool $required
* @return bool
* @throws DatabaseException
*/
public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null): bool
public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null, bool $required = false): bool
{
$name = $this->filter($collection);
$id = $this->filter($id);
$newKey = empty($newKey) ? null : $this->filter($newKey);
$type = $this->getSQLType($type, $size, $signed, $array, false);

$type = $this->getSQLType($type, $size, $signed, $array, $required);
if (!empty($newKey)) {
$sql = "ALTER TABLE {$this->getSQLTable($name)} CHANGE COLUMN `{$id}` `{$newKey}` {$type};";
} else {
Expand Down Expand Up @@ -1358,14 +1359,16 @@ public function deleteDocument(string $collection, string $id): bool
* @param Query $query
* @param array<string, mixed> $binds
* @param string $attribute
* @param string $type
* @param string $alias
* @param string $placeholder
* @return string
*/
protected function handleDistanceSpatialQueries(Query $query, array &$binds, string $attribute, string $alias, string $placeholder): string
protected function handleDistanceSpatialQueries(Query $query, array &$binds, string $attribute, string $type, string $alias, string $placeholder): string
{
$distanceParams = $query->getValues()[0];
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
$wkt = $this->convertArrayToWKT($distanceParams[0]);
$binds[":{$placeholder}_0"] = $wkt;
$binds[":{$placeholder}_1"] = $distanceParams[1];

$useMeters = isset($distanceParams[2]) && $distanceParams[2] === true;
Expand All @@ -1388,6 +1391,11 @@ protected function handleDistanceSpatialQueries(Query $query, array &$binds, str
}

if ($useMeters) {
$wktType = $this->getSpatialTypeFromWKT($wkt);
$attrType = strtolower($type);
if ($wktType != Database::VAR_POINT || $attrType != Database::VAR_POINT) {
throw new QueryException('Distance in meters is not supported between '.$attrType . ' and '. $wktType);
}
return "ST_DISTANCE_SPHERE({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0), 6371000) {$operator} :{$placeholder}_1";
}
return "ST_Distance({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0)) {$operator} :{$placeholder}_1";
Expand All @@ -1399,66 +1407,67 @@ protected function handleDistanceSpatialQueries(Query $query, array &$binds, str
* @param Query $query
* @param array<string, mixed> $binds
* @param string $attribute
* @param string $type
* @param string $alias
* @param string $placeholder
* @return string
*/
protected function handleSpatialQueries(Query $query, array &$binds, string $attribute, string $alias, string $placeholder): string
protected function handleSpatialQueries(Query $query, array &$binds, string $attribute, string $type, string $alias, string $placeholder): string
{
switch ($query->getMethod()) {
case Query::TYPE_CROSSES:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "ST_Crosses({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "ST_Crosses({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_NOT_CROSSES:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "NOT ST_Crosses({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "NOT ST_Crosses({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_DISTANCE_EQUAL:
case Query::TYPE_DISTANCE_NOT_EQUAL:
case Query::TYPE_DISTANCE_GREATER_THAN:
case Query::TYPE_DISTANCE_LESS_THAN:
return $this->handleDistanceSpatialQueries($query, $binds, $attribute, $alias, $placeholder);
return $this->handleDistanceSpatialQueries($query, $binds, $attribute, $type, $alias, $placeholder);

case Query::TYPE_INTERSECTS:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "ST_Intersects({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "ST_Intersects({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_NOT_INTERSECTS:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "NOT ST_Intersects({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "NOT ST_Intersects({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_OVERLAPS:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "ST_Overlaps({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "ST_Overlaps({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_NOT_OVERLAPS:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "NOT ST_Overlaps({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "NOT ST_Overlaps({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_TOUCHES:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "ST_Touches({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "ST_Touches({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_NOT_TOUCHES:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "NOT ST_Touches({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "NOT ST_Touches({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_EQUAL:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "ST_Equals({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "ST_Equals({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_NOT_EQUAL:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "NOT ST_Equals({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "NOT ST_Equals({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_CONTAINS:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "ST_Contains({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "ST_Contains({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

case Query::TYPE_NOT_CONTAINS:
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($query->getValues()[0]);
return "NOT ST_Contains({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0))";
return "NOT ST_Contains({$alias}.{$attribute}, ST_GeomFromText(:{$placeholder}_0, 'axis-order=long-lat'))";

default:
throw new DatabaseException('Unknown spatial query method: ' . $query->getMethod());
Expand Down Expand Up @@ -1487,7 +1496,7 @@ protected function getSQLCondition(Query $query, array &$binds, array $attribute
$attributeType = $this->getAttributeType($query->getAttribute(), $attributes);

if (in_array($attributeType, Database::SPATIAL_TYPES)) {
return $this->handleSpatialQueries($query, $binds, $attribute, $alias, $placeholder);
return $this->handleSpatialQueries($query, $binds, $attribute, $attributeType, $alias, $placeholder);
}

switch ($query->getMethod()) {
Expand Down Expand Up @@ -1632,13 +1641,39 @@ protected function getSQLType(string $type, int $size, bool $signed = true, bool


case Database::VAR_POINT:
return 'POINT' . ($required && !$this->getSupportForSpatialIndexNull() ? ' NOT NULL' : '');
$type = 'POINT';
if (!$this->getSupportForSpatialIndexNull()) {
if ($required) {
$type .= ' NOT NULL';
} else {
$type .= ' NULL';
}
}
return $type;

case Database::VAR_LINESTRING:
return 'LINESTRING' . ($required && !$this->getSupportForSpatialIndexNull() ? ' NOT NULL' : '');
$type = 'LINESTRING';
if (!$this->getSupportForSpatialIndexNull()) {
if ($required) {
$type .= ' NOT NULL';
} else {
$type .= ' NULL';
}
}
return $type;


case Database::VAR_POLYGON:
return 'POLYGON' . ($required && !$this->getSupportForSpatialIndexNull() ? ' NOT NULL' : '');
$type = 'POLYGON';
if (!$this->getSupportForSpatialIndexNull()) {
if ($required) {
$type .= ' NOT NULL';
} else {
$type .= ' NULL';
}
}
return $type;


default:
throw new DatabaseException('Unknown type: ' . $type . '. Must be one of ' . Database::VAR_STRING . ', ' . Database::VAR_INTEGER . ', ' . Database::VAR_FLOAT . ', ' . Database::VAR_BOOLEAN . ', ' . Database::VAR_DATETIME . ', ' . Database::VAR_RELATIONSHIP . ', ' . ', ' . Database::VAR_POINT . ', ' . Database::VAR_LINESTRING . ', ' . Database::VAR_POLYGON);
Expand Down Expand Up @@ -1868,4 +1903,14 @@ public function getSupportForSpatialIndexOrder(): bool
{
return true;
}

/**
* Does the adapter support calculating distance(in meters) between multidimension geometry(line, polygon,etc)?
*
* @return bool
*/
public function getSupportForDistanceBetweenMultiDimensionGeometryInMeters(): bool
{
return false;
}
}
15 changes: 13 additions & 2 deletions src/Database/Adapter/MySQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,12 @@ public function getSizeOfCollectionOnDisk(string $collection): int
* @param Query $query
* @param array<string, mixed> $binds
* @param string $attribute
* @param string $type
* @param string $alias
* @param string $placeholder
* @return string
*/
protected function handleDistanceSpatialQueries(Query $query, array &$binds, string $attribute, string $alias, string $placeholder): string
protected function handleDistanceSpatialQueries(Query $query, array &$binds, string $attribute, string $type, string $alias, string $placeholder): string
{
$distanceParams = $query->getValues()[0];
$binds[":{$placeholder}_0"] = $this->convertArrayToWKT($distanceParams[0]);
Expand All @@ -116,7 +117,7 @@ protected function handleDistanceSpatialQueries(Query $query, array &$binds, str

if ($useMeters) {
$attr = "ST_SRID({$alias}.{$attribute}, " . Database::SRID . ")";
$geom = "ST_GeomFromText(:{$placeholder}_0, " . Database::SRID . ")";
$geom = "ST_GeomFromText(:{$placeholder}_0, " . Database::SRID . ",'axis-order=long-lat')";
return "ST_Distance({$attr}, {$geom}, 'metre') {$operator} :{$placeholder}_1";
}

Expand Down Expand Up @@ -173,4 +174,14 @@ public function getSupportForSpatialIndexOrder(): bool
{
return false;
}

/**
* Does the adapter support calculating distance(in meters) between multidimension geometry(line, polygon,etc)?
*
* @return bool
*/
public function getSupportForDistanceBetweenMultiDimensionGeometryInMeters(): bool
{
return true;
}
}
11 changes: 10 additions & 1 deletion src/Database/Adapter/Pool.php
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ public function createAttributes(string $collection, array $attributes): bool
return $this->delegate(__FUNCTION__, \func_get_args());
}

public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null): bool
public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null, bool $required = false): bool
{
return $this->delegate(__FUNCTION__, \func_get_args());
}
Expand Down Expand Up @@ -530,4 +530,13 @@ public function getSupportForSpatialIndexOrder(): bool
{
return $this->delegate(__FUNCTION__, \func_get_args());
}
/**
* Does the adapter support calculating distance(in meters) between multidimension geometry(line, polygon,etc)?
*
* @return bool
*/
public function getSupportForDistanceBetweenMultiDimensionGeometryInMeters(): bool
{
return $this->delegate(__FUNCTION__, \func_get_args());
}
}
20 changes: 15 additions & 5 deletions src/Database/Adapter/Postgres.php
Original file line number Diff line number Diff line change
Expand Up @@ -535,16 +535,17 @@ public function renameAttribute(string $collection, string $old, string $new): b
* @param bool $signed
* @param bool $array
* @param string|null $newKey
* @param bool $required
* @return bool
* @throws Exception
* @throws PDOException
*/
public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null): bool
public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null, bool $required = false): bool
{
$name = $this->filter($collection);
$id = $this->filter($id);
$newKey = empty($newKey) ? null : $this->filter($newKey);
$type = $this->getSQLType($type, $size, $signed, $array, false);
$type = $this->getSQLType($type, $size, $signed, $array, $required);

if ($type == 'TIMESTAMP(3)') {
$type = "TIMESTAMP(3) without time zone USING TO_TIMESTAMP(\"$id\", 'YYYY-MM-DD HH24:MI:SS.MS')";
Expand Down Expand Up @@ -1488,9 +1489,8 @@ protected function handleDistanceSpatialQueries(Query $query, array &$binds, str
}

if ($meters) {
// Transform both attribute and input geometry to 3857 (meters) for distance calculation
$attr = "ST_Transform({$alias}.{$attribute}, 3857)";
$geom = "ST_Transform(ST_GeomFromText(:{$placeholder}_0, " . Database::SRID . "), 3857)";
$attr = "({$alias}.{$attribute}::geography)";
$geom = "ST_SetSRID(ST_GeomFromText(:{$placeholder}_0), " . Database::SRID . ")::geography";
return "ST_Distance({$attr}, {$geom}) {$operator} :{$placeholder}_1";
}

Expand Down Expand Up @@ -1982,4 +1982,14 @@ public function getSupportForSpatialIndexOrder(): bool
{
return false;
}

/**
* Does the adapter support calculating distance(in meters) between multidimension geometry(line, polygon,etc)?
*
* @return bool
*/
public function getSupportForDistanceBetweenMultiDimensionGeometryInMeters(): bool
{
return true;
}
}
10 changes: 10 additions & 0 deletions src/Database/Adapter/SQL.php
Original file line number Diff line number Diff line change
Expand Up @@ -2657,4 +2657,14 @@ public function sum(Document $collection, string $attribute, array $queries = []

return $result['sum'] ?? 0;
}

public function getSpatialTypeFromWKT(string $wkt): string
{
$wkt = trim($wkt);
$pos = strpos($wkt, '(');
if ($pos === false) {
throw new DatabaseException("Invalid spatial type");
}
return strtolower(trim(substr($wkt, 0, $pos)));
}
Comment on lines +2661 to +2669
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Normalize WKT type and handle Z/M/SRID tokens

Current parsing returns the raw pre-“(” token lowercased. It will mis-handle inputs like “POINT Z (...)” or EWKT “SRID=4326;POINT (...)”, and may not map to Database::VAR_* constants (e.g., 'linestring' vs VAR_LINESTRING). Canonicalize via regex and map to VAR_*.

-    public function getSpatialTypeFromWKT(string $wkt): string
-    {
-        $wkt = trim($wkt);
-        $pos = strpos($wkt, '(');
-        if ($pos === false) {
-            throw new DatabaseException("Invalid spatial type");
-        }
-        return strtolower(trim(substr($wkt, 0, $pos)));
-    }
+    public function getSpatialTypeFromWKT(string $wkt): string
+    {
+        $wkt = trim($wkt);
+        if (!preg_match('/^(?:SRID=\d+;)?\s*([A-Z]+)(?:\s+(?:Z|M|ZM))?\s*\(/i', $wkt, $m)) {
+            throw new DatabaseException('Invalid spatial type in WKT');
+        }
+        $type = strtolower($m[1]);
+        $map = [
+            'point' => Database::VAR_POINT,
+            'linestring' => Database::VAR_LINESTRING,
+            'polygon' => Database::VAR_POLYGON,
+        ];
+        if (!isset($map[$type])) {
+            throw new DatabaseException('Unsupported geometry type: ' . $type);
+        }
+        return $map[$type];
+    }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public function getSpatialTypeFromWKT(string $wkt): string
{
$wkt = trim($wkt);
$pos = strpos($wkt, '(');
if ($pos === false) {
throw new DatabaseException("Invalid spatial type");
}
return strtolower(trim(substr($wkt, 0, $pos)));
}
public function getSpatialTypeFromWKT(string $wkt): string
{
$wkt = trim($wkt);
if (!preg_match('/^(?:SRID=\d+;)?\s*([A-Z]+)(?:\s+(?:Z|M|ZM))?\s*\(/i', $wkt, $m)) {
throw new DatabaseException('Invalid spatial type in WKT');
}
$type = strtolower($m[1]);
$map = [
'point' => Database::VAR_POINT,
'linestring' => Database::VAR_LINESTRING,
'polygon' => Database::VAR_POLYGON,
];
if (!isset($map[$type])) {
throw new DatabaseException('Unsupported geometry type: ' . $type);
}
return $map[$type];
}

}
13 changes: 12 additions & 1 deletion src/Database/Adapter/SQLite.php
Original file line number Diff line number Diff line change
Expand Up @@ -327,11 +327,12 @@ public function analyzeCollection(string $collection): bool
* @param bool $signed
* @param bool $array
* @param string|null $newKey
* @param bool $required
* @return bool
* @throws Exception
* @throws PDOException
*/
public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null): bool
public function updateAttribute(string $collection, string $id, string $type, int $size, bool $signed = true, bool $array = false, ?string $newKey = null, bool $required = false): bool
{
if (!empty($newKey) && $newKey !== $id) {
return $this->renameAttribute($collection, $id, $newKey);
Expand Down Expand Up @@ -1263,4 +1264,14 @@ public function getSupportForBoundaryInclusiveContains(): bool
{
return false;
}

/**
* Does the adapter support calculating distance(in meters) between multidimension geometry(line, polygon,etc)?
*
* @return bool
*/
public function getSupportForDistanceBetweenMultiDimensionGeometryInMeters(): bool
{
return false;
}
}
Loading