Limit the maximum zoom level
Avoid returning zoom levels greater than the maximum 'safe' level. For a zero denominator (which would imply and infinite zoom level) return the maximum level too.
This commit is contained in:
parent
aa302c237d
commit
0b3ad5e569
@ -1,3 +1,17 @@
|
|||||||
|
-- Maximum supported zoom level
|
||||||
|
CREATE OR REPLACE FUNCTION _CDB_MaxSupportedZoom()
|
||||||
|
RETURNS int
|
||||||
|
LANGUAGE SQL
|
||||||
|
IMMUTABLE
|
||||||
|
AS $$
|
||||||
|
-- The maximum zoom level has to be limited for various reasons,
|
||||||
|
-- e.g. zoom levels greater than 31 would require tile coordinates
|
||||||
|
-- that would not fit in an INTEGER (which is signed, 32 bits long).
|
||||||
|
-- We'll choose 20 as a limit which is safe also when the JavaScript shift
|
||||||
|
-- operator (<<) is used for computing powers of two.
|
||||||
|
SELECT 29;
|
||||||
|
$$;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION cartodb.CDB_ZoomFromScale(scaleDenominator numeric)
|
CREATE OR REPLACE FUNCTION cartodb.CDB_ZoomFromScale(scaleDenominator numeric)
|
||||||
RETURNS int
|
RETURNS int
|
||||||
LANGUAGE SQL
|
LANGUAGE SQL
|
||||||
@ -5,8 +19,9 @@ IMMUTABLE
|
|||||||
AS $$
|
AS $$
|
||||||
SELECT
|
SELECT
|
||||||
CASE
|
CASE
|
||||||
-- Don't bother if the scale is larger than ~zoom level 0
|
-- Don't bother if the scale is larger than ~zoom level 0
|
||||||
WHEN scaleDenominator > 600000000 OR scaleDenominator = 0 THEN NULL
|
WHEN scaleDenominator > 600000000 OR scaleDenominator = 0 THEN NULL
|
||||||
ELSE CAST (ROUND(LOG(2, 559082264.028/scaleDenominator)) AS INTEGER)
|
WHEN scaleDenominator = 0 THEN _CDB_MaxSupportedZoom()
|
||||||
|
ELSE CAST (LEAST(ROUND(LOG(2, 559082264.028/scaleDenominator)), _CDB_MaxSupportedZoom()) AS INTEGER)
|
||||||
END;
|
END;
|
||||||
$$;
|
$$;
|
||||||
|
Loading…
Reference in New Issue
Block a user