Merge pull request #259 from CartoDB/zoom_from_scale

Use standard formula for CDB_ZoomFromScale
This commit is contained in:
Javier Goizueta
2016-05-27 16:15:42 +02:00
+36 -30
View File
@@ -1,30 +1,36 @@
CREATE OR REPLACE FUNCTION cartodb.CDB_ZoomFromScale(scaleDenominator numeric) RETURNS int AS $$ -- Maximum supported zoom level
BEGIN CREATE OR REPLACE FUNCTION _CDB_MaxSupportedZoom()
CASE RETURNS int
WHEN scaleDenominator > 500000000 THEN RETURN 0; LANGUAGE SQL
WHEN scaleDenominator <= 500000000 AND scaleDenominator > 200000000 THEN RETURN 1; IMMUTABLE
WHEN scaleDenominator <= 200000000 AND scaleDenominator > 100000000 THEN RETURN 2; AS $$
WHEN scaleDenominator <= 100000000 AND scaleDenominator > 50000000 THEN RETURN 3; -- The maximum zoom level has to be limited for various reasons,
WHEN scaleDenominator <= 50000000 AND scaleDenominator > 25000000 THEN RETURN 4; -- e.g. zoom levels greater than 31 would require tile coordinates
WHEN scaleDenominator <= 25000000 AND scaleDenominator > 12500000 THEN RETURN 5; -- that would not fit in an INTEGER (which is signed, 32 bits long).
WHEN scaleDenominator <= 12500000 AND scaleDenominator > 6500000 THEN RETURN 6; -- We'll choose 20 as a limit which is safe also when the JavaScript shift
WHEN scaleDenominator <= 6500000 AND scaleDenominator > 3000000 THEN RETURN 7; -- operator (<<) is used for computing powers of two.
WHEN scaleDenominator <= 3000000 AND scaleDenominator > 1500000 THEN RETURN 8; SELECT 29;
WHEN scaleDenominator <= 1500000 AND scaleDenominator > 750000 THEN RETURN 9; $$;
WHEN scaleDenominator <= 750000 AND scaleDenominator > 400000 THEN RETURN 10;
WHEN scaleDenominator <= 400000 AND scaleDenominator > 200000 THEN RETURN 11; CREATE OR REPLACE FUNCTION cartodb.CDB_ZoomFromScale(scaleDenominator numeric)
WHEN scaleDenominator <= 200000 AND scaleDenominator > 100000 THEN RETURN 12; RETURNS int
WHEN scaleDenominator <= 100000 AND scaleDenominator > 50000 THEN RETURN 13; LANGUAGE SQL
WHEN scaleDenominator <= 50000 AND scaleDenominator > 25000 THEN RETURN 14; IMMUTABLE
WHEN scaleDenominator <= 25000 AND scaleDenominator > 12500 THEN RETURN 15; AS $$
WHEN scaleDenominator <= 12500 AND scaleDenominator > 5000 THEN RETURN 16; SELECT
WHEN scaleDenominator <= 5000 AND scaleDenominator > 2500 THEN RETURN 17; CASE
WHEN scaleDenominator <= 2500 AND scaleDenominator > 1500 THEN RETURN 18; WHEN scaleDenominator > 600000000 THEN
WHEN scaleDenominator <= 1500 AND scaleDenominator > 750 THEN RETURN 19; -- Scale is smaller than zoom level 0
WHEN scaleDenominator <= 750 AND scaleDenominator > 500 THEN RETURN 20; NULL
WHEN scaleDenominator <= 500 AND scaleDenominator > 250 THEN RETURN 21; WHEN scaleDenominator = 0 THEN
WHEN scaleDenominator <= 250 AND scaleDenominator > 100 THEN RETURN 22; -- Actual zoom level would be infinite
WHEN scaleDenominator <= 100 THEN RETURN 23; _CDB_MaxSupportedZoom()
END CASE; ELSE
END CAST (
$$ LANGUAGE plpgsql IMMUTABLE; LEAST(
ROUND(LOG(2, 559082264.028/scaleDenominator)),
_CDB_MaxSupportedZoom()
)
AS INTEGER)
END;
$$;