Skip to content

Instantly share code, notes, and snippets.

@ragnvald
Created January 13, 2021 19:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ragnvald/59a73b2683806dd1bc0a99554473fb6e to your computer and use it in GitHub Desktop.
Save ragnvald/59a73b2683806dd1bc0a99554473fb6e to your computer and use it in GitHub Desktop.
Reference for stackexchange question
-- FUNCTION: public.qdgc_get_recursivestring(double precision, double precision, integer, text)
DROP FUNCTION public.qdgc_get_recursivestring(double precision, double precision, integer, text);
CREATE OR REPLACE FUNCTION public.qdgc_get_recursivestring(
lon_value double precision,
lat_value double precision,
depthlevel integer,
square text)
RETURNS text
LANGUAGE 'plpython3u'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
if lon_value >1:
lon_value = lon_value - math.floor(lon_value)
elif (lon_value<-1):
lon_value = lon_value + abs(math.ceil(lon_value))
if lat_value >1:
lat_value = lat_value - math.floor(lat_value)
elif (lat_value<-1):
lat_value = lat_value + abs(math.ceil(lat_value))
if ((lon_value>=0) and (lat_value>=0)):
if ((lon_value <0.5) and (lat_value>=0.5)):
square = square + 'A'
lon_value=lon_value*2
lat_value=(lat_value-0.5)*2
elif ((lon_value>=0.5) and (lat_value>=0.5)):
square = square + 'B'
lon_value=(lon_value-0.5)*2
lat_value=(lat_value-0.5)*2
elif ((lon_value<0.5) and (lat_value<0.5)):
square = square + 'C'
lat_value=lat_value*2
lon_value=lon_value*2
elif ((lon_value>=0.5) and (lat_value<0.5)):
square = square + 'D'
lon_value=(lon_value-0.5)*2
lat_value=lat_value*2
elif ((lon_value>=0) and (lat_value<=0)):
if ((lon_value <0.5) and (lat_value>-0.5)):
square = square + 'A'
lon_value=lon_value*2
lat_value=lat_value*2
elif ((lon_value>=0.5) and (lat_value>-0.5)):
square = square + 'B'
lon_value=(lon_value-0.5)*2
lat_value=lat_value*2
elif ((lon_value<0.5) and (lat_value<=-0.5)):
square = square + 'C'
lon_value=lon_value*2
lat_value=(lat_value+0.5)*2
elif ((lon_value>=0.5) and (lat_value<=-0.5)):
square = square + 'D'
lon_value=(lon_value-0.5)*2
lat_value=(lat_value+0.5)*2
elif ((lon_value<=0) and (lat_value<=0)):
if ((lon_value<=-0.5) and (lat_value>-0.5)):
square = square + 'A'
lon_value=(lon_value+0.5)*2
lat_value=lat_value*2
elif ((lon_value>-0.5) and (lat_value>-0.5)):
square = square + 'B'
lon_value=lon_value*2
lat_value=lat_value*2
elif ((lon_value<=-0.5) and (lat_value<=-0.5)):
square = square + 'C'
lon_value=(lon_value+0.5)*2
lat_value=(lat_value+0.5)*2
elif ((lon_value>-0.5) and (lat_value<=-0.5)):
square = square + 'D'
lon_value=lon_value*2
lat_value=(lat_value+0.5)*2
elif ((lon_value<=0) and (lat_value>=0)):
if ((lon_value <=-0.5) and (lat_value>=0.5)):
square = square + 'A'
lon_value=(lon_value+0.5)*2
lat_value=(lat_value-0.5)*2
elif ((lon_value>-0.5) and (lat_value>=0.5)):
square = square + 'B'
lon_value=lon_value*2
lat_value=(lat_value-0.5)*2
elif ((lon_value<=-0.5) and (lat_value<0.5)):
square = square + 'C'
lon_value=(lon_value+0.5)*2
lat_value=(lat_value)*2
elif ((lon_value>-0.5) and (lat_value<0.5)):
square = square + 'D'
lon_value=lon_value*2
lat_value=lat_value*2
stringlength = len(square)
if (stringlength < depthlevel):
r_lon_value = lon_value
r_lat_value = lat_value
return qdgc_get_recursivestring(r_lon_value,r_lat_value,depthlevel,square)
else
return square
$BODY$;
ALTER FUNCTION public.qdgc_get_recursivestring(double precision, double precision, integer, text)
OWNER TO postgres;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment