@@ -1452,6 +1452,43 @@ public function getConnectionId(): string
14521452 return $ stmt ->fetchColumn ();
14531453 }
14541454
1455+ protected function handleDistanceSpatialQueries (Query $ query , array &$ binds , string $ attribute , string $ alias , string $ placeholder ): string
1456+ {
1457+ $ distanceParams = $ query ->getValues ()[0 ];
1458+ $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ distanceParams [0 ]);
1459+ $ binds [": {$ placeholder }_1 " ] = $ distanceParams [1 ];
1460+
1461+ $ meters = isset ($ distanceParams [2 ]) && $ distanceParams [2 ] === true ;
1462+
1463+ switch ($ query ->getMethod ()) {
1464+ case Query::TYPE_DISTANCE_EQUAL :
1465+ $ operator = '= ' ;
1466+ break ;
1467+ case Query::TYPE_DISTANCE_NOT_EQUAL :
1468+ $ operator = '!= ' ;
1469+ break ;
1470+ case Query::TYPE_DISTANCE_GREATER_THAN :
1471+ $ operator = '> ' ;
1472+ break ;
1473+ case Query::TYPE_DISTANCE_LESS_THAN :
1474+ $ operator = '< ' ;
1475+ break ;
1476+ default :
1477+ throw new DatabaseException ('Unknown spatial query method: ' . $ query ->getMethod ());
1478+ }
1479+
1480+ if ($ meters ) {
1481+ // Transform both attribute and input geometry to 3857 (meters) for distance calculation
1482+ $ attr = "ST_Transform( {$ alias }. {$ attribute }, 3857) " ;
1483+ $ geom = "ST_Transform(ST_GeomFromText(: {$ placeholder }_0, " . Database::SRID . "), 3857) " ;
1484+ return "ST_Distance( {$ attr }, {$ geom }) {$ operator } : {$ placeholder }_1 " ;
1485+ }
1486+
1487+ // Without meters, use the original SRID (e.g., 4326)
1488+ return "ST_Distance( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database::SRID . ")) {$ operator } : {$ placeholder }_1 " ;
1489+ }
1490+
1491+
14551492 /**
14561493 * Handle spatial queries
14571494 *
@@ -1474,60 +1511,41 @@ protected function handleSpatialQueries(Query $query, array &$binds, string $att
14741511 return "NOT ST_Crosses( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
14751512
14761513 case Query::TYPE_DISTANCE_EQUAL :
1477- $ distanceParams = $ query ->getValues ()[0 ];
1478- $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ distanceParams [0 ]);
1479- $ binds [": {$ placeholder }_1 " ] = $ distanceParams [1 ];
1480- return "ST_DWithin( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0), : {$ placeholder }_1) " ;
1481-
14821514 case Query::TYPE_DISTANCE_NOT_EQUAL :
1483- $ distanceParams = $ query ->getValues ()[0 ];
1484- $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ distanceParams [0 ]);
1485- $ binds [": {$ placeholder }_1 " ] = $ distanceParams [1 ];
1486- return "NOT ST_DWithin( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0), : {$ placeholder }_1) " ;
1487-
14881515 case Query::TYPE_DISTANCE_GREATER_THAN :
1489- $ distanceParams = $ query ->getValues ()[0 ];
1490- $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ distanceParams [0 ]);
1491- $ binds [": {$ placeholder }_1 " ] = $ distanceParams [1 ];
1492- return "ST_Distance( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) > : {$ placeholder }_1 " ;
1493-
14941516 case Query::TYPE_DISTANCE_LESS_THAN :
1495- $ distanceParams = $ query ->getValues ()[0 ];
1496- $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ distanceParams [0 ]);
1497- $ binds [": {$ placeholder }_1 " ] = $ distanceParams [1 ];
1498- return "ST_Distance( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) < : {$ placeholder }_1 " ;
1499-
1517+ return $ this ->handleDistanceSpatialQueries ($ query , $ binds , $ attribute , $ alias , $ placeholder );
15001518 case Query::TYPE_EQUAL :
15011519 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
1502- return "ST_Equals( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1520+ return "ST_Equals( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15031521
15041522 case Query::TYPE_NOT_EQUAL :
15051523 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
1506- return "NOT ST_Equals( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1524+ return "NOT ST_Equals( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15071525
15081526 case Query::TYPE_INTERSECTS :
15091527 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
1510- return "ST_Intersects( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1528+ return "ST_Intersects( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15111529
15121530 case Query::TYPE_NOT_INTERSECTS :
15131531 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
1514- return "NOT ST_Intersects( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1532+ return "NOT ST_Intersects( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15151533
15161534 case Query::TYPE_OVERLAPS :
15171535 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
1518- return "ST_Overlaps( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1536+ return "ST_Overlaps( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15191537
15201538 case Query::TYPE_NOT_OVERLAPS :
15211539 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
1522- return "NOT ST_Overlaps( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1540+ return "NOT ST_Overlaps( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15231541
15241542 case Query::TYPE_TOUCHES :
15251543 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
1526- return "ST_Touches( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1544+ return "ST_Touches( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15271545
15281546 case Query::TYPE_NOT_TOUCHES :
15291547 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
1530- return "NOT ST_Touches( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1548+ return "NOT ST_Touches( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15311549
15321550 case Query::TYPE_CONTAINS :
15331551 case Query::TYPE_NOT_CONTAINS :
@@ -1536,8 +1554,8 @@ protected function handleSpatialQueries(Query $query, array &$binds, string $att
15361554 $ isNot = $ query ->getMethod () === Query::TYPE_NOT_CONTAINS ;
15371555 $ binds [": {$ placeholder }_0 " ] = $ this ->convertArrayToWKT ($ query ->getValues ()[0 ]);
15381556 return $ isNot
1539- ? "NOT ST_Covers( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) "
1540- : "ST_Covers( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0)) " ;
1557+ ? "NOT ST_Covers( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) "
1558+ : "ST_Covers( {$ alias }. {$ attribute }, ST_GeomFromText(: {$ placeholder }_0, " . Database:: SRID . " )) " ;
15411559
15421560 default :
15431561 throw new DatabaseException ('Unknown spatial query method: ' . $ query ->getMethod ());
@@ -1716,15 +1734,15 @@ protected function getSQLType(string $type, int $size, bool $signed = true, bool
17161734 case Database::VAR_DATETIME :
17171735 return 'TIMESTAMP(3) ' ;
17181736
1719-
1737+ // in all other DB engines, 4326 is the default SRID
17201738 case Database::VAR_POINT :
1721- return 'GEOMETRY(POINT) ' ;
1739+ return 'GEOMETRY(POINT, ' . Database:: SRID . ' ) ' ;
17221740
17231741 case Database::VAR_LINESTRING :
1724- return 'GEOMETRY(LINESTRING) ' ;
1742+ return 'GEOMETRY(LINESTRING, ' . Database:: SRID . ' ) ' ;
17251743
17261744 case Database::VAR_POLYGON :
1727- return 'GEOMETRY(POLYGON) ' ;
1745+ return 'GEOMETRY(POLYGON, ' . Database:: SRID . ' ) ' ;
17281746
17291747 default :
17301748 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 );
0 commit comments