Last active
December 20, 2015 00:39
-
-
Save dlau/6043651 to your computer and use it in GitHub Desktop.
pg polygon generation functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CREATE FUNCTION "public"."normalize_poly_to_bottomlevel"() | |
RETURNS "pg_catalog"."varchar" AS $BODY$DECLARE | |
i record; | |
geo geometry; | |
geos geometry[]; | |
geos_arr geometry[]; | |
boo boolean; | |
levels bigint[]; | |
level_ bigint; | |
temp record; | |
BEGIN | |
for level_ in (SELECT DISTINCT level FROM mongo_regions ORDER BY level DESC) LOOP | |
levels = levels || level_; | |
END LOOP; | |
FOREACH level_ IN ARRAY levels LOOP | |
INSERT INTO log VALUES('level ' || level_::text,NOW()); | |
FOR i IN (SELECT * FROM mongo_regions mr WHERE mr.level = level_) LOOP | |
IF (SELECT COUNT(*) FROM get_child_geo(i.m_id)) = 0 THEN | |
UPDATE mongo_regions mr SET is_leaf = TRUE WHERE mr.m_id = i.m_id; | |
END IF; | |
SELECT ST_ConvexHull(ST_Collect(ARRAY(SELECT ST_MakeValid(get_child_geo(m.m_id)) FROM mongo_regions m WHERE m.id = i.id))) INTO geo; | |
IF geo IS NOT NULL THEN | |
INSERT INTO log VALUES(geo::text,NOW()); | |
UPDATE mongo_regions mr SET geometry = geo WHERE mr.id = i.id; | |
END IF; | |
END LOOP; | |
END LOOP; | |
return 'OK'; | |
END$BODY$ | |
LANGUAGE 'plpgsql' VOLATILE COST 100 | |
; | |
CREATE FUNCTION "public"."get_child_geo"(m_id varchar) | |
RETURNS SETOF "public"."geometry" AS $BODY$DECLARE | |
temp record; | |
i record; | |
BEGIN | |
FOR i IN (SELECT * FROM mongo_regions WHERE parent_m_id = $1) LOOP | |
RETURN NEXT i.geometry; | |
RETURN QUERY (SELECT * FROM get_child_geo(i.m_id)); | |
END LOOP; | |
END$BODY$ | |
LANGUAGE 'plpgsql' VOLATILE COST 100 | |
ROWS 1000 | |
; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment