diff --git a/backend/diesel.toml b/backend/diesel.toml index 323408016..677381529 100644 --- a/backend/diesel.toml +++ b/backend/diesel.toml @@ -2,5 +2,5 @@ file = "src/schema.rs" patch_file = "src/schema.patch" -filter = { except_tables = ["spatial_ref_sys"] } +filter = { except_tables = ["spatial_ref_sys", "relations_summary"] } import_types = ["postgis_diesel::sql_types::Geography", "diesel::sql_types::*"] diff --git a/benchmarks/backend/heatmap_sql/.env.db b/benchmarks/backend/heatmap_sql/.env.db new file mode 100644 index 000000000..f22266081 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/.env.db @@ -0,0 +1,5 @@ +POSTGRES_USER=permaplant +POSTGRES_DB=permaplant +POSTGRES_PASSWORD=permaplant +PGPASSWORD=permaplant +DATABASE_URL=postgres://permaplant:permaplant@db/permaplant diff --git a/benchmarks/backend/heatmap_sql/Dockerfile.pg b/benchmarks/backend/heatmap_sql/Dockerfile.pg new file mode 100644 index 000000000..7ff316232 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/Dockerfile.pg @@ -0,0 +1,10 @@ +FROM postgis/postgis:13-3.1 + +# Install plprofiler extension +RUN apt-get update && \ + apt-get install -y postgresql-13-plprofiler && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Expose the PostgreSQL port +EXPOSE 5432 diff --git a/benchmarks/backend/heatmap_sql/Dockerfile.pga b/benchmarks/backend/heatmap_sql/Dockerfile.pga new file mode 100644 index 000000000..375faf461 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/Dockerfile.pga @@ -0,0 +1,5 @@ +# This Dockerfile is used inside the docker-compose.yml as development environment +FROM dpage/pgadmin4:7.3 + +COPY ./servers.json ./servers.json +COPY ./pgpass ../pgpass diff --git a/benchmarks/backend/heatmap_sql/docker-compose.yml b/benchmarks/backend/heatmap_sql/docker-compose.yml new file mode 100644 index 000000000..f4f6d11ed --- /dev/null +++ b/benchmarks/backend/heatmap_sql/docker-compose.yml @@ -0,0 +1,44 @@ +version: "3" + +services: + benchmark-postgis: + build: + context: . + dockerfile: ./Dockerfile.pg + # image: postgis/postgis:13-3.1 + container_name: benchmark-postgis + env_file: + - .env.db + ports: + - "5432:5432" + networks: + - permaplant-bechmark + restart: unless-stopped + volumes: + - postgis-data-benchmark:/var/lib/postgresql/data + + bechmark-pgadmin: + build: + context: . + dockerfile: Dockerfile.pga + image: dpage/pgadmin4 + restart: unless-stopped + volumes: + - pgadmin-data-benchmark:/var/lib/pgadmin + environment: + PGADMIN_DEFAULT_EMAIL: name@example.com + PGADMIN_DEFAULT_PASSWORD: permaplant + networks: + - permaplant-bechmark + ports: + - "5050:80" + +volumes: + pgadmin-data-benchmark: + external: false + postgis-data-benchmark: + external: false + +networks: + permaplant-bechmark: + external: false diff --git a/benchmarks/backend/heatmap_sql/generate_data_to_insert.py b/benchmarks/backend/heatmap_sql/generate_data_to_insert.py new file mode 100644 index 000000000..196913c66 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/generate_data_to_insert.py @@ -0,0 +1,59 @@ +import sys + +insert_sql = ( + "DELETE FROM public.shadings WHERE layer_id = 3; \n" + "INSERT INTO public.shadings (id, layer_id, geometry, shade, add_date, remove_date) VALUES \n" +) + + +if len(sys.argv) != 2: + print("Usage: python generate_data_to_insert.py NUM_SHADINGS") + print("NUM_SHADINGS must be 10, 100 or 1000") + exit(1) + +if int(sys.argv[1]) not in [10, 100, 1000]: + print("Usage: python generate_data_to_insert.py NUM_SHADINGS") + print("NUM_SHADINGS must be 10, 100 or 1000") + exit(1) + +NUM_SHADINGS = int(sys.argv[1]) +MAX_Y = MAX_X = 10000 # should be lower than large_map.sql bounds +SHADE_WIDTH = 100 +STEP_SIZE = 150 + +SHADING_TYPES = [ + "light shade", + "partial shade", + "permanent shade", + "permanent deep shade", +] + + +shade_x = 0 +shade_y = 0 + +assert STEP_SIZE > SHADE_WIDTH + +for i in range(NUM_SHADINGS): + shade_id = f"e6622aab-dc5d-4865-89d2-{i: 012d}" + shading_type = SHADING_TYPES[i % len(SHADING_TYPES)] + + polygon = ( + f"POLYGON(({shade_x} {shade_y}, {shade_x + SHADE_WIDTH} {shade_y}, " + f"{shade_x + SHADE_WIDTH} {shade_y + SHADE_WIDTH}, {shade_x} {shade_y + SHADE_WIDTH}, {shade_x} {shade_y}))" + ) + + insert_sql += f"('{shade_id}', 3, ST_GeomFromText('{polygon}'), '{shading_type}', NULL, NULL), \n" + + shade_x += STEP_SIZE + + if shade_x + SHADE_WIDTH >= MAX_X: + shade_x = 0 + shade_y += STEP_SIZE + + if shade_y + SHADE_WIDTH >= MAX_Y: + print("Error: Not enough space to place all shadings") + exit(1) + + +print(insert_sql.rstrip(",\n") + ";") diff --git a/benchmarks/backend/heatmap_sql/get_statistics.sh b/benchmarks/backend/heatmap_sql/get_statistics.sh new file mode 100755 index 000000000..d95f745f3 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/get_statistics.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env nu + +cd backend + +grep ' UTC \[[0-9]*\] ' postgis.log | lines | split column -r '\[|\]' | group-by column2 | values | each {|pid| $pid | each {|el| $"($el.column1)[($el.column2)]($el.column3)" } } | flatten | save -f postgis_parsed.log + +print "SQL queries:" +grep 'LOG: execute s.*: SELECT \* FROM calculate_heatmap' postgis_parsed.log -A 2 + | grep 'LOG: duration: .* ms$' + | awk 'NR == 1 {count=1; sum=$7; min=$7; max=$7} + NR > 1 {count++; sum+=$7; if ($7<0+min) min=$7; if ($7>0+max) max=$7} + END {print "total:", count, "\nmin:", min, "ms\navg:", sum/count, "ms\nmax:", max, "ms"}' + +print "" + +print "Requests:" +grep 'Total: connections ' httperf.log | awk '{print "total:", $3}' +grep 'Connection time \[ms\]: min' httperf.log | awk '{print "min:", $5, "ms\navg:", $7, "ms\nmax:", $9, "ms"}' diff --git a/benchmarks/backend/heatmap_sql/heatmap_v0_original.sql b/benchmarks/backend/heatmap_sql/heatmap_v0_original.sql new file mode 100644 index 000000000..ddd0673ec --- /dev/null +++ b/benchmarks/backend/heatmap_sql/heatmap_v0_original.sql @@ -0,0 +1,344 @@ +-- Returns preference from 0-1 and relevance from 0-1 for each pixel of the map. +-- +-- Positions where the plant should not be placed have preference close to 0. +-- Positions where the plant should be placed have preference close to 1. +-- +-- Positions where there is no relevant data have relevance close to 0. +-- Positions where there is relevant data have relevance close to 1. +-- +-- The resulting matrix does not contain valid (x,y) map coordinates, +-- instead (x,y) are simply the indices in the matrix. +-- The (x,y) coordinate of the computed heatmap always starts at +-- (0,0) no matter the boundaries of the map. +-- To get valid coordinates the user would therefore need to move and scale the +-- calculated heatmap by taking into account the boundaries of the map. +-- +-- View the API documentation via Swagger for additional information. +-- +-- p_map_id ... map id +-- p_layer_ids ... ids of the layers +-- p_plant_id ... id of the plant for which to consider relations +-- date ... date at which to generate the heatmap +-- granularity ... resolution of the map (must be greater than 0) +-- x_min,y_min,x_max,y_max ... boundaries of the map +CREATE OR REPLACE FUNCTION calculate_heatmap( + p_map_id integer, + p_layer_ids integer [], + p_plant_id integer, + date date, + granularity integer, + x_min integer, + y_min integer, + x_max integer, + y_max integer +) +RETURNS TABLE (preference real, relevance real, x integer, y integer) AS $$ +DECLARE + score SCORE; + map_geometry GEOMETRY(POLYGON, 4326); + point GEOMETRY; + bbox GEOMETRY; + num_cols INTEGER; + num_rows INTEGER; + x_pos INTEGER; + y_pos INTEGER; + plant_relation RECORD; +BEGIN + -- Makes sure the layers exists and fits to the map + FOR i IN 1..array_length(p_layer_ids, 1) LOOP + IF NOT EXISTS (SELECT 1 FROM layers WHERE id = p_layer_ids[i] AND map_id = p_map_id) THEN + RAISE EXCEPTION 'Layer with id % not found on map with id %', p_layer_ids[i], p_map_id; + END IF; + END LOOP; + -- Makes sure the plant exists + IF NOT EXISTS (SELECT 1 FROM plants WHERE id = p_plant_id) THEN + RAISE EXCEPTION 'Plant with id % not found', p_plant_id; + END IF; + + -- INTO STRICT makes sure the map exists. Does have to be explicitly checked as bounding box calculation would error anyways. + SELECT geometry FROM maps WHERE id = p_map_id INTO STRICT map_geometry; + + -- Calculate the number of rows and columns based on the map's size and granularity + num_cols := FLOOR((x_max - x_min) / granularity); -- Adjusted for granularity + num_rows := FLOOR((y_max - y_min) / granularity); -- Adjusted for granularity + + -- Calculate the score for each point on the heatmap + FOR i IN 0..num_cols-1 LOOP + -- i and j do not represent coordinates. We need to adjust them to actual coordinates. + x_pos := x_min + (i * granularity) + (granularity / 2); + + FOR j IN 0..num_rows-1 LOOP + y_pos := y_min + (j * granularity) + (granularity / 2); + + -- Create a point from x_pos and y_pos + point := ST_SetSRID(ST_MakePoint(x_pos, y_pos), 4326); + + -- If the point is on the map calculate a score; otherwise set score to 0. + IF ST_Intersects(point, map_geometry) THEN + score := calculate_score(p_map_id, p_layer_ids, p_plant_id, date, x_pos, y_pos); + score := scale_score(score); -- scale to be between 0 and 1 + preference := score.preference; + relevance := score.relevance; + ELSE + preference := 0.0; + relevance := 0.0; + END IF; + + x := i; + y := j; + + RETURN NEXT; + END LOOP; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +-- Scales to values between 0 and 1. +-- +-- Preference input space: Any value. +-- Relevance input space: >=0 +CREATE OR REPLACE FUNCTION scale_score(input score) +RETURNS score AS $$ +DECLARE + score SCORE; +BEGIN + score.preference := 1 / (1 + exp(-input.preference)); -- standard sigmoid, so that f(0)=0.5 + score.relevance := (2 / (1 + exp(-input.relevance))) - 1; -- modified sigmoid, so that f(0)=0 + RETURN score; +END; +$$ LANGUAGE plpgsql; + +-- Calculate score for a certain position. +-- +-- p_map_id ... map id +-- p_layer_ids[1] ... plant layer (only the first array-element is used by the function) +-- p_plant_id ... id of the plant for which to consider relations +-- date ... date at which to generate the heatmap +-- x_pos,y_pos ... coordinates on the map where to calculate the score +CREATE OR REPLACE FUNCTION calculate_score( + p_map_id integer, + p_layer_ids integer [], + p_plant_id integer, + date date, + x_pos integer, + y_pos integer +) +RETURNS score AS $$ +DECLARE + plants SCORE; +BEGIN + plants := calculate_score_from_relations(p_layer_ids[1], p_plant_id, date, x_pos, y_pos); + + RETURN plants; +END; +$$ LANGUAGE plpgsql; + +-- Calculate score using the plants relations and their distances. +CREATE OR REPLACE FUNCTION calculate_score_from_relations( + p_layer_id integer, + p_plant_id integer, + date date, + x_pos integer, + y_pos integer +) +RETURNS score AS $$ +DECLARE + plant_relation RECORD; + distance REAL; + weight REAL; + score SCORE; +BEGIN + IF NOT EXISTS (SELECT 1 FROM layers WHERE id = p_layer_id AND type = 'plants') THEN + RAISE EXCEPTION 'Plant layer with id % not found', p_layer_id; + END IF; + + score.preference := 0.0; + score.relevance := 0.0; + + FOR plant_relation IN (SELECT * FROM get_plant_relations(p_layer_id, p_plant_id, date)) LOOP + -- calculate euclidean distance + distance := sqrt((plant_relation.x - x_pos)^2 + (plant_relation.y - y_pos)^2); + + -- calculate weight based on distance + -- weight decreases between 1 and 0 based on distance + -- distance is squared so it decreases faster the further away + -- weight is halved at 50 cm away + weight := 1 / (1 + (distance / 50)^2); + + -- update score based on relation + IF plant_relation.relation = 'companion' THEN + score.preference := score.preference + 0.5 * weight; + ELSE + score.preference := score.preference - 0.5 * weight; + END IF; + + score.relevance := score.relevance + 0.5 * weight; + END LOOP; + + RETURN score; +END; +$$ LANGUAGE plpgsql; + +-- Get all relations for the plant on the specified layer. +CREATE OR REPLACE FUNCTION get_plant_relations( + p_layer_id integer, + p_plant_id integer, + date date +) +RETURNS TABLE (x integer, y integer, relation relation_type) AS $$ +BEGIN + RETURN QUERY + -- We only need x,y and type of relation to calculate a score. + SELECT plantings.x, plantings.y, relations.relation + FROM plantings + JOIN plants ON plantings.plant_id = plants.id + JOIN ( + -- We need UNION as the relation is bidirectional. + SELECT plant1 AS plant, r1.relation + FROM relations r1 + WHERE plant2 = p_plant_id + AND r1.relation != 'neutral' + UNION + SELECT plant2 AS plant, r2.relation + FROM relations r2 + WHERE plant1 = p_plant_id + AND r2.relation != 'neutral' + ) relations ON plants.id = relations.plant + WHERE plantings.layer_id = p_layer_id + AND (plantings.add_date IS NULL OR plantings.add_date <= date) + AND (plantings.remove_date IS NULL OR plantings.remove_date > date); +END; +$$ LANGUAGE plpgsql; + +-------------------------------------------------------------------------- +-- SHADINGS -- SHADINGS -- SHADINGS -- SHADINGS -- SHADINGS -- SHADINGS -- +-------------------------------------------------------------------------- + + +-- Calculate score and relevance for a certain position. +-- +-- p_map_id ... map id +-- p_layer_ids[1] ... plant layer +-- p_layer_ids[2] ... shade layer +-- p_plant_id ... id of the plant for which to consider relations +-- date ... date at which to generate the heatmap +-- x_pos,y_pos ... coordinates on the map where to calculate the score +CREATE OR REPLACE FUNCTION calculate_score( + p_map_id integer, + p_layer_ids integer [], + p_plant_id integer, + date date, + x_pos integer, + y_pos integer +) +RETURNS score AS $$ +DECLARE + score SCORE; + plants SCORE; + shades SCORE; +BEGIN + plants := calculate_score_from_relations(p_layer_ids[1], p_plant_id, date, x_pos, y_pos); + shades := calculate_score_from_shadings(p_layer_ids[2], p_plant_id, date, x_pos, y_pos); + + score.preference := plants.preference + shades.preference; + score.relevance := plants.relevance + shades.relevance; + + RETURN score; +END; +$$ LANGUAGE plpgsql; + +-- Calculate preference: Between -1 and 1 depending on shadings. +-- Calculate relevance: 1 if there is shading; otherwise 0.0. +-- +-- If the plant would die at the position set preference=-100 and relevance=100. +CREATE OR REPLACE FUNCTION calculate_score_from_shadings( + p_layer_id integer, + p_plant_id integer, + date date, + x_pos integer, + y_pos integer +) +RETURNS score AS $$ +DECLARE + point GEOMETRY; + plant_shade SHADE; + plant_light_requirement light_requirement []; + allowed_shades SHADE [] := '{}'; + shading_shade SHADE; + all_values SHADE[]; + pos1 INTEGER; + pos2 INTEGER; + score SCORE; +BEGIN + IF NOT EXISTS (SELECT 1 FROM layers WHERE id = p_layer_id AND type = 'shade') THEN + RAISE EXCEPTION 'Shade layer with id % not found', p_layer_id; + END IF; + + -- Get the required light level and preferred shade level of the plant + SELECT light_requirement, shade INTO plant_light_requirement, plant_shade + FROM plants + WHERE id = p_plant_id; + + -- Create a point from x_pos and y_pos + point := ST_SetSRID(ST_MakePoint(x_pos, y_pos), 4326); + -- Select the shading with the darkest shade that intersects the point + SELECT shade INTO shading_shade + FROM shadings + WHERE layer_id = p_layer_id + AND (add_date IS NULL OR add_date <= date) + AND (remove_date IS NULL OR remove_date > date) + AND ST_Intersects(geometry, point) + ORDER BY shade DESC + LIMIT 1; + + -- If there's no shading, then there is sun. + IF NOT FOUND THEN + shading_shade := 'no shade'; + END IF; + + -- Check if the plant can survive at the position. + -- If the plant can't survive set preference=-100 and relevance=100. + IF plant_light_requirement IS NOT NULL + THEN + IF 'full sun' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"no shade", "light shade"}'; + END IF; + IF 'partial sun/shade' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"light shade", "partial shade", "permanent shade"}'; + END IF; + IF 'full shade' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"permanent shade", "permanent deep shade"}'; + END IF; + + IF NOT (shading_shade = ANY(allowed_shades)) + THEN + score.preference := -100; + score.relevance := 100; + RETURN score; + END IF; + END IF; + + -- If there's no shading, return 0. + IF plant_shade IS NULL THEN + score.preference := 0.0; + score.relevance := 0.0; + RETURN score; + END IF; + + -- Get all possible enum values + SELECT enum_range(NULL::SHADE) INTO all_values; + + -- Get the position of each enum value in the array + SELECT array_position(all_values, plant_shade) INTO pos1; + SELECT array_position(all_values, shading_shade) INTO pos2; + + -- Calculate the 'distance' to the preferred shade as a values between -1 and 1 + score.preference := (0.5 - (abs(pos1 - pos2) / (ARRAY_LENGTH(all_values, 1) - 1)::REAL)^0.5) * 2.0; + score.relevance := 1.0; + + RETURN score; +END; +$$ LANGUAGE plpgsql; diff --git a/benchmarks/backend/heatmap_sql/heatmap_v1_relations_once.sql b/benchmarks/backend/heatmap_sql/heatmap_v1_relations_once.sql new file mode 100644 index 000000000..4db66f972 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/heatmap_v1_relations_once.sql @@ -0,0 +1,387 @@ +DROP TABLE IF EXISTS relations_summary CASCADE; +CREATE TABLE relations_summary ( + x integer, + y integer, + relation relation_type +); + + +-- Returns preference from 0-1 and relevance from 0-1 for each pixel of the map. +-- +-- Positions where the plant should not be placed have preference close to 0. +-- Positions where the plant should be placed have preference close to 1. +-- +-- Positions where there is no relevant data have relevance close to 0. +-- Positions where there is relevant data have relevance close to 1. +-- +-- The resulting matrix does not contain valid (x,y) map coordinates, +-- instead (x,y) are simply the indices in the matrix. +-- The (x,y) coordinate of the computed heatmap always starts at +-- (0,0) no matter the boundaries of the map. +-- To get valid coordinates the user would therefore need to move and scale the +-- calculated heatmap by taking into account the boundaries of the map. +-- +-- View the API documentation via Swagger for additional information. +-- +-- p_map_id ... map id +-- p_layer_ids ... ids of the layers +-- p_plant_id ... id of the plant for which to consider relations +-- date ... date at which to generate the heatmap +-- granularity ... resolution of the map (must be greater than 0) +-- x_min,y_min,x_max,y_max ... boundaries of the map +CREATE OR REPLACE FUNCTION calculate_heatmap( + p_map_id integer, + p_layer_ids integer [], + p_plant_id integer, + date date, + granularity integer, + x_min integer, + y_min integer, + x_max integer, + y_max integer +) +RETURNS TABLE (preference real, relevance real, x integer, y integer) AS $$ +DECLARE + score SCORE; + map_geometry GEOMETRY(POLYGON, 4326); + point GEOMETRY; + bbox GEOMETRY; + num_cols INTEGER; + num_rows INTEGER; + x_pos INTEGER; + y_pos INTEGER; + plant_relation RECORD; + relations relations_summary[]; +BEGIN + -- Makes sure the layers exists and fits to the map + FOR i IN 1..array_length(p_layer_ids, 1) LOOP + IF NOT EXISTS (SELECT 1 FROM layers WHERE id = p_layer_ids[i] AND map_id = p_map_id) THEN + RAISE EXCEPTION 'Layer with id % not found on map with id %', p_layer_ids[i], p_map_id; + END IF; + END LOOP; + -- Makes sure the plant exists + IF NOT EXISTS (SELECT 1 FROM plants WHERE id = p_plant_id) THEN + RAISE EXCEPTION 'Plant with id % not found', p_plant_id; + END IF; + + -- INTO STRICT makes sure the map exists. Does have to be explicitly checked as bounding box calculation would error anyways. + SELECT geometry FROM maps WHERE id = p_map_id INTO STRICT map_geometry; + + relations := get_plant_relations_array(p_layer_ids[1], p_plant_id, date); + + -- Calculate the number of rows and columns based on the map's size and granularity + num_cols := FLOOR((x_max - x_min) / granularity); -- Adjusted for granularity + num_rows := FLOOR((y_max - y_min) / granularity); -- Adjusted for granularity + + -- Calculate the score for each point on the heatmap + FOR i IN 0..num_cols-1 LOOP + -- i and j do not represent coordinates. We need to adjust them to actual coordinates. + x_pos := x_min + (i * granularity) + (granularity / 2); + + FOR j IN 0..num_rows-1 LOOP + y_pos := y_min + (j * granularity) + (granularity / 2); + + -- Create a point from x_pos and y_pos + point := ST_SetSRID(ST_MakePoint(x_pos, y_pos), 4326); + + -- If the point is on the map calculate a score; otherwise set score to 0. + IF ST_Intersects(point, map_geometry) THEN + score := calculate_score(p_map_id, p_layer_ids, p_plant_id, date, x_pos, y_pos, relations); + score := scale_score(score); -- scale to be between 0 and 1 + preference := score.preference; + relevance := score.relevance; + ELSE + preference := 0.0; + relevance := 0.0; + END IF; + + x := i; + y := j; + + RETURN NEXT; + END LOOP; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +-- Scales to values between 0 and 1. +-- +-- Preference input space: Any value. +-- Relevance input space: >=0 +CREATE OR REPLACE FUNCTION scale_score(input score) +RETURNS score AS $$ +DECLARE + score SCORE; +BEGIN + score.preference := 1 / (1 + exp(-input.preference)); -- standard sigmoid, so that f(0)=0.5 + score.relevance := (2 / (1 + exp(-input.relevance))) - 1; -- modified sigmoid, so that f(0)=0 + RETURN score; +END; +$$ LANGUAGE plpgsql; + +-- Calculate score for a certain position. +-- +-- p_map_id ... map id +-- p_layer_ids[1] ... plant layer (only the first array-element is used by the function) +-- p_plant_id ... id of the plant for which to consider relations +-- date ... date at which to generate the heatmap +-- x_pos,y_pos ... coordinates on the map where to calculate the score +CREATE OR REPLACE FUNCTION calculate_score( + p_map_id integer, + p_layer_ids integer [], + p_plant_id integer, + date date, + x_pos integer, + y_pos integer, + relations_p relations_summary [] +) +RETURNS score AS $$ +DECLARE + plants SCORE; +BEGIN + plants := calculate_score_from_relations(p_layer_ids[1], p_plant_id, date, x_pos, y_pos, relations_p); + + RETURN plants; +END; +$$ LANGUAGE plpgsql; + + + +-- Calculate score using the plants relations and their distances. +CREATE OR REPLACE FUNCTION calculate_score_from_relations( + p_layer_id integer, + p_plant_id integer, + date date, + x_pos integer, + y_pos integer, + relations relations_summary [] +-- NOT HERE +) +RETURNS score AS $$ +DECLARE + plant_relation RECORD; + distance REAL; + weight REAL; + score SCORE; + start_time timestamp; + -- tble TABLE (x INTEGER, y INTEGER, relation RELATION_TYPE); +BEGIN + IF NOT EXISTS (SELECT 1 FROM layers WHERE id = p_layer_id AND type = 'plants') THEN + RAISE EXCEPTION 'Plant layer with id % not found', p_layer_id; + END IF; + + score.preference := 0.0; + score.relevance := 0.0; + + -- if relations is null, return 0 + IF relations IS NULL THEN + RETURN score; + END IF; + + FOREACH plant_relation IN ARRAY relations LOOP + -- calculate euclidean distance + distance := sqrt((plant_relation.x - x_pos)^2 + (plant_relation.y - y_pos)^2); + + -- calculate weight based on distance + -- weight decreases between 1 and 0 based on distance + -- distance is squared so it decreases faster the further away + -- weight is halved at 50 cm away + + -- >>> w = lambda d: 1 / (1 + (d / 50) * (d / 50)); + -- >>> w(10) + -- 0.9615384615384615 + -- >>> w(20) + -- 0.8620689655172413 + -- >>> w(30) + -- 0.7352941176470589 + -- >>> w(40) + -- 0.6097560975609756 + -- >>> w(50) + -- 0.5 + -- >>> w(100) + -- 0.2 + -- >>> w(150) + -- 0.1 + -- >>> w(200) + -- 0.058823529411764705 + weight := 1 / (1 + (distance / 50)^2); + + -- update score based on relation + IF plant_relation.relation = 'companion' THEN + score.preference := score.preference + 0.5 * weight; + ELSE + score.preference := score.preference - 0.5 * weight; + END IF; + + score.relevance := score.relevance + 0.5 * weight; + END LOOP; + + RETURN score; +END; +$$ LANGUAGE plpgsql; + +-- Get all relations for the plant on the specified layer. +CREATE OR REPLACE FUNCTION get_plant_relations_array( + p_layer_id integer, + p_plant_id integer, + date date +) +RETURNS relations_summary [] AS $$ +BEGIN + RETURN ARRAY( + -- We only need x,y and type of relation to calculate a score. + SELECT ROW(plantings.x, plantings.y, relations.relation) + FROM plantings + JOIN plants ON plantings.plant_id = plants.id + JOIN ( + -- We need UNION as the relation is bidirectional. + SELECT plant1 AS plant, r1.relation + FROM relations r1 + WHERE plant2 = p_plant_id + AND r1.relation != 'neutral' + UNION + SELECT plant2 AS plant, r2.relation + FROM relations r2 + WHERE plant1 = p_plant_id + AND r2.relation != 'neutral' + ) relations ON plants.id = relations.plant + WHERE plantings.layer_id = p_layer_id + AND (plantings.add_date IS NULL OR plantings.add_date <= date) + AND (plantings.remove_date IS NULL OR plantings.remove_date > date) + ); +END; +$$ LANGUAGE plpgsql; + +------------------------------------------------------------------------------------ +-- SHADINGS -- SHADINGS -- SHADINGS -- SHADINGS -- SHADINGS -- SHADINGS -- SHADINGS +------------------------------------------------------------------------------------ + + +-- Calculate score and relevance for a certain position. +-- +-- p_map_id ... map id +-- p_layer_ids[1] ... plant layer +-- p_layer_ids[2] ... shade layer +-- p_plant_id ... id of the plant for which to consider relations +-- date ... date at which to generate the heatmap +-- x_pos,y_pos ... coordinates on the map where to calculate the score +CREATE OR REPLACE FUNCTION calculate_score( + p_map_id integer, + p_layer_ids integer [], + p_plant_id integer, + date date, + x_pos integer, + y_pos integer, + relations_p relations_summary [] +) +RETURNS score AS $$ +DECLARE + score SCORE; + plants SCORE; + shades SCORE; +BEGIN + plants := calculate_score_from_relations(p_layer_ids[1], p_plant_id, date, x_pos, y_pos, relations_p); + shades := calculate_score_from_shadings(p_layer_ids[2], p_plant_id, date, x_pos, y_pos); + + score.preference := plants.preference + shades.preference; + score.relevance := plants.relevance + shades.relevance; + + RETURN score; +END; +$$ LANGUAGE plpgsql; + +-- Calculate preference: Between -1 and 1 depending on shadings. +-- Calculate relevance: 1 if there is shading; otherwise 0.0. +-- +-- If the plant would die at the position set preference=-100 and relevance=100. +CREATE OR REPLACE FUNCTION calculate_score_from_shadings( + p_layer_id integer, + p_plant_id integer, + date date, + x_pos integer, + y_pos integer +) +RETURNS score AS $$ +DECLARE + point GEOMETRY; + plant_shade SHADE; + plant_light_requirement light_requirement []; + allowed_shades SHADE [] := '{}'; + shading_shade SHADE; + all_values SHADE[]; + pos1 INTEGER; + pos2 INTEGER; + score SCORE; +BEGIN + IF NOT EXISTS (SELECT 1 FROM layers WHERE id = p_layer_id AND type = 'shade') THEN + RAISE EXCEPTION 'Shade layer with id % not found', p_layer_id; + END IF; + + -- Get the required light level and preferred shade level of the plant + SELECT light_requirement, shade INTO plant_light_requirement, plant_shade + FROM plants + WHERE id = p_plant_id; + + -- Create a point from x_pos and y_pos + point := ST_SetSRID(ST_MakePoint(x_pos, y_pos), 4326); + -- Select the shading with the darkest shade that intersects the point + SELECT shade INTO shading_shade + FROM shadings + WHERE layer_id = p_layer_id + AND (add_date IS NULL OR add_date <= date) + AND (remove_date IS NULL OR remove_date > date) + AND ST_Intersects(geometry, point) + ORDER BY shade DESC + LIMIT 1; + + -- If there's no shading, then there is sun. + IF NOT FOUND THEN + shading_shade := 'no shade'; + END IF; + + -- Check if the plant can survive at the position. + -- If the plant can't survive set preference=-100 and relevance=100. + IF plant_light_requirement IS NOT NULL + THEN + IF 'full sun' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"no shade", "light shade"}'; + END IF; + IF 'partial sun/shade' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"light shade", "partial shade", "permanent shade"}'; + END IF; + IF 'full shade' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"permanent shade", "permanent deep shade"}'; + END IF; + + IF NOT (shading_shade = ANY(allowed_shades)) + THEN + score.preference := -100; + score.relevance := 100; + RETURN score; + END IF; + END IF; + + -- If there's no shading, return 0. + IF plant_shade IS NULL THEN + score.preference := 0.0; + score.relevance := 0.0; + RETURN score; + END IF; + + -- Get all possible enum values + SELECT enum_range(NULL::SHADE) INTO all_values; + + -- Get the position of each enum value in the array + SELECT array_position(all_values, plant_shade) INTO pos1; + SELECT array_position(all_values, shading_shade) INTO pos2; + + -- Calculate the 'distance' to the preferred shade as a values between -1 and 1 + score.preference := (0.5 - (abs(pos1 - pos2) / (ARRAY_LENGTH(all_values, 1) - 1)::REAL)^0.5) * 2.0; + score.relevance := 1.0; + + RETURN score; +END; +$$ LANGUAGE plpgsql; diff --git a/benchmarks/backend/heatmap_sql/heatmap_v2_inlined.sql b/benchmarks/backend/heatmap_sql/heatmap_v2_inlined.sql new file mode 100644 index 000000000..282fedc50 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/heatmap_v2_inlined.sql @@ -0,0 +1,245 @@ +DROP TABLE IF EXISTS relations_summary CASCADE; +CREATE TABLE relations_summary ( + x integer, + y integer, + relation relation_type +); + + +DROP FUNCTION IF EXISTS calculate_heatmap; +DROP FUNCTION IF EXISTS scale_score; +DROP FUNCTION IF EXISTS calculate_score; +DROP FUNCTION IF EXISTS calculate_score_from_relations; +DROP FUNCTION IF EXISTS calculate_score_from_shadings; + + +CREATE OR REPLACE FUNCTION calculate_heatmap( + p_map_id integer, + p_layer_ids integer [], + p_plant_id integer, + date date, + granularity integer, + x_min integer, + y_min integer, + x_max integer, + y_max integer +) +RETURNS TABLE (preference real, relevance real, x integer, y integer) AS $$ +DECLARE + map_geometry GEOMETRY(POLYGON, 4326); + point GEOMETRY; + bbox GEOMETRY; + num_cols INTEGER; + num_rows INTEGER; + x_pos INTEGER; + y_pos INTEGER; + plant_relation RECORD; + plant_score SCORE; + shading_score SCORE; + combined_score SCORE; + output_score SCORE; + distance REAL; + weight REAL; + plant_shade SHADE; + plant_light_requirement light_requirement []; + allowed_shades SHADE [] := '{}'; + shading_shade SHADE; + all_values SHADE[]; + pos1 INTEGER; + pos2 INTEGER; + shading_score_found BOOLEAN; + relations relations_summary[]; +BEGIN + -- Makes sure the layers exists and fits to the map + FOR i IN 1..array_length(p_layer_ids, 1) LOOP + IF NOT EXISTS (SELECT 1 FROM layers WHERE id = p_layer_ids[i] AND map_id = p_map_id) THEN + RAISE EXCEPTION 'Layer with id % not found on map with id %', p_layer_ids[i], p_map_id; + END IF; + END LOOP; + -- Makes sure the plant exists + IF NOT EXISTS (SELECT 1 FROM plants WHERE id = p_plant_id) THEN + RAISE EXCEPTION 'Plant with id % not found', p_plant_id; + END IF; + IF NOT EXISTS (SELECT 1 FROM layers WHERE id = p_layer_ids[2] AND type = 'shade') THEN + RAISE EXCEPTION 'Shade layer with id % not found', p_layer_ids[2]; + END IF; + + -- INTO STRICT makes sure the map exists. Does have to be explicitly checked as bounding box calculation would error anyways. + SELECT geometry FROM maps WHERE id = p_map_id INTO STRICT map_geometry; + + -- Calculate the number of rows and columns based on the map's size and granularity + num_cols := FLOOR((x_max - x_min) / granularity); -- Adjusted for granularity + num_rows := FLOOR((y_max - y_min) / granularity); -- Adjusted for granularity + + relations := get_plant_relations_array(p_layer_ids[1], p_plant_id, date); + + -- Get all possible enum values + SELECT enum_range(NULL::SHADE) INTO all_values; + + -- Calculate the score for each point on the heatmap + FOR i IN 0..num_cols-1 LOOP + -- i and j do not represent coordinates. We need to adjust them to actual coordinates. + x_pos := x_min + (i * granularity) + (granularity / 2); + + FOR j IN 0..num_rows-1 LOOP + y_pos := y_min + (j * granularity) + (granularity / 2); + + -- Create a point from x_pos and y_pos + point := ST_SetSRID(ST_MakePoint(x_pos, y_pos), 4326); + + -- If the point is on the map calculate a score; otherwise set score to 0. + IF ST_Intersects(point, map_geometry) THEN + ---------------------------------------------------------------------------------- + -- PLANT SCORE + plant_score.preference := 0.0; + plant_score.relevance := 0.0; + + FOREACH plant_relation IN ARRAY relations LOOP + -- calculate euclidean distance + distance := sqrt((plant_relation.x - x_pos)^2 + (plant_relation.y - y_pos)^2); + + -- calculate weight based on distance + -- weight decreases between 1 and 0 based on distance + -- distance is squared so it decreases faster the further away + -- weight is halved at 50 cm away + weight := 1 / (1 + (distance / 50)^2); + + -- update score based on relation + IF plant_relation.relation = 'companion' THEN + plant_score.preference := plant_score.preference + 0.5 * weight; + ELSE + plant_score.preference := plant_score.preference - 0.5 * weight; + END IF; + + plant_score.relevance := plant_score.relevance + 0.5 * weight; + END LOOP; + + + ---------------------------------------------------------------------------------- + -- SHADING SCORE + shading_score.preference := 0.0; + shading_score.relevance := 0.0; + shading_score_found := false; + + -- Get the required light level and preferred shade level of the plant + SELECT light_requirement, shade INTO plant_light_requirement, plant_shade + FROM plants + WHERE id = p_plant_id; + + -- Create a point from x_pos and y_pos + point := ST_SetSRID(ST_MakePoint(x_pos, y_pos), 4326); + -- Select the shading with the darkest shade that intersects the point + SELECT shade INTO shading_shade + FROM shadings + WHERE layer_id = p_layer_ids[2] + AND (add_date IS NULL OR add_date <= date) + AND (remove_date IS NULL OR remove_date > date) + AND ST_Intersects(geometry, point) + ORDER BY shade DESC + LIMIT 1; + + -- If there's no shading, then there is sun. + IF NOT FOUND THEN + shading_shade := 'no shade'; + END IF; + + -- Check if the plant can survive at the position. + -- If the plant can't survive set preference=-100 and relevance=100. + IF plant_light_requirement IS NOT NULL + THEN + IF 'full sun' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"no shade", "light shade"}'; + END IF; + IF 'partial sun/shade' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"light shade", "partial shade", "permanent shade"}'; + END IF; + IF 'full shade' = ANY(plant_light_requirement) + THEN + allowed_shades := allowed_shades || '{"permanent shade", "permanent deep shade"}'; + END IF; + + IF NOT (shading_shade = ANY(allowed_shades)) + THEN + shading_score.preference := -100; + shading_score.relevance := 100; + shading_score_found := true; + END IF; + END IF; + + -- If there's no shading, return 0. + IF plant_shade IS NULL AND NOT shading_score_found THEN + shading_score.preference := 0.0; + shading_score.relevance := 0.0; + shading_score_found := true; + END IF; + + IF NOT shading_score_found THEN + + -- Get the position of each enum value in the array + SELECT array_position(all_values, plant_shade) INTO pos1; + SELECT array_position(all_values, shading_shade) INTO pos2; + + -- Calculate the 'distance' to the preferred shade as a values between -1 and 1 + shading_score.preference := (0.5 - (abs(pos1 - pos2) / (ARRAY_LENGTH(all_values, 1) - 1)::REAL)^0.5) * 2.0; + shading_score.relevance := 1.0; + END IF; + + ----------------------------------------------------------------------------------------- + -- COMBINED SCORE + combined_score.preference := plant_score.preference + shading_score.preference; + combined_score.relevance := plant_score.relevance + shading_score.relevance; + + -- scale to be between 0 and 1 + output_score.preference := 1 / (1 + exp(-combined_score.preference)); -- standard sigmoid, so that f(0)=0.5 + output_score.relevance := (2 / (1 + exp(-combined_score.relevance))) - 1; -- modified sigmoid, so that f(0)=0 + + preference := output_score.preference; + relevance := output_score.relevance; + ELSE + preference := 0.0; + relevance := 0.0; + END IF; + + x := i; + y := j; + + RETURN NEXT; + END LOOP; + END LOOP; +END; +$$ LANGUAGE plpgsql; + + +-- Get all relations for the plant on the specified layer. +CREATE OR REPLACE FUNCTION get_plant_relations_array( + p_layer_id integer, + p_plant_id integer, + date date +) +RETURNS relations_summary [] AS $$ +BEGIN + RETURN ARRAY( + -- We only need x,y and type of relation to calculate a score. + SELECT ROW(plantings.x, plantings.y, relations.relation) + FROM plantings + JOIN plants ON plantings.plant_id = plants.id + JOIN ( + -- We need UNION as the relation is bidirectional. + SELECT plant1 AS plant, r1.relation + FROM relations r1 + WHERE plant2 = p_plant_id + AND r1.relation != 'neutral' + UNION + SELECT plant2 AS plant, r2.relation + FROM relations r2 + WHERE plant1 = p_plant_id + AND r2.relation != 'neutral' + ) relations ON plants.id = relations.plant + WHERE plantings.layer_id = p_layer_id + AND (plantings.add_date IS NULL OR plantings.add_date <= date) + AND (plantings.remove_date IS NULL OR plantings.remove_date > date) + ); +END; +$$ LANGUAGE plpgsql; diff --git a/benchmarks/backend/heatmap_sql/pgpass b/benchmarks/backend/heatmap_sql/pgpass new file mode 100644 index 000000000..fa4b33555 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/pgpass @@ -0,0 +1 @@ +db:5432:permaplant:permaplant:permaplant diff --git a/benchmarks/backend/heatmap_sql/profile_large_v0.html b/benchmarks/backend/heatmap_sql/profile_large_v0.html new file mode 100644 index 000000000..9ccfe0c7a --- /dev/null +++ b/benchmarks/backend/heatmap_sql/profile_large_v0.html @@ -0,0 +1,3060 @@ +2 + + + Heatmap + + + + + + +

PL/pgSQL Call Graph

+
+ + + + + + + + + + + + + + Heatmap + + + + Reset Zoom + + + + public.calculate_score_from_shadings() oid=20458 (2,491,928 samples, + 53.62%) + + + + public.calculate_score_from_shadings() oid=20458 + + + + public.scale_score() oid=20455 (4,229 samples, 0.09%) + + + + + + public.calculate_heatmap() oid=20452 (4,647,092 samples, 100.00%) + + + + public.calculate_heatmap() oid=20452 + + + + + public.get_plant_relations() oid=20006 (1,724,695 samples, 37.11%) + + + + public.get_plant_relations() oid=20006 + + + + all (4,647,092 samples, 100%) + + + + + + public.calculate_score() oid=20456 (4,568,739 samples, 98.31%) + + + + public.calculate_score() oid=20456 + + + + + public.calculate_score_from_relations() oid=20457 (2,027,016 + samples, 43.62%) + + + + public.calculate_score_from_relations() oid=20457 + + + +
+

List of functions detailed below

+ +

All 6 functions (by self_time)

+ +

+ Function public.calculate_score_from_shadings() oid=20458 (show) +

+

+ self_time = 2,491,928 µs
+ total_time = 2,491,928 µs +

+ + + + + + + + +
+ public.calculate_score_from_shadings  + + (p_layer_id integer,
 p_plant_id integer,
 date + date,
 x_pos integer,
 y_pos integer)
+
+     RETURNS score +
+ + +

+ Function public.get_plant_relations() oid=20006 (show) +

+

+ self_time = 1,724,695 µs
+ total_time = 1,724,695 µs +

+ + + + + + + + +
+ public.get_plant_relations  + + (p_layer_id integer,
 p_plant_id integer,
 date + date)
+
+     RETURNS TABLE(x integer, y integer, relation relation_type) +
+ + +

+ Function public.calculate_score_from_relations() oid=20457 (show) +

+

+ self_time = 302,321 µs
+ total_time = 2,027,016 µs +

+ + + + + + + + +
+ public.calculate_score_from_relations  + + (p_layer_id integer,
 p_plant_id integer,
 date + date,
 x_pos integer,
 y_pos integer)
+
+     RETURNS score +
+ + +

+ Function public.calculate_heatmap() oid=20452 (show) +

+

+ self_time = 74,124 µs
+ total_time = 4,647,092 µs +

+ + + + + + + + +
+ public.calculate_heatmap  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 granularity integer,
 x_min + integer,
 y_min integer,
 x_max integer,
 y_max + integer)
+
+     RETURNS TABLE(preference real, relevance real, x integer, y integer) +
+ + +

+ Function public.calculate_score() oid=20456 (show) +

+

+ self_time = 49,795 µs
+ total_time = 4,568,739 µs +

+ + + + + + + + +
+ public.calculate_score  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 x_pos integer,
 y_pos + integer)
+
+     RETURNS score +
+ + +

+ Function public.scale_score() oid=20455 (show) +

+

+ self_time = 4,229 µs
+ total_time = 4,229 µs +

+ + + + + + + + +
+ public.scale_score  + + (input score) +
+     RETURNS score +
+ + + diff --git a/benchmarks/backend/heatmap_sql/profile_large_v1.html b/benchmarks/backend/heatmap_sql/profile_large_v1.html new file mode 100644 index 000000000..5e85c59b8 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/profile_large_v1.html @@ -0,0 +1,3361 @@ + + + Heatmap + + + + + + +

PL/pgSQL Call Graph

+
+ + + + + + + + + + + + + + Heatmap + + + + Reset Zoom + + + + public.calculate_heatmap() oid=20452 (2,876,528 samples, 100.00%) + + + + public.calculate_heatmap() oid=20452 + + + + public.scale_score() oid=20455 (2,978 samples, 0.10%) + + + + + + public.calculate_score_from_relations() oid=20463 (217,938 samples, + 7.58%) + + + + public.cal.. + + + + + public.calculate_score_from_shadings() oid=20458 (2,535,568 samples, + 88.15%) + + + + public.calculate_score_from_shadings() oid=20458 + + + + + public.calculate_score() oid=20462 (2,797,961 samples, 97.27%) + + + + public.calculate_score() oid=20462 + + + + + public.get_plant_relations_array() oid=20464 (1,139 samples, 0.04%) + + + + + + all (2,876,528 samples, 100%) + + + + +
+

List of functions detailed below

+ +

All 6 functions (by self_time)

+ +

+ Function public.calculate_score_from_shadings() oid=20458 (show) +

+

+ self_time = 2,535,568 µs
+ total_time = 2,535,568 µs +

+ + + + + + + + +
+ public.calculate_score_from_shadings  + + (p_layer_id integer,
 p_plant_id integer,
 date + date,
 x_pos integer,
 y_pos integer)
+
+     RETURNS score +
+ + +

+ Function public.calculate_score_from_relations() oid=20463 (show) +

+

+ self_time = 217,938 µs
+ total_time = 217,938 µs +

+ + + + + + + + +
+ public.calculate_score_from_relations  + + (p_layer_id integer,
 p_plant_id integer,
 date + date,
 x_pos integer,
 y_pos integer,
 relations + relations_summary[])
+
+     RETURNS score +
+ + +

+ Function public.calculate_heatmap() oid=20452 (show) +

+

+ self_time = 74,450 µs
+ total_time = 2,876,528 µs +

+ + + + + + + + +
+ public.calculate_heatmap  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 granularity integer,
 x_min + integer,
 y_min integer,
 x_max integer,
 y_max + integer)
+
+     RETURNS TABLE(preference real, relevance real, x integer, y integer) +
+ + +

+ Function public.calculate_score() oid=20462 (show) +

+

+ self_time = 44,455 µs
+ total_time = 2,797,961 µs +

+ + + + + + + + +
+ public.calculate_score  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 x_pos integer,
 y_pos + integer,
 relations_p relations_summary[])
+
+     RETURNS score +
+ + +

+ Function public.scale_score() oid=20455 (show) +

+

+ self_time = 2,978 µs
+ total_time = 2,978 µs +

+ + + + + + + + +
+ public.scale_score  + + (input score) +
+     RETURNS score +
+ + +

+ Function public.get_plant_relations_array() oid=20464 (show) +

+

+ self_time = 1,139 µs
+ total_time = 1,139 µs +

+ + + + + + + + +
+ public.get_plant_relations_array  + + (p_layer_id integer,
 p_plant_id integer,
 date + date)
+
+     RETURNS relations_summary[] +
+ + + diff --git a/benchmarks/backend/heatmap_sql/profile_large_v2.html b/benchmarks/backend/heatmap_sql/profile_large_v2.html new file mode 100644 index 000000000..95501eace --- /dev/null +++ b/benchmarks/backend/heatmap_sql/profile_large_v2.html @@ -0,0 +1,2621 @@ + + + Heatmap + + + + + + +

PL/pgSQL Call Graph

+
+ + + + + + + + + + + + + + Heatmap + + + + Reset Zoom + + + + public.calculate_heatmap() oid=20470 (3,192,295 samples, 100.00%) + + + + public.calculate_heatmap() oid=20470 + + + + all (3,192,295 samples, 100%) + + + + + + public.get_plant_relations_array() oid=20472 (1,015 samples, 0.03%) + + + + + +
+

List of functions detailed below

+ +

All 2 functions (by self_time)

+ +

+ Function public.calculate_heatmap() oid=20470 (show) +

+

+ self_time = 3,191,280 µs
+ total_time = 3,192,295 µs +

+ + + + + + + + +
+ public.calculate_heatmap  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 granularity integer,
 x_min + integer,
 y_min integer,
 x_max integer,
 y_max + integer)
+
+     RETURNS TABLE(preference real, relevance real, x integer, y integer) +
+ + +

+ Function public.get_plant_relations_array() oid=20472 (show) +

+

+ self_time = 1,015 µs
+ total_time = 1,015 µs +

+ + + + + + + + +
+ public.get_plant_relations_array  + + (p_layer_id integer,
 p_plant_id integer,
 date + date)
+
+     RETURNS relations_summary[] +
+ + + diff --git a/benchmarks/backend/heatmap_sql/profile_small_v0.html b/benchmarks/backend/heatmap_sql/profile_small_v0.html new file mode 100644 index 000000000..8098b3d5d --- /dev/null +++ b/benchmarks/backend/heatmap_sql/profile_small_v0.html @@ -0,0 +1,3059 @@ + + + Heatmap + + + + + + +

PL/pgSQL Call Graph

+
+ + + + + + + + + + + + + + Heatmap + + + + Reset Zoom + + + + public.calculate_score_from_relations() oid=20431 (2,009,207 + samples, 81.12%) + + + + public.calculate_score_from_relations() oid=20431 + + + + + public.calculate_score() oid=20430 (2,401,315 samples, 96.95%) + + + + public.calculate_score() oid=20430 + + + + + public.calculate_score_from_shadings() oid=20432 (343,443 samples, + 13.87%) + + + + public.calculate_scor.. + + + + public.scale_score() oid=20429 (2,313 samples, 0.09%) + + + + + + public.get_plant_relations() oid=20006 (1,714,006 samples, 69.20%) + + + + public.get_plant_relations() oid=20006 + + + + all (2,476,815 samples, 100%) + + + + + + public.calculate_heatmap() oid=20426 (2,476,815 samples, 100.00%) + + + + public.calculate_heatmap() oid=20426 + + + +
+

List of functions detailed below

+ +

All 6 functions (by self_time)

+ +

+ Function public.get_plant_relations() oid=20006 (show) +

+

+ self_time = 1,714,006 µs
+ total_time = 1,714,006 µs +

+ + + + + + + + +
+ public.get_plant_relations  + + (p_layer_id integer,
 p_plant_id integer,
 date + date)
+
+     RETURNS TABLE(x integer, y integer, relation relation_type) +
+ + +

+ Function public.calculate_score_from_shadings() oid=20432 (show) +

+

+ self_time = 343,443 µs
+ total_time = 343,443 µs +

+ + + + + + + + +
+ public.calculate_score_from_shadings  + + (p_layer_id integer,
 p_plant_id integer,
 date + date,
 x_pos integer,
 y_pos integer)
+
+     RETURNS score +
+ + +

+ Function public.calculate_score_from_relations() oid=20431 (show) +

+

+ self_time = 295,201 µs
+ total_time = 2,009,207 µs +

+ + + + + + + + +
+ public.calculate_score_from_relations  + + (p_layer_id integer,
 p_plant_id integer,
 date + date,
 x_pos integer,
 y_pos integer)
+
+     RETURNS score +
+ + +

+ Function public.calculate_heatmap() oid=20426 (show) +

+

+ self_time = 73,187 µs
+ total_time = 2,476,815 µs +

+ + + + + + + + +
+ public.calculate_heatmap  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 granularity integer,
 x_min + integer,
 y_min integer,
 x_max integer,
 y_max + integer)
+
+     RETURNS TABLE(preference real, relevance real, x integer, y integer) +
+ + +

+ Function public.calculate_score() oid=20430 (show) +

+

+ self_time = 48,665 µs
+ total_time = 2,401,315 µs +

+ + + + + + + + +
+ public.calculate_score  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 x_pos integer,
 y_pos + integer)
+
+     RETURNS score +
+ + +

+ Function public.scale_score() oid=20429 (show) +

+

+ self_time = 2,313 µs
+ total_time = 2,313 µs +

+ + + + + + + + +
+ public.scale_score  + + (input score) +
+     RETURNS score +
+ + + diff --git a/benchmarks/backend/heatmap_sql/profile_small_v1.html b/benchmarks/backend/heatmap_sql/profile_small_v1.html new file mode 100644 index 000000000..3a1705cc9 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/profile_small_v1.html @@ -0,0 +1,3361 @@ + + + Heatmap + + + + + + +

PL/pgSQL Call Graph

+
+ + + + + + + + + + + + + + Heatmap + + + + Reset Zoom + + + + public.calculate_score() oid=20436 (511,079 samples, 88.35%) + + + + public.calculate_score() oid=20436 + + + + public.scale_score() oid=20429 (457 samples, 0.08%) + + + + + + public.calculate_score_from_shadings() oid=20432 (272,389 samples, + 47.09%) + + + + public.calculate_score_from_shadings() oid=20432 + + + + all (578,463 samples, 100%) + + + + + + public.calculate_score_from_relations() oid=20437 (196,206 samples, + 33.92%) + + + + public.calculate_score_from_relations() oid=20437 + + + + + public.get_plant_relations_array() oid=20438 (1,177 samples, 0.20%) + + + + + + + public.calculate_heatmap() oid=20426 (578,463 samples, 100.00%) + + + + public.calculate_heatmap() oid=20426 + + + +
+

List of functions detailed below

+ +

All 6 functions (by self_time)

+ +

+ Function public.calculate_score_from_shadings() oid=20432 (show) +

+

+ self_time = 272,389 µs
+ total_time = 272,389 µs +

+ + + + + + + + +
+ public.calculate_score_from_shadings  + + (p_layer_id integer,
 p_plant_id integer,
 date + date,
 x_pos integer,
 y_pos integer)
+
+     RETURNS score +
+ + +

+ Function public.calculate_score_from_relations() oid=20437 (show) +

+

+ self_time = 196,206 µs
+ total_time = 196,206 µs +

+ + + + + + + + +
+ public.calculate_score_from_relations  + + (p_layer_id integer,
 p_plant_id integer,
 date + date,
 x_pos integer,
 y_pos integer,
 relations + relations_summary[])
+
+     RETURNS score +
+ + +

+ Function public.calculate_heatmap() oid=20426 (show) +

+

+ self_time = 65,750 µs
+ total_time = 578,463 µs +

+ + + + + + + + +
+ public.calculate_heatmap  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 granularity integer,
 x_min + integer,
 y_min integer,
 x_max integer,
 y_max + integer)
+
+     RETURNS TABLE(preference real, relevance real, x integer, y integer) +
+ + +

+ Function public.calculate_score() oid=20436 (show) +

+

+ self_time = 42,484 µs
+ total_time = 511,079 µs +

+ + + + + + + + +
+ public.calculate_score  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 x_pos integer,
 y_pos + integer,
 relations_p relations_summary[])
+
+     RETURNS score +
+ + +

+ Function public.get_plant_relations_array() oid=20438 (show) +

+

+ self_time = 1,177 µs
+ total_time = 1,177 µs +

+ + + + + + + + +
+ public.get_plant_relations_array  + + (p_layer_id integer,
 p_plant_id integer,
 date + date)
+
+     RETURNS relations_summary[] +
+ + +

+ Function public.scale_score() oid=20429 (show) +

+

+ self_time = 457 µs
+ total_time = 457 µs +

+ + + + + + + + +
+ public.scale_score  + + (input score) +
+     RETURNS score +
+ + + diff --git a/benchmarks/backend/heatmap_sql/profile_small_v2.html b/benchmarks/backend/heatmap_sql/profile_small_v2.html new file mode 100644 index 000000000..c973d525d --- /dev/null +++ b/benchmarks/backend/heatmap_sql/profile_small_v2.html @@ -0,0 +1,2621 @@ + + + Heatmap + + + + + + +

PL/pgSQL Call Graph

+
+ + + + + + + + + + + + + + Heatmap + + + + Reset Zoom + + + all (717,115 samples, 100%) + + + + + + public.calculate_heatmap() oid=20452 (717,115 samples, 100.00%) + + + + public.calculate_heatmap() oid=20452 + + + + + public.get_plant_relations_array() oid=20454 (1,021 samples, 0.14%) + + + + + +
+

List of functions detailed below

+ +

All 2 functions (by self_time)

+ +

+ Function public.calculate_heatmap() oid=20452 (show) +

+

+ self_time = 716,094 µs
+ total_time = 717,115 µs +

+ + + + + + + + +
+ public.calculate_heatmap  + + (p_map_id integer,
 p_layer_ids integer[],
 p_plant_id + integer,
 date date,
 granularity integer,
 x_min + integer,
 y_min integer,
 x_max integer,
 y_max + integer)
+
+     RETURNS TABLE(preference real, relevance real, x integer, y integer) +
+ + +

+ Function public.get_plant_relations_array() oid=20454 (show) +

+

+ self_time = 1,021 µs
+ total_time = 1,021 µs +

+ + + + + + + + +
+ public.get_plant_relations_array  + + (p_layer_id integer,
 p_plant_id integer,
 date + date)
+
+     RETURNS relations_summary[] +
+ + + diff --git a/benchmarks/backend/heatmap_sql/results/result_large_v0.txt b/benchmarks/backend/heatmap_sql/results/result_large_v0.txt new file mode 100644 index 000000000..7c0bd34f4 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/results/result_large_v0.txt @@ -0,0 +1,46 @@ +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION + +Inserting a 1000 shadings map +DELETE 1000 +INSERT 0 1000 +Timing is on. + count +------- + 10000 +(1 row) + +Time: 4641.479 ms (00:04.641) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 4616.774 ms (00:04.617) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 4577.090 ms (00:04.577) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 4604.659 ms (00:04.605) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 4587.410 ms (00:04.587) diff --git a/benchmarks/backend/heatmap_sql/results/result_large_v1.txt b/benchmarks/backend/heatmap_sql/results/result_large_v1.txt new file mode 100644 index 000000000..c7a048b30 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/results/result_large_v1.txt @@ -0,0 +1,56 @@ +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +Patching heatmap algorithm (v1: fetch plant relations once)... +DROP TABLE +CREATE TABLE +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION + +Inserting a 1000 shadings map +DELETE 1000 +INSERT 0 1000 +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2677.813 ms (00:02.678) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2532.440 ms (00:02.532) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2531.193 ms (00:02.531) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2470.111 ms (00:02.470) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2432.698 ms (00:02.433) diff --git a/benchmarks/backend/heatmap_sql/results/result_large_v2.txt b/benchmarks/backend/heatmap_sql/results/result_large_v2.txt new file mode 100644 index 000000000..04631bab6 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/results/result_large_v2.txt @@ -0,0 +1,56 @@ +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +Patching heatmap algorithm (v2: v1 + inlined) ... +DROP TABLE +CREATE TABLE +DROP FUNCTION +DROP FUNCTION +DROP FUNCTION +DROP FUNCTION +DROP FUNCTION +CREATE FUNCTION +CREATE FUNCTION + +Inserting a 1000 shadings map +DELETE 1000 +INSERT 0 1000 +Timing is on. + count +------- + 10000 +(1 row) + +Time: 3093.119 ms (00:03.093) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2695.719 ms (00:02.696) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2667.046 ms (00:02.667) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2656.293 ms (00:02.656) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2668.141 ms (00:02.668) diff --git a/benchmarks/backend/heatmap_sql/results/result_small_v0.txt b/benchmarks/backend/heatmap_sql/results/result_small_v0.txt new file mode 100644 index 000000000..9df7c8bfe --- /dev/null +++ b/benchmarks/backend/heatmap_sql/results/result_small_v0.txt @@ -0,0 +1,46 @@ +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION + +Inserting a 10 shadings map +DELETE 10 +INSERT 0 10 +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2297.376 ms (00:02.297) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2274.311 ms (00:02.274) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2270.683 ms (00:02.271) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2273.480 ms (00:02.273) +Timing is on. + count +------- + 10000 +(1 row) + +Time: 2278.747 ms (00:02.279) diff --git a/benchmarks/backend/heatmap_sql/results/result_small_v1.txt b/benchmarks/backend/heatmap_sql/results/result_small_v1.txt new file mode 100644 index 000000000..47768234e --- /dev/null +++ b/benchmarks/backend/heatmap_sql/results/result_small_v1.txt @@ -0,0 +1,56 @@ +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +Patching heatmap algorithm (v1: fetch plant relations once)... +DROP TABLE +CREATE TABLE +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION + +Inserting a 10 shadings map +DELETE 10 +INSERT 0 10 +Timing is on. + count +------- + 10000 +(1 row) + +Time: 519.816 ms +Timing is on. + count +------- + 10000 +(1 row) + +Time: 387.510 ms +Timing is on. + count +------- + 10000 +(1 row) + +Time: 379.885 ms +Timing is on. + count +------- + 10000 +(1 row) + +Time: 380.938 ms +Timing is on. + count +------- + 10000 +(1 row) + +Time: 380.386 ms diff --git a/benchmarks/backend/heatmap_sql/results/result_small_v2.txt b/benchmarks/backend/heatmap_sql/results/result_small_v2.txt new file mode 100644 index 000000000..782de141f --- /dev/null +++ b/benchmarks/backend/heatmap_sql/results/result_small_v2.txt @@ -0,0 +1,56 @@ +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +CREATE FUNCTION +Patching heatmap algorithm (v2: v1 + inlined) ... +DROP TABLE +CREATE TABLE +DROP FUNCTION +DROP FUNCTION +DROP FUNCTION +DROP FUNCTION +DROP FUNCTION +CREATE FUNCTION +CREATE FUNCTION + +Inserting a 10 shadings map +DELETE 10 +INSERT 0 10 +Timing is on. + count +------- + 10000 +(1 row) + +Time: 685.286 ms +Timing is on. + count +------- + 10000 +(1 row) + +Time: 251.292 ms +Timing is on. + count +------- + 10000 +(1 row) + +Time: 251.927 ms +Timing is on. + count +------- + 10000 +(1 row) + +Time: 250.995 ms +Timing is on. + count +------- + 10000 +(1 row) + +Time: 251.201 ms diff --git a/benchmarks/backend/heatmap_sql/run_profiler.sh b/benchmarks/backend/heatmap_sql/run_profiler.sh new file mode 100755 index 000000000..11dcecc50 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/run_profiler.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +# make sure plprofiler is installed +# sudo pip install git+https://github.com/bigsql/plprofiler/#subdirectory=python-plprofiler + +cd benchmarks/backend/heatmap_sql + +DATABASE_NAME="permaplant" +DATABASE_USER="permaplant" + +# restore original heatmap algorithm (v0) +PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f heatmap_v0_original.sql + +# patch heatmap algorithm to v1 +if [ "$1" == "--v1" ]; then + echo "Patching heatmap algorithm (v1: fetch plant relations once)..." + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f heatmap_v1_relations_once.sql +fi + +# patch heatmap algorithm to v2 +if [ "$1" == "--v2" ]; then + echo "Patching heatmap algorithm (v2: v1 + inlined) ..." + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f heatmap_v2_inlined.sql +fi + +read -n 1 -p "Do you want to profile a 10, 100 or 1000 shadings map? (s/m/l) " opt; +case $opt in + s|S) + printf "\nInserting a 10 shadings map\n" + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f setup_data/insert_10_shadings.sql + ;; + m|M) + printf "\nInserting a 100 shadings map\n" + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f setup_data/insert_100_shadings.sql + ;; + l|L) + printf "\nInserting a 1000 shadings map\n" + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f setup_data/insert_1000_shadings.sql + ;; +esac + +PGPASSWORD=permaplant plprofiler run --command \ + "select count(*) from calculate_heatmap(1, '{2,3}', 355, '2024-03-03', 100, 0, 0, 10000, 10000);" \ + --name="Heatmap" --title="Heatmap" --desc="" \ + --output profile.html -h localhost -d $DATABASE_NAME -U $DATABASE_USER + + +# 23 2024-03-03 21:57:23.344 UTC [1277] DETAIL: parameters: $1 = '1', $2 = '{2,3}', $3 = '2921', $4 = '2024-03-03', $5 = '100', $6 = '0', $7 = '0', $8 = '10000', $9 = '10000' +# 2024-03-03 22:57:23 2024-03-03 21:57:23.344 UTC [1277] LOG: execute s50: SELECT * FROM calculate_heatmap($1, $2, $3, $4, $5, $6, $7, $8, $9) +# +# p_map_id INTEGER, +# p_layer_ids INTEGER [], +# p_plant_id INTEGER, +# date DATE, +# granularity INTEGER, +# x_min INTEGER, +# y_min INTEGER, +# x_max INTEGER, +# y_max INTEGER diff --git a/benchmarks/backend/heatmap_sql/run_queries.sh b/benchmarks/backend/heatmap_sql/run_queries.sh new file mode 100755 index 000000000..f087492c8 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/run_queries.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash + +cd benchmarks/backend/heatmap_sql + +DATABASE_NAME="permaplant" +DATABASE_USER="permaplant" + +# restore original heatmap algorithm (v0) +PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f heatmap_v0_original.sql + +# patch heatmap algorithm to v1 +if [ "$1" == "--v1" ]; then + echo "Patching heatmap algorithm (v1: fetch plant relations once)..." + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f heatmap_v1_relations_once.sql +fi + +# patch heatmap algorithm to v2 +if [ "$1" == "--v2" ]; then + echo "Patching heatmap algorithm (v2: v1 + inlined) ..." + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f heatmap_v2_inlined.sql +fi + +read -n 1 -p "Do you want to benchmark a 10, 100 or 1000 shadings map? (s/m/l) " opt; +case $opt in + s|S) + printf "\nInserting a 10 shadings map\n" + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f setup_data/insert_10_shadings.sql + ;; + m|M) + printf "\nInserting a 100 shadings map\n" + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f setup_data/insert_100_shadings.sql + ;; + l|L) + printf "\nInserting a 1000 shadings map\n" + PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f setup_data/insert_1000_shadings.sql + ;; +esac + + +DATABASE_NAME="permaplant" +DATABASE_USER="permaplant" + +PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -c "\timing" -c " +select count(*) from calculate_heatmap(1, '{2,3}', 355, '2024-03-03', 100, 0, 0, 10000, 10000); +" +PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -c "\timing" -c " +select count(*) from calculate_heatmap(1, '{2,3}', 2921, '2024-03-03', 100, 0, 0, 10000, 10000); +" +PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -c "\timing" -c " +select count(*) from calculate_heatmap(1, '{2,3}', 2921, '2024-03-03', 100, 0, 0, 10000, 10000); +" +PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -c "\timing" -c " +select count(*) from calculate_heatmap(1, '{2,3}', 2921, '2024-03-03', 100, 0, 0, 10000, 10000); +" +PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -c "\timing" -c " +select count(*) from calculate_heatmap(1, '{2,3}', 2921, '2024-03-03', 100, 0, 0, 10000, 10000); +" +# 23 2024-03-03 21:57:23.344 UTC [1277] DETAIL: parameters: $1 = '1', $2 = '{2,3}', $3 = '2921', $4 = '2024-03-03', $5 = '100', $6 = '0', $7 = '0', $8 = '10000', $9 = '10000' +# 2024-03-03 22:57:23 2024-03-03 21:57:23.344 UTC [1277] LOG: execute s50: SELECT * FROM calculate_heatmap($1, $2, $3, $4, $5, $6, $7, $8, $9) +# +# p_map_id INTEGER, +# p_layer_ids INTEGER [], +# p_plant_id INTEGER, +# date DATE, +# granularity INTEGER, +# x_min INTEGER, +# y_min INTEGER, +# x_max INTEGER, +# y_max INTEGER diff --git a/benchmarks/backend/heatmap_sql/servers.json b/benchmarks/backend/heatmap_sql/servers.json new file mode 100644 index 000000000..ec505d8da --- /dev/null +++ b/benchmarks/backend/heatmap_sql/servers.json @@ -0,0 +1,14 @@ +{ + "Servers": { + "1": { + "Name": "permaplant", + "Group": "Servers", + "Host": "benchmark-postgis", + "Port": 5432, + "MaintenanceDB": "postgres", + "Username": "permaplant", + "PassFile": "/pgpass", + "SSLMode": "prefer" + } + } +} diff --git a/benchmarks/backend/heatmap_sql/setup.sh b/benchmarks/backend/heatmap_sql/setup.sh new file mode 100755 index 000000000..34b7e663d --- /dev/null +++ b/benchmarks/backend/heatmap_sql/setup.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# rm docker container with name postgis +# set compose file env var +COMPOSE_FILE=docker-compose.yml +cd benchmarks/backend/heatmap_sql + +printf "Creating database container\n" +docker compose stop +docker compose rm -f + +docker volume rm -f heatmap_sql_pgadmin-data-benchmark +docker volume rm -f heatmap_sql_postgis-data-benchmark + +# Start the database +# docker run -d --name postgis -e POSTGRES_PASSWORD=permaplant -e POSTGRES_USER=permaplant -p 5432:5432 postgis/postgis:13-3.1 +docker compose up --build -d + +printf "Waiting for database container to start\n" + +sleep 10 +cd ../../../backend +LC_ALL=C diesel setup +LC_ALL=C diesel migration run + +# Insert data +cd ../scraper && npm run insert + +DATABASE_NAME="permaplant" +DATABASE_USER="permaplant" + +printf "Inserting map data\n" +PGPASSWORD=permaplant psql -h localhost -p 5432 -U $DATABASE_USER -d $DATABASE_NAME -f ../benchmarks/backend/heatmap_sql/large_map.sql + + +read -n 1 -p "Inserted all data, start run_queries.sh to start benchmark" + +# Collect db logs +# docker logs postgis > postgis.log 2>&1 diff --git a/benchmarks/backend/heatmap_sql/setup_data/insert_1000_shadings.sql b/benchmarks/backend/heatmap_sql/setup_data/insert_1000_shadings.sql new file mode 100644 index 000000000..732e5f5b3 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/setup_data/insert_1000_shadings.sql @@ -0,0 +1,1002 @@ +DELETE FROM public.shadings WHERE layer_id = 3; +INSERT INTO public.shadings (id, layer_id, geometry, shade, add_date, remove_date) VALUES +('e6622aab-dc5d-4865-89d2-000000000000', 3, ST_GeomFromText('POLYGON((0 0, 100 0, 100 100, 0 100, 0 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000001', 3, ST_GeomFromText('POLYGON((150 0, 250 0, 250 100, 150 100, 150 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000002', 3, ST_GeomFromText('POLYGON((300 0, 400 0, 400 100, 300 100, 300 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000003', 3, ST_GeomFromText('POLYGON((450 0, 550 0, 550 100, 450 100, 450 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000004', 3, ST_GeomFromText('POLYGON((600 0, 700 0, 700 100, 600 100, 600 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000005', 3, ST_GeomFromText('POLYGON((750 0, 850 0, 850 100, 750 100, 750 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000006', 3, ST_GeomFromText('POLYGON((900 0, 1000 0, 1000 100, 900 100, 900 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000007', 3, ST_GeomFromText('POLYGON((1050 0, 1150 0, 1150 100, 1050 100, 1050 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000008', 3, ST_GeomFromText('POLYGON((1200 0, 1300 0, 1300 100, 1200 100, 1200 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000009', 3, ST_GeomFromText('POLYGON((1350 0, 1450 0, 1450 100, 1350 100, 1350 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000010', 3, ST_GeomFromText('POLYGON((1500 0, 1600 0, 1600 100, 1500 100, 1500 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000011', 3, ST_GeomFromText('POLYGON((1650 0, 1750 0, 1750 100, 1650 100, 1650 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000012', 3, ST_GeomFromText('POLYGON((1800 0, 1900 0, 1900 100, 1800 100, 1800 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000013', 3, ST_GeomFromText('POLYGON((1950 0, 2050 0, 2050 100, 1950 100, 1950 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000014', 3, ST_GeomFromText('POLYGON((2100 0, 2200 0, 2200 100, 2100 100, 2100 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000015', 3, ST_GeomFromText('POLYGON((2250 0, 2350 0, 2350 100, 2250 100, 2250 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000016', 3, ST_GeomFromText('POLYGON((2400 0, 2500 0, 2500 100, 2400 100, 2400 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000017', 3, ST_GeomFromText('POLYGON((2550 0, 2650 0, 2650 100, 2550 100, 2550 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000018', 3, ST_GeomFromText('POLYGON((2700 0, 2800 0, 2800 100, 2700 100, 2700 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000019', 3, ST_GeomFromText('POLYGON((2850 0, 2950 0, 2950 100, 2850 100, 2850 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000020', 3, ST_GeomFromText('POLYGON((3000 0, 3100 0, 3100 100, 3000 100, 3000 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000021', 3, ST_GeomFromText('POLYGON((3150 0, 3250 0, 3250 100, 3150 100, 3150 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000022', 3, ST_GeomFromText('POLYGON((3300 0, 3400 0, 3400 100, 3300 100, 3300 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000023', 3, ST_GeomFromText('POLYGON((3450 0, 3550 0, 3550 100, 3450 100, 3450 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000024', 3, ST_GeomFromText('POLYGON((3600 0, 3700 0, 3700 100, 3600 100, 3600 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000025', 3, ST_GeomFromText('POLYGON((3750 0, 3850 0, 3850 100, 3750 100, 3750 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000026', 3, ST_GeomFromText('POLYGON((3900 0, 4000 0, 4000 100, 3900 100, 3900 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000027', 3, ST_GeomFromText('POLYGON((4050 0, 4150 0, 4150 100, 4050 100, 4050 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000028', 3, ST_GeomFromText('POLYGON((4200 0, 4300 0, 4300 100, 4200 100, 4200 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000029', 3, ST_GeomFromText('POLYGON((4350 0, 4450 0, 4450 100, 4350 100, 4350 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000030', 3, ST_GeomFromText('POLYGON((4500 0, 4600 0, 4600 100, 4500 100, 4500 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000031', 3, ST_GeomFromText('POLYGON((4650 0, 4750 0, 4750 100, 4650 100, 4650 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000032', 3, ST_GeomFromText('POLYGON((4800 0, 4900 0, 4900 100, 4800 100, 4800 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000033', 3, ST_GeomFromText('POLYGON((4950 0, 5050 0, 5050 100, 4950 100, 4950 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000034', 3, ST_GeomFromText('POLYGON((5100 0, 5200 0, 5200 100, 5100 100, 5100 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000035', 3, ST_GeomFromText('POLYGON((5250 0, 5350 0, 5350 100, 5250 100, 5250 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000036', 3, ST_GeomFromText('POLYGON((5400 0, 5500 0, 5500 100, 5400 100, 5400 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000037', 3, ST_GeomFromText('POLYGON((5550 0, 5650 0, 5650 100, 5550 100, 5550 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000038', 3, ST_GeomFromText('POLYGON((5700 0, 5800 0, 5800 100, 5700 100, 5700 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000039', 3, ST_GeomFromText('POLYGON((5850 0, 5950 0, 5950 100, 5850 100, 5850 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000040', 3, ST_GeomFromText('POLYGON((6000 0, 6100 0, 6100 100, 6000 100, 6000 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000041', 3, ST_GeomFromText('POLYGON((6150 0, 6250 0, 6250 100, 6150 100, 6150 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000042', 3, ST_GeomFromText('POLYGON((6300 0, 6400 0, 6400 100, 6300 100, 6300 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000043', 3, ST_GeomFromText('POLYGON((6450 0, 6550 0, 6550 100, 6450 100, 6450 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000044', 3, ST_GeomFromText('POLYGON((6600 0, 6700 0, 6700 100, 6600 100, 6600 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000045', 3, ST_GeomFromText('POLYGON((6750 0, 6850 0, 6850 100, 6750 100, 6750 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000046', 3, ST_GeomFromText('POLYGON((6900 0, 7000 0, 7000 100, 6900 100, 6900 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000047', 3, ST_GeomFromText('POLYGON((7050 0, 7150 0, 7150 100, 7050 100, 7050 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000048', 3, ST_GeomFromText('POLYGON((7200 0, 7300 0, 7300 100, 7200 100, 7200 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000049', 3, ST_GeomFromText('POLYGON((7350 0, 7450 0, 7450 100, 7350 100, 7350 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000050', 3, ST_GeomFromText('POLYGON((7500 0, 7600 0, 7600 100, 7500 100, 7500 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000051', 3, ST_GeomFromText('POLYGON((7650 0, 7750 0, 7750 100, 7650 100, 7650 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000052', 3, ST_GeomFromText('POLYGON((7800 0, 7900 0, 7900 100, 7800 100, 7800 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000053', 3, ST_GeomFromText('POLYGON((7950 0, 8050 0, 8050 100, 7950 100, 7950 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000054', 3, ST_GeomFromText('POLYGON((8100 0, 8200 0, 8200 100, 8100 100, 8100 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000055', 3, ST_GeomFromText('POLYGON((8250 0, 8350 0, 8350 100, 8250 100, 8250 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000056', 3, ST_GeomFromText('POLYGON((8400 0, 8500 0, 8500 100, 8400 100, 8400 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000057', 3, ST_GeomFromText('POLYGON((8550 0, 8650 0, 8650 100, 8550 100, 8550 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000058', 3, ST_GeomFromText('POLYGON((8700 0, 8800 0, 8800 100, 8700 100, 8700 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000059', 3, ST_GeomFromText('POLYGON((8850 0, 8950 0, 8950 100, 8850 100, 8850 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000060', 3, ST_GeomFromText('POLYGON((9000 0, 9100 0, 9100 100, 9000 100, 9000 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000061', 3, ST_GeomFromText('POLYGON((9150 0, 9250 0, 9250 100, 9150 100, 9150 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000062', 3, ST_GeomFromText('POLYGON((9300 0, 9400 0, 9400 100, 9300 100, 9300 0))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000063', 3, ST_GeomFromText('POLYGON((9450 0, 9550 0, 9550 100, 9450 100, 9450 0))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000064', 3, ST_GeomFromText('POLYGON((9600 0, 9700 0, 9700 100, 9600 100, 9600 0))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000065', 3, ST_GeomFromText('POLYGON((9750 0, 9850 0, 9850 100, 9750 100, 9750 0))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000066', 3, ST_GeomFromText('POLYGON((0 150, 100 150, 100 250, 0 250, 0 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000067', 3, ST_GeomFromText('POLYGON((150 150, 250 150, 250 250, 150 250, 150 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000068', 3, ST_GeomFromText('POLYGON((300 150, 400 150, 400 250, 300 250, 300 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000069', 3, ST_GeomFromText('POLYGON((450 150, 550 150, 550 250, 450 250, 450 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000070', 3, ST_GeomFromText('POLYGON((600 150, 700 150, 700 250, 600 250, 600 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000071', 3, ST_GeomFromText('POLYGON((750 150, 850 150, 850 250, 750 250, 750 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000072', 3, ST_GeomFromText('POLYGON((900 150, 1000 150, 1000 250, 900 250, 900 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000073', 3, ST_GeomFromText('POLYGON((1050 150, 1150 150, 1150 250, 1050 250, 1050 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000074', 3, ST_GeomFromText('POLYGON((1200 150, 1300 150, 1300 250, 1200 250, 1200 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000075', 3, ST_GeomFromText('POLYGON((1350 150, 1450 150, 1450 250, 1350 250, 1350 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000076', 3, ST_GeomFromText('POLYGON((1500 150, 1600 150, 1600 250, 1500 250, 1500 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000077', 3, ST_GeomFromText('POLYGON((1650 150, 1750 150, 1750 250, 1650 250, 1650 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000078', 3, ST_GeomFromText('POLYGON((1800 150, 1900 150, 1900 250, 1800 250, 1800 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000079', 3, ST_GeomFromText('POLYGON((1950 150, 2050 150, 2050 250, 1950 250, 1950 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000080', 3, ST_GeomFromText('POLYGON((2100 150, 2200 150, 2200 250, 2100 250, 2100 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000081', 3, ST_GeomFromText('POLYGON((2250 150, 2350 150, 2350 250, 2250 250, 2250 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000082', 3, ST_GeomFromText('POLYGON((2400 150, 2500 150, 2500 250, 2400 250, 2400 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000083', 3, ST_GeomFromText('POLYGON((2550 150, 2650 150, 2650 250, 2550 250, 2550 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000084', 3, ST_GeomFromText('POLYGON((2700 150, 2800 150, 2800 250, 2700 250, 2700 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000085', 3, ST_GeomFromText('POLYGON((2850 150, 2950 150, 2950 250, 2850 250, 2850 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000086', 3, ST_GeomFromText('POLYGON((3000 150, 3100 150, 3100 250, 3000 250, 3000 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000087', 3, ST_GeomFromText('POLYGON((3150 150, 3250 150, 3250 250, 3150 250, 3150 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000088', 3, ST_GeomFromText('POLYGON((3300 150, 3400 150, 3400 250, 3300 250, 3300 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000089', 3, ST_GeomFromText('POLYGON((3450 150, 3550 150, 3550 250, 3450 250, 3450 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000090', 3, ST_GeomFromText('POLYGON((3600 150, 3700 150, 3700 250, 3600 250, 3600 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000091', 3, ST_GeomFromText('POLYGON((3750 150, 3850 150, 3850 250, 3750 250, 3750 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000092', 3, ST_GeomFromText('POLYGON((3900 150, 4000 150, 4000 250, 3900 250, 3900 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000093', 3, ST_GeomFromText('POLYGON((4050 150, 4150 150, 4150 250, 4050 250, 4050 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000094', 3, ST_GeomFromText('POLYGON((4200 150, 4300 150, 4300 250, 4200 250, 4200 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000095', 3, ST_GeomFromText('POLYGON((4350 150, 4450 150, 4450 250, 4350 250, 4350 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000096', 3, ST_GeomFromText('POLYGON((4500 150, 4600 150, 4600 250, 4500 250, 4500 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000097', 3, ST_GeomFromText('POLYGON((4650 150, 4750 150, 4750 250, 4650 250, 4650 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000098', 3, ST_GeomFromText('POLYGON((4800 150, 4900 150, 4900 250, 4800 250, 4800 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000099', 3, ST_GeomFromText('POLYGON((4950 150, 5050 150, 5050 250, 4950 250, 4950 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000100', 3, ST_GeomFromText('POLYGON((5100 150, 5200 150, 5200 250, 5100 250, 5100 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000101', 3, ST_GeomFromText('POLYGON((5250 150, 5350 150, 5350 250, 5250 250, 5250 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000102', 3, ST_GeomFromText('POLYGON((5400 150, 5500 150, 5500 250, 5400 250, 5400 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000103', 3, ST_GeomFromText('POLYGON((5550 150, 5650 150, 5650 250, 5550 250, 5550 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000104', 3, ST_GeomFromText('POLYGON((5700 150, 5800 150, 5800 250, 5700 250, 5700 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000105', 3, ST_GeomFromText('POLYGON((5850 150, 5950 150, 5950 250, 5850 250, 5850 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000106', 3, ST_GeomFromText('POLYGON((6000 150, 6100 150, 6100 250, 6000 250, 6000 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000107', 3, ST_GeomFromText('POLYGON((6150 150, 6250 150, 6250 250, 6150 250, 6150 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000108', 3, ST_GeomFromText('POLYGON((6300 150, 6400 150, 6400 250, 6300 250, 6300 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000109', 3, ST_GeomFromText('POLYGON((6450 150, 6550 150, 6550 250, 6450 250, 6450 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000110', 3, ST_GeomFromText('POLYGON((6600 150, 6700 150, 6700 250, 6600 250, 6600 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000111', 3, ST_GeomFromText('POLYGON((6750 150, 6850 150, 6850 250, 6750 250, 6750 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000112', 3, ST_GeomFromText('POLYGON((6900 150, 7000 150, 7000 250, 6900 250, 6900 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000113', 3, ST_GeomFromText('POLYGON((7050 150, 7150 150, 7150 250, 7050 250, 7050 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000114', 3, ST_GeomFromText('POLYGON((7200 150, 7300 150, 7300 250, 7200 250, 7200 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000115', 3, ST_GeomFromText('POLYGON((7350 150, 7450 150, 7450 250, 7350 250, 7350 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000116', 3, ST_GeomFromText('POLYGON((7500 150, 7600 150, 7600 250, 7500 250, 7500 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000117', 3, ST_GeomFromText('POLYGON((7650 150, 7750 150, 7750 250, 7650 250, 7650 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000118', 3, ST_GeomFromText('POLYGON((7800 150, 7900 150, 7900 250, 7800 250, 7800 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000119', 3, ST_GeomFromText('POLYGON((7950 150, 8050 150, 8050 250, 7950 250, 7950 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000120', 3, ST_GeomFromText('POLYGON((8100 150, 8200 150, 8200 250, 8100 250, 8100 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000121', 3, ST_GeomFromText('POLYGON((8250 150, 8350 150, 8350 250, 8250 250, 8250 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000122', 3, ST_GeomFromText('POLYGON((8400 150, 8500 150, 8500 250, 8400 250, 8400 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000123', 3, ST_GeomFromText('POLYGON((8550 150, 8650 150, 8650 250, 8550 250, 8550 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000124', 3, ST_GeomFromText('POLYGON((8700 150, 8800 150, 8800 250, 8700 250, 8700 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000125', 3, ST_GeomFromText('POLYGON((8850 150, 8950 150, 8950 250, 8850 250, 8850 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000126', 3, ST_GeomFromText('POLYGON((9000 150, 9100 150, 9100 250, 9000 250, 9000 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000127', 3, ST_GeomFromText('POLYGON((9150 150, 9250 150, 9250 250, 9150 250, 9150 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000128', 3, ST_GeomFromText('POLYGON((9300 150, 9400 150, 9400 250, 9300 250, 9300 150))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000129', 3, ST_GeomFromText('POLYGON((9450 150, 9550 150, 9550 250, 9450 250, 9450 150))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000130', 3, ST_GeomFromText('POLYGON((9600 150, 9700 150, 9700 250, 9600 250, 9600 150))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000131', 3, ST_GeomFromText('POLYGON((9750 150, 9850 150, 9850 250, 9750 250, 9750 150))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000132', 3, ST_GeomFromText('POLYGON((0 300, 100 300, 100 400, 0 400, 0 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000133', 3, ST_GeomFromText('POLYGON((150 300, 250 300, 250 400, 150 400, 150 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000134', 3, ST_GeomFromText('POLYGON((300 300, 400 300, 400 400, 300 400, 300 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000135', 3, ST_GeomFromText('POLYGON((450 300, 550 300, 550 400, 450 400, 450 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000136', 3, ST_GeomFromText('POLYGON((600 300, 700 300, 700 400, 600 400, 600 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000137', 3, ST_GeomFromText('POLYGON((750 300, 850 300, 850 400, 750 400, 750 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000138', 3, ST_GeomFromText('POLYGON((900 300, 1000 300, 1000 400, 900 400, 900 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000139', 3, ST_GeomFromText('POLYGON((1050 300, 1150 300, 1150 400, 1050 400, 1050 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000140', 3, ST_GeomFromText('POLYGON((1200 300, 1300 300, 1300 400, 1200 400, 1200 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000141', 3, ST_GeomFromText('POLYGON((1350 300, 1450 300, 1450 400, 1350 400, 1350 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000142', 3, ST_GeomFromText('POLYGON((1500 300, 1600 300, 1600 400, 1500 400, 1500 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000143', 3, ST_GeomFromText('POLYGON((1650 300, 1750 300, 1750 400, 1650 400, 1650 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000144', 3, ST_GeomFromText('POLYGON((1800 300, 1900 300, 1900 400, 1800 400, 1800 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000145', 3, ST_GeomFromText('POLYGON((1950 300, 2050 300, 2050 400, 1950 400, 1950 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000146', 3, ST_GeomFromText('POLYGON((2100 300, 2200 300, 2200 400, 2100 400, 2100 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000147', 3, ST_GeomFromText('POLYGON((2250 300, 2350 300, 2350 400, 2250 400, 2250 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000148', 3, ST_GeomFromText('POLYGON((2400 300, 2500 300, 2500 400, 2400 400, 2400 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000149', 3, ST_GeomFromText('POLYGON((2550 300, 2650 300, 2650 400, 2550 400, 2550 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000150', 3, ST_GeomFromText('POLYGON((2700 300, 2800 300, 2800 400, 2700 400, 2700 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000151', 3, ST_GeomFromText('POLYGON((2850 300, 2950 300, 2950 400, 2850 400, 2850 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000152', 3, ST_GeomFromText('POLYGON((3000 300, 3100 300, 3100 400, 3000 400, 3000 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000153', 3, ST_GeomFromText('POLYGON((3150 300, 3250 300, 3250 400, 3150 400, 3150 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000154', 3, ST_GeomFromText('POLYGON((3300 300, 3400 300, 3400 400, 3300 400, 3300 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000155', 3, ST_GeomFromText('POLYGON((3450 300, 3550 300, 3550 400, 3450 400, 3450 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000156', 3, ST_GeomFromText('POLYGON((3600 300, 3700 300, 3700 400, 3600 400, 3600 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000157', 3, ST_GeomFromText('POLYGON((3750 300, 3850 300, 3850 400, 3750 400, 3750 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000158', 3, ST_GeomFromText('POLYGON((3900 300, 4000 300, 4000 400, 3900 400, 3900 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000159', 3, ST_GeomFromText('POLYGON((4050 300, 4150 300, 4150 400, 4050 400, 4050 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000160', 3, ST_GeomFromText('POLYGON((4200 300, 4300 300, 4300 400, 4200 400, 4200 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000161', 3, ST_GeomFromText('POLYGON((4350 300, 4450 300, 4450 400, 4350 400, 4350 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000162', 3, ST_GeomFromText('POLYGON((4500 300, 4600 300, 4600 400, 4500 400, 4500 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000163', 3, ST_GeomFromText('POLYGON((4650 300, 4750 300, 4750 400, 4650 400, 4650 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000164', 3, ST_GeomFromText('POLYGON((4800 300, 4900 300, 4900 400, 4800 400, 4800 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000165', 3, ST_GeomFromText('POLYGON((4950 300, 5050 300, 5050 400, 4950 400, 4950 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000166', 3, ST_GeomFromText('POLYGON((5100 300, 5200 300, 5200 400, 5100 400, 5100 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000167', 3, ST_GeomFromText('POLYGON((5250 300, 5350 300, 5350 400, 5250 400, 5250 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000168', 3, ST_GeomFromText('POLYGON((5400 300, 5500 300, 5500 400, 5400 400, 5400 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000169', 3, ST_GeomFromText('POLYGON((5550 300, 5650 300, 5650 400, 5550 400, 5550 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000170', 3, ST_GeomFromText('POLYGON((5700 300, 5800 300, 5800 400, 5700 400, 5700 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000171', 3, ST_GeomFromText('POLYGON((5850 300, 5950 300, 5950 400, 5850 400, 5850 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000172', 3, ST_GeomFromText('POLYGON((6000 300, 6100 300, 6100 400, 6000 400, 6000 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000173', 3, ST_GeomFromText('POLYGON((6150 300, 6250 300, 6250 400, 6150 400, 6150 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000174', 3, ST_GeomFromText('POLYGON((6300 300, 6400 300, 6400 400, 6300 400, 6300 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000175', 3, ST_GeomFromText('POLYGON((6450 300, 6550 300, 6550 400, 6450 400, 6450 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000176', 3, ST_GeomFromText('POLYGON((6600 300, 6700 300, 6700 400, 6600 400, 6600 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000177', 3, ST_GeomFromText('POLYGON((6750 300, 6850 300, 6850 400, 6750 400, 6750 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000178', 3, ST_GeomFromText('POLYGON((6900 300, 7000 300, 7000 400, 6900 400, 6900 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000179', 3, ST_GeomFromText('POLYGON((7050 300, 7150 300, 7150 400, 7050 400, 7050 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000180', 3, ST_GeomFromText('POLYGON((7200 300, 7300 300, 7300 400, 7200 400, 7200 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000181', 3, ST_GeomFromText('POLYGON((7350 300, 7450 300, 7450 400, 7350 400, 7350 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000182', 3, ST_GeomFromText('POLYGON((7500 300, 7600 300, 7600 400, 7500 400, 7500 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000183', 3, ST_GeomFromText('POLYGON((7650 300, 7750 300, 7750 400, 7650 400, 7650 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000184', 3, ST_GeomFromText('POLYGON((7800 300, 7900 300, 7900 400, 7800 400, 7800 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000185', 3, ST_GeomFromText('POLYGON((7950 300, 8050 300, 8050 400, 7950 400, 7950 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000186', 3, ST_GeomFromText('POLYGON((8100 300, 8200 300, 8200 400, 8100 400, 8100 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000187', 3, ST_GeomFromText('POLYGON((8250 300, 8350 300, 8350 400, 8250 400, 8250 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000188', 3, ST_GeomFromText('POLYGON((8400 300, 8500 300, 8500 400, 8400 400, 8400 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000189', 3, ST_GeomFromText('POLYGON((8550 300, 8650 300, 8650 400, 8550 400, 8550 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000190', 3, ST_GeomFromText('POLYGON((8700 300, 8800 300, 8800 400, 8700 400, 8700 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000191', 3, ST_GeomFromText('POLYGON((8850 300, 8950 300, 8950 400, 8850 400, 8850 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000192', 3, ST_GeomFromText('POLYGON((9000 300, 9100 300, 9100 400, 9000 400, 9000 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000193', 3, ST_GeomFromText('POLYGON((9150 300, 9250 300, 9250 400, 9150 400, 9150 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000194', 3, ST_GeomFromText('POLYGON((9300 300, 9400 300, 9400 400, 9300 400, 9300 300))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000195', 3, ST_GeomFromText('POLYGON((9450 300, 9550 300, 9550 400, 9450 400, 9450 300))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000196', 3, ST_GeomFromText('POLYGON((9600 300, 9700 300, 9700 400, 9600 400, 9600 300))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000197', 3, ST_GeomFromText('POLYGON((9750 300, 9850 300, 9850 400, 9750 400, 9750 300))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000198', 3, ST_GeomFromText('POLYGON((0 450, 100 450, 100 550, 0 550, 0 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000199', 3, ST_GeomFromText('POLYGON((150 450, 250 450, 250 550, 150 550, 150 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000200', 3, ST_GeomFromText('POLYGON((300 450, 400 450, 400 550, 300 550, 300 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000201', 3, ST_GeomFromText('POLYGON((450 450, 550 450, 550 550, 450 550, 450 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000202', 3, ST_GeomFromText('POLYGON((600 450, 700 450, 700 550, 600 550, 600 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000203', 3, ST_GeomFromText('POLYGON((750 450, 850 450, 850 550, 750 550, 750 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000204', 3, ST_GeomFromText('POLYGON((900 450, 1000 450, 1000 550, 900 550, 900 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000205', 3, ST_GeomFromText('POLYGON((1050 450, 1150 450, 1150 550, 1050 550, 1050 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000206', 3, ST_GeomFromText('POLYGON((1200 450, 1300 450, 1300 550, 1200 550, 1200 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000207', 3, ST_GeomFromText('POLYGON((1350 450, 1450 450, 1450 550, 1350 550, 1350 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000208', 3, ST_GeomFromText('POLYGON((1500 450, 1600 450, 1600 550, 1500 550, 1500 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000209', 3, ST_GeomFromText('POLYGON((1650 450, 1750 450, 1750 550, 1650 550, 1650 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000210', 3, ST_GeomFromText('POLYGON((1800 450, 1900 450, 1900 550, 1800 550, 1800 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000211', 3, ST_GeomFromText('POLYGON((1950 450, 2050 450, 2050 550, 1950 550, 1950 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000212', 3, ST_GeomFromText('POLYGON((2100 450, 2200 450, 2200 550, 2100 550, 2100 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000213', 3, ST_GeomFromText('POLYGON((2250 450, 2350 450, 2350 550, 2250 550, 2250 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000214', 3, ST_GeomFromText('POLYGON((2400 450, 2500 450, 2500 550, 2400 550, 2400 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000215', 3, ST_GeomFromText('POLYGON((2550 450, 2650 450, 2650 550, 2550 550, 2550 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000216', 3, ST_GeomFromText('POLYGON((2700 450, 2800 450, 2800 550, 2700 550, 2700 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000217', 3, ST_GeomFromText('POLYGON((2850 450, 2950 450, 2950 550, 2850 550, 2850 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000218', 3, ST_GeomFromText('POLYGON((3000 450, 3100 450, 3100 550, 3000 550, 3000 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000219', 3, ST_GeomFromText('POLYGON((3150 450, 3250 450, 3250 550, 3150 550, 3150 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000220', 3, ST_GeomFromText('POLYGON((3300 450, 3400 450, 3400 550, 3300 550, 3300 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000221', 3, ST_GeomFromText('POLYGON((3450 450, 3550 450, 3550 550, 3450 550, 3450 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000222', 3, ST_GeomFromText('POLYGON((3600 450, 3700 450, 3700 550, 3600 550, 3600 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000223', 3, ST_GeomFromText('POLYGON((3750 450, 3850 450, 3850 550, 3750 550, 3750 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000224', 3, ST_GeomFromText('POLYGON((3900 450, 4000 450, 4000 550, 3900 550, 3900 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000225', 3, ST_GeomFromText('POLYGON((4050 450, 4150 450, 4150 550, 4050 550, 4050 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000226', 3, ST_GeomFromText('POLYGON((4200 450, 4300 450, 4300 550, 4200 550, 4200 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000227', 3, ST_GeomFromText('POLYGON((4350 450, 4450 450, 4450 550, 4350 550, 4350 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000228', 3, ST_GeomFromText('POLYGON((4500 450, 4600 450, 4600 550, 4500 550, 4500 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000229', 3, ST_GeomFromText('POLYGON((4650 450, 4750 450, 4750 550, 4650 550, 4650 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000230', 3, ST_GeomFromText('POLYGON((4800 450, 4900 450, 4900 550, 4800 550, 4800 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000231', 3, ST_GeomFromText('POLYGON((4950 450, 5050 450, 5050 550, 4950 550, 4950 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000232', 3, ST_GeomFromText('POLYGON((5100 450, 5200 450, 5200 550, 5100 550, 5100 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000233', 3, ST_GeomFromText('POLYGON((5250 450, 5350 450, 5350 550, 5250 550, 5250 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000234', 3, ST_GeomFromText('POLYGON((5400 450, 5500 450, 5500 550, 5400 550, 5400 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000235', 3, ST_GeomFromText('POLYGON((5550 450, 5650 450, 5650 550, 5550 550, 5550 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000236', 3, ST_GeomFromText('POLYGON((5700 450, 5800 450, 5800 550, 5700 550, 5700 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000237', 3, ST_GeomFromText('POLYGON((5850 450, 5950 450, 5950 550, 5850 550, 5850 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000238', 3, ST_GeomFromText('POLYGON((6000 450, 6100 450, 6100 550, 6000 550, 6000 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000239', 3, ST_GeomFromText('POLYGON((6150 450, 6250 450, 6250 550, 6150 550, 6150 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000240', 3, ST_GeomFromText('POLYGON((6300 450, 6400 450, 6400 550, 6300 550, 6300 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000241', 3, ST_GeomFromText('POLYGON((6450 450, 6550 450, 6550 550, 6450 550, 6450 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000242', 3, ST_GeomFromText('POLYGON((6600 450, 6700 450, 6700 550, 6600 550, 6600 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000243', 3, ST_GeomFromText('POLYGON((6750 450, 6850 450, 6850 550, 6750 550, 6750 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000244', 3, ST_GeomFromText('POLYGON((6900 450, 7000 450, 7000 550, 6900 550, 6900 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000245', 3, ST_GeomFromText('POLYGON((7050 450, 7150 450, 7150 550, 7050 550, 7050 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000246', 3, ST_GeomFromText('POLYGON((7200 450, 7300 450, 7300 550, 7200 550, 7200 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000247', 3, ST_GeomFromText('POLYGON((7350 450, 7450 450, 7450 550, 7350 550, 7350 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000248', 3, ST_GeomFromText('POLYGON((7500 450, 7600 450, 7600 550, 7500 550, 7500 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000249', 3, ST_GeomFromText('POLYGON((7650 450, 7750 450, 7750 550, 7650 550, 7650 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000250', 3, ST_GeomFromText('POLYGON((7800 450, 7900 450, 7900 550, 7800 550, 7800 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000251', 3, ST_GeomFromText('POLYGON((7950 450, 8050 450, 8050 550, 7950 550, 7950 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000252', 3, ST_GeomFromText('POLYGON((8100 450, 8200 450, 8200 550, 8100 550, 8100 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000253', 3, ST_GeomFromText('POLYGON((8250 450, 8350 450, 8350 550, 8250 550, 8250 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000254', 3, ST_GeomFromText('POLYGON((8400 450, 8500 450, 8500 550, 8400 550, 8400 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000255', 3, ST_GeomFromText('POLYGON((8550 450, 8650 450, 8650 550, 8550 550, 8550 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000256', 3, ST_GeomFromText('POLYGON((8700 450, 8800 450, 8800 550, 8700 550, 8700 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000257', 3, ST_GeomFromText('POLYGON((8850 450, 8950 450, 8950 550, 8850 550, 8850 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000258', 3, ST_GeomFromText('POLYGON((9000 450, 9100 450, 9100 550, 9000 550, 9000 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000259', 3, ST_GeomFromText('POLYGON((9150 450, 9250 450, 9250 550, 9150 550, 9150 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000260', 3, ST_GeomFromText('POLYGON((9300 450, 9400 450, 9400 550, 9300 550, 9300 450))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000261', 3, ST_GeomFromText('POLYGON((9450 450, 9550 450, 9550 550, 9450 550, 9450 450))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000262', 3, ST_GeomFromText('POLYGON((9600 450, 9700 450, 9700 550, 9600 550, 9600 450))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000263', 3, ST_GeomFromText('POLYGON((9750 450, 9850 450, 9850 550, 9750 550, 9750 450))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000264', 3, ST_GeomFromText('POLYGON((0 600, 100 600, 100 700, 0 700, 0 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000265', 3, ST_GeomFromText('POLYGON((150 600, 250 600, 250 700, 150 700, 150 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000266', 3, ST_GeomFromText('POLYGON((300 600, 400 600, 400 700, 300 700, 300 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000267', 3, ST_GeomFromText('POLYGON((450 600, 550 600, 550 700, 450 700, 450 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000268', 3, ST_GeomFromText('POLYGON((600 600, 700 600, 700 700, 600 700, 600 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000269', 3, ST_GeomFromText('POLYGON((750 600, 850 600, 850 700, 750 700, 750 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000270', 3, ST_GeomFromText('POLYGON((900 600, 1000 600, 1000 700, 900 700, 900 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000271', 3, ST_GeomFromText('POLYGON((1050 600, 1150 600, 1150 700, 1050 700, 1050 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000272', 3, ST_GeomFromText('POLYGON((1200 600, 1300 600, 1300 700, 1200 700, 1200 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000273', 3, ST_GeomFromText('POLYGON((1350 600, 1450 600, 1450 700, 1350 700, 1350 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000274', 3, ST_GeomFromText('POLYGON((1500 600, 1600 600, 1600 700, 1500 700, 1500 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000275', 3, ST_GeomFromText('POLYGON((1650 600, 1750 600, 1750 700, 1650 700, 1650 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000276', 3, ST_GeomFromText('POLYGON((1800 600, 1900 600, 1900 700, 1800 700, 1800 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000277', 3, ST_GeomFromText('POLYGON((1950 600, 2050 600, 2050 700, 1950 700, 1950 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000278', 3, ST_GeomFromText('POLYGON((2100 600, 2200 600, 2200 700, 2100 700, 2100 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000279', 3, ST_GeomFromText('POLYGON((2250 600, 2350 600, 2350 700, 2250 700, 2250 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000280', 3, ST_GeomFromText('POLYGON((2400 600, 2500 600, 2500 700, 2400 700, 2400 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000281', 3, ST_GeomFromText('POLYGON((2550 600, 2650 600, 2650 700, 2550 700, 2550 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000282', 3, ST_GeomFromText('POLYGON((2700 600, 2800 600, 2800 700, 2700 700, 2700 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000283', 3, ST_GeomFromText('POLYGON((2850 600, 2950 600, 2950 700, 2850 700, 2850 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000284', 3, ST_GeomFromText('POLYGON((3000 600, 3100 600, 3100 700, 3000 700, 3000 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000285', 3, ST_GeomFromText('POLYGON((3150 600, 3250 600, 3250 700, 3150 700, 3150 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000286', 3, ST_GeomFromText('POLYGON((3300 600, 3400 600, 3400 700, 3300 700, 3300 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000287', 3, ST_GeomFromText('POLYGON((3450 600, 3550 600, 3550 700, 3450 700, 3450 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000288', 3, ST_GeomFromText('POLYGON((3600 600, 3700 600, 3700 700, 3600 700, 3600 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000289', 3, ST_GeomFromText('POLYGON((3750 600, 3850 600, 3850 700, 3750 700, 3750 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000290', 3, ST_GeomFromText('POLYGON((3900 600, 4000 600, 4000 700, 3900 700, 3900 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000291', 3, ST_GeomFromText('POLYGON((4050 600, 4150 600, 4150 700, 4050 700, 4050 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000292', 3, ST_GeomFromText('POLYGON((4200 600, 4300 600, 4300 700, 4200 700, 4200 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000293', 3, ST_GeomFromText('POLYGON((4350 600, 4450 600, 4450 700, 4350 700, 4350 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000294', 3, ST_GeomFromText('POLYGON((4500 600, 4600 600, 4600 700, 4500 700, 4500 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000295', 3, ST_GeomFromText('POLYGON((4650 600, 4750 600, 4750 700, 4650 700, 4650 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000296', 3, ST_GeomFromText('POLYGON((4800 600, 4900 600, 4900 700, 4800 700, 4800 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000297', 3, ST_GeomFromText('POLYGON((4950 600, 5050 600, 5050 700, 4950 700, 4950 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000298', 3, ST_GeomFromText('POLYGON((5100 600, 5200 600, 5200 700, 5100 700, 5100 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000299', 3, ST_GeomFromText('POLYGON((5250 600, 5350 600, 5350 700, 5250 700, 5250 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000300', 3, ST_GeomFromText('POLYGON((5400 600, 5500 600, 5500 700, 5400 700, 5400 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000301', 3, ST_GeomFromText('POLYGON((5550 600, 5650 600, 5650 700, 5550 700, 5550 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000302', 3, ST_GeomFromText('POLYGON((5700 600, 5800 600, 5800 700, 5700 700, 5700 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000303', 3, ST_GeomFromText('POLYGON((5850 600, 5950 600, 5950 700, 5850 700, 5850 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000304', 3, ST_GeomFromText('POLYGON((6000 600, 6100 600, 6100 700, 6000 700, 6000 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000305', 3, ST_GeomFromText('POLYGON((6150 600, 6250 600, 6250 700, 6150 700, 6150 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000306', 3, ST_GeomFromText('POLYGON((6300 600, 6400 600, 6400 700, 6300 700, 6300 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000307', 3, ST_GeomFromText('POLYGON((6450 600, 6550 600, 6550 700, 6450 700, 6450 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000308', 3, ST_GeomFromText('POLYGON((6600 600, 6700 600, 6700 700, 6600 700, 6600 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000309', 3, ST_GeomFromText('POLYGON((6750 600, 6850 600, 6850 700, 6750 700, 6750 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000310', 3, ST_GeomFromText('POLYGON((6900 600, 7000 600, 7000 700, 6900 700, 6900 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000311', 3, ST_GeomFromText('POLYGON((7050 600, 7150 600, 7150 700, 7050 700, 7050 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000312', 3, ST_GeomFromText('POLYGON((7200 600, 7300 600, 7300 700, 7200 700, 7200 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000313', 3, ST_GeomFromText('POLYGON((7350 600, 7450 600, 7450 700, 7350 700, 7350 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000314', 3, ST_GeomFromText('POLYGON((7500 600, 7600 600, 7600 700, 7500 700, 7500 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000315', 3, ST_GeomFromText('POLYGON((7650 600, 7750 600, 7750 700, 7650 700, 7650 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000316', 3, ST_GeomFromText('POLYGON((7800 600, 7900 600, 7900 700, 7800 700, 7800 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000317', 3, ST_GeomFromText('POLYGON((7950 600, 8050 600, 8050 700, 7950 700, 7950 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000318', 3, ST_GeomFromText('POLYGON((8100 600, 8200 600, 8200 700, 8100 700, 8100 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000319', 3, ST_GeomFromText('POLYGON((8250 600, 8350 600, 8350 700, 8250 700, 8250 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000320', 3, ST_GeomFromText('POLYGON((8400 600, 8500 600, 8500 700, 8400 700, 8400 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000321', 3, ST_GeomFromText('POLYGON((8550 600, 8650 600, 8650 700, 8550 700, 8550 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000322', 3, ST_GeomFromText('POLYGON((8700 600, 8800 600, 8800 700, 8700 700, 8700 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000323', 3, ST_GeomFromText('POLYGON((8850 600, 8950 600, 8950 700, 8850 700, 8850 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000324', 3, ST_GeomFromText('POLYGON((9000 600, 9100 600, 9100 700, 9000 700, 9000 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000325', 3, ST_GeomFromText('POLYGON((9150 600, 9250 600, 9250 700, 9150 700, 9150 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000326', 3, ST_GeomFromText('POLYGON((9300 600, 9400 600, 9400 700, 9300 700, 9300 600))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000327', 3, ST_GeomFromText('POLYGON((9450 600, 9550 600, 9550 700, 9450 700, 9450 600))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000328', 3, ST_GeomFromText('POLYGON((9600 600, 9700 600, 9700 700, 9600 700, 9600 600))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000329', 3, ST_GeomFromText('POLYGON((9750 600, 9850 600, 9850 700, 9750 700, 9750 600))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000330', 3, ST_GeomFromText('POLYGON((0 750, 100 750, 100 850, 0 850, 0 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000331', 3, ST_GeomFromText('POLYGON((150 750, 250 750, 250 850, 150 850, 150 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000332', 3, ST_GeomFromText('POLYGON((300 750, 400 750, 400 850, 300 850, 300 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000333', 3, ST_GeomFromText('POLYGON((450 750, 550 750, 550 850, 450 850, 450 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000334', 3, ST_GeomFromText('POLYGON((600 750, 700 750, 700 850, 600 850, 600 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000335', 3, ST_GeomFromText('POLYGON((750 750, 850 750, 850 850, 750 850, 750 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000336', 3, ST_GeomFromText('POLYGON((900 750, 1000 750, 1000 850, 900 850, 900 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000337', 3, ST_GeomFromText('POLYGON((1050 750, 1150 750, 1150 850, 1050 850, 1050 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000338', 3, ST_GeomFromText('POLYGON((1200 750, 1300 750, 1300 850, 1200 850, 1200 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000339', 3, ST_GeomFromText('POLYGON((1350 750, 1450 750, 1450 850, 1350 850, 1350 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000340', 3, ST_GeomFromText('POLYGON((1500 750, 1600 750, 1600 850, 1500 850, 1500 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000341', 3, ST_GeomFromText('POLYGON((1650 750, 1750 750, 1750 850, 1650 850, 1650 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000342', 3, ST_GeomFromText('POLYGON((1800 750, 1900 750, 1900 850, 1800 850, 1800 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000343', 3, ST_GeomFromText('POLYGON((1950 750, 2050 750, 2050 850, 1950 850, 1950 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000344', 3, ST_GeomFromText('POLYGON((2100 750, 2200 750, 2200 850, 2100 850, 2100 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000345', 3, ST_GeomFromText('POLYGON((2250 750, 2350 750, 2350 850, 2250 850, 2250 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000346', 3, ST_GeomFromText('POLYGON((2400 750, 2500 750, 2500 850, 2400 850, 2400 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000347', 3, ST_GeomFromText('POLYGON((2550 750, 2650 750, 2650 850, 2550 850, 2550 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000348', 3, ST_GeomFromText('POLYGON((2700 750, 2800 750, 2800 850, 2700 850, 2700 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000349', 3, ST_GeomFromText('POLYGON((2850 750, 2950 750, 2950 850, 2850 850, 2850 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000350', 3, ST_GeomFromText('POLYGON((3000 750, 3100 750, 3100 850, 3000 850, 3000 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000351', 3, ST_GeomFromText('POLYGON((3150 750, 3250 750, 3250 850, 3150 850, 3150 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000352', 3, ST_GeomFromText('POLYGON((3300 750, 3400 750, 3400 850, 3300 850, 3300 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000353', 3, ST_GeomFromText('POLYGON((3450 750, 3550 750, 3550 850, 3450 850, 3450 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000354', 3, ST_GeomFromText('POLYGON((3600 750, 3700 750, 3700 850, 3600 850, 3600 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000355', 3, ST_GeomFromText('POLYGON((3750 750, 3850 750, 3850 850, 3750 850, 3750 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000356', 3, ST_GeomFromText('POLYGON((3900 750, 4000 750, 4000 850, 3900 850, 3900 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000357', 3, ST_GeomFromText('POLYGON((4050 750, 4150 750, 4150 850, 4050 850, 4050 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000358', 3, ST_GeomFromText('POLYGON((4200 750, 4300 750, 4300 850, 4200 850, 4200 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000359', 3, ST_GeomFromText('POLYGON((4350 750, 4450 750, 4450 850, 4350 850, 4350 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000360', 3, ST_GeomFromText('POLYGON((4500 750, 4600 750, 4600 850, 4500 850, 4500 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000361', 3, ST_GeomFromText('POLYGON((4650 750, 4750 750, 4750 850, 4650 850, 4650 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000362', 3, ST_GeomFromText('POLYGON((4800 750, 4900 750, 4900 850, 4800 850, 4800 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000363', 3, ST_GeomFromText('POLYGON((4950 750, 5050 750, 5050 850, 4950 850, 4950 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000364', 3, ST_GeomFromText('POLYGON((5100 750, 5200 750, 5200 850, 5100 850, 5100 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000365', 3, ST_GeomFromText('POLYGON((5250 750, 5350 750, 5350 850, 5250 850, 5250 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000366', 3, ST_GeomFromText('POLYGON((5400 750, 5500 750, 5500 850, 5400 850, 5400 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000367', 3, ST_GeomFromText('POLYGON((5550 750, 5650 750, 5650 850, 5550 850, 5550 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000368', 3, ST_GeomFromText('POLYGON((5700 750, 5800 750, 5800 850, 5700 850, 5700 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000369', 3, ST_GeomFromText('POLYGON((5850 750, 5950 750, 5950 850, 5850 850, 5850 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000370', 3, ST_GeomFromText('POLYGON((6000 750, 6100 750, 6100 850, 6000 850, 6000 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000371', 3, ST_GeomFromText('POLYGON((6150 750, 6250 750, 6250 850, 6150 850, 6150 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000372', 3, ST_GeomFromText('POLYGON((6300 750, 6400 750, 6400 850, 6300 850, 6300 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000373', 3, ST_GeomFromText('POLYGON((6450 750, 6550 750, 6550 850, 6450 850, 6450 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000374', 3, ST_GeomFromText('POLYGON((6600 750, 6700 750, 6700 850, 6600 850, 6600 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000375', 3, ST_GeomFromText('POLYGON((6750 750, 6850 750, 6850 850, 6750 850, 6750 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000376', 3, ST_GeomFromText('POLYGON((6900 750, 7000 750, 7000 850, 6900 850, 6900 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000377', 3, ST_GeomFromText('POLYGON((7050 750, 7150 750, 7150 850, 7050 850, 7050 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000378', 3, ST_GeomFromText('POLYGON((7200 750, 7300 750, 7300 850, 7200 850, 7200 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000379', 3, ST_GeomFromText('POLYGON((7350 750, 7450 750, 7450 850, 7350 850, 7350 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000380', 3, ST_GeomFromText('POLYGON((7500 750, 7600 750, 7600 850, 7500 850, 7500 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000381', 3, ST_GeomFromText('POLYGON((7650 750, 7750 750, 7750 850, 7650 850, 7650 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000382', 3, ST_GeomFromText('POLYGON((7800 750, 7900 750, 7900 850, 7800 850, 7800 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000383', 3, ST_GeomFromText('POLYGON((7950 750, 8050 750, 8050 850, 7950 850, 7950 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000384', 3, ST_GeomFromText('POLYGON((8100 750, 8200 750, 8200 850, 8100 850, 8100 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000385', 3, ST_GeomFromText('POLYGON((8250 750, 8350 750, 8350 850, 8250 850, 8250 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000386', 3, ST_GeomFromText('POLYGON((8400 750, 8500 750, 8500 850, 8400 850, 8400 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000387', 3, ST_GeomFromText('POLYGON((8550 750, 8650 750, 8650 850, 8550 850, 8550 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000388', 3, ST_GeomFromText('POLYGON((8700 750, 8800 750, 8800 850, 8700 850, 8700 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000389', 3, ST_GeomFromText('POLYGON((8850 750, 8950 750, 8950 850, 8850 850, 8850 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000390', 3, ST_GeomFromText('POLYGON((9000 750, 9100 750, 9100 850, 9000 850, 9000 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000391', 3, ST_GeomFromText('POLYGON((9150 750, 9250 750, 9250 850, 9150 850, 9150 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000392', 3, ST_GeomFromText('POLYGON((9300 750, 9400 750, 9400 850, 9300 850, 9300 750))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000393', 3, ST_GeomFromText('POLYGON((9450 750, 9550 750, 9550 850, 9450 850, 9450 750))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000394', 3, ST_GeomFromText('POLYGON((9600 750, 9700 750, 9700 850, 9600 850, 9600 750))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000395', 3, ST_GeomFromText('POLYGON((9750 750, 9850 750, 9850 850, 9750 850, 9750 750))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000396', 3, ST_GeomFromText('POLYGON((0 900, 100 900, 100 1000, 0 1000, 0 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000397', 3, ST_GeomFromText('POLYGON((150 900, 250 900, 250 1000, 150 1000, 150 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000398', 3, ST_GeomFromText('POLYGON((300 900, 400 900, 400 1000, 300 1000, 300 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000399', 3, ST_GeomFromText('POLYGON((450 900, 550 900, 550 1000, 450 1000, 450 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000400', 3, ST_GeomFromText('POLYGON((600 900, 700 900, 700 1000, 600 1000, 600 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000401', 3, ST_GeomFromText('POLYGON((750 900, 850 900, 850 1000, 750 1000, 750 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000402', 3, ST_GeomFromText('POLYGON((900 900, 1000 900, 1000 1000, 900 1000, 900 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000403', 3, ST_GeomFromText('POLYGON((1050 900, 1150 900, 1150 1000, 1050 1000, 1050 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000404', 3, ST_GeomFromText('POLYGON((1200 900, 1300 900, 1300 1000, 1200 1000, 1200 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000405', 3, ST_GeomFromText('POLYGON((1350 900, 1450 900, 1450 1000, 1350 1000, 1350 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000406', 3, ST_GeomFromText('POLYGON((1500 900, 1600 900, 1600 1000, 1500 1000, 1500 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000407', 3, ST_GeomFromText('POLYGON((1650 900, 1750 900, 1750 1000, 1650 1000, 1650 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000408', 3, ST_GeomFromText('POLYGON((1800 900, 1900 900, 1900 1000, 1800 1000, 1800 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000409', 3, ST_GeomFromText('POLYGON((1950 900, 2050 900, 2050 1000, 1950 1000, 1950 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000410', 3, ST_GeomFromText('POLYGON((2100 900, 2200 900, 2200 1000, 2100 1000, 2100 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000411', 3, ST_GeomFromText('POLYGON((2250 900, 2350 900, 2350 1000, 2250 1000, 2250 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000412', 3, ST_GeomFromText('POLYGON((2400 900, 2500 900, 2500 1000, 2400 1000, 2400 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000413', 3, ST_GeomFromText('POLYGON((2550 900, 2650 900, 2650 1000, 2550 1000, 2550 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000414', 3, ST_GeomFromText('POLYGON((2700 900, 2800 900, 2800 1000, 2700 1000, 2700 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000415', 3, ST_GeomFromText('POLYGON((2850 900, 2950 900, 2950 1000, 2850 1000, 2850 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000416', 3, ST_GeomFromText('POLYGON((3000 900, 3100 900, 3100 1000, 3000 1000, 3000 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000417', 3, ST_GeomFromText('POLYGON((3150 900, 3250 900, 3250 1000, 3150 1000, 3150 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000418', 3, ST_GeomFromText('POLYGON((3300 900, 3400 900, 3400 1000, 3300 1000, 3300 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000419', 3, ST_GeomFromText('POLYGON((3450 900, 3550 900, 3550 1000, 3450 1000, 3450 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000420', 3, ST_GeomFromText('POLYGON((3600 900, 3700 900, 3700 1000, 3600 1000, 3600 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000421', 3, ST_GeomFromText('POLYGON((3750 900, 3850 900, 3850 1000, 3750 1000, 3750 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000422', 3, ST_GeomFromText('POLYGON((3900 900, 4000 900, 4000 1000, 3900 1000, 3900 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000423', 3, ST_GeomFromText('POLYGON((4050 900, 4150 900, 4150 1000, 4050 1000, 4050 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000424', 3, ST_GeomFromText('POLYGON((4200 900, 4300 900, 4300 1000, 4200 1000, 4200 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000425', 3, ST_GeomFromText('POLYGON((4350 900, 4450 900, 4450 1000, 4350 1000, 4350 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000426', 3, ST_GeomFromText('POLYGON((4500 900, 4600 900, 4600 1000, 4500 1000, 4500 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000427', 3, ST_GeomFromText('POLYGON((4650 900, 4750 900, 4750 1000, 4650 1000, 4650 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000428', 3, ST_GeomFromText('POLYGON((4800 900, 4900 900, 4900 1000, 4800 1000, 4800 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000429', 3, ST_GeomFromText('POLYGON((4950 900, 5050 900, 5050 1000, 4950 1000, 4950 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000430', 3, ST_GeomFromText('POLYGON((5100 900, 5200 900, 5200 1000, 5100 1000, 5100 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000431', 3, ST_GeomFromText('POLYGON((5250 900, 5350 900, 5350 1000, 5250 1000, 5250 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000432', 3, ST_GeomFromText('POLYGON((5400 900, 5500 900, 5500 1000, 5400 1000, 5400 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000433', 3, ST_GeomFromText('POLYGON((5550 900, 5650 900, 5650 1000, 5550 1000, 5550 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000434', 3, ST_GeomFromText('POLYGON((5700 900, 5800 900, 5800 1000, 5700 1000, 5700 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000435', 3, ST_GeomFromText('POLYGON((5850 900, 5950 900, 5950 1000, 5850 1000, 5850 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000436', 3, ST_GeomFromText('POLYGON((6000 900, 6100 900, 6100 1000, 6000 1000, 6000 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000437', 3, ST_GeomFromText('POLYGON((6150 900, 6250 900, 6250 1000, 6150 1000, 6150 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000438', 3, ST_GeomFromText('POLYGON((6300 900, 6400 900, 6400 1000, 6300 1000, 6300 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000439', 3, ST_GeomFromText('POLYGON((6450 900, 6550 900, 6550 1000, 6450 1000, 6450 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000440', 3, ST_GeomFromText('POLYGON((6600 900, 6700 900, 6700 1000, 6600 1000, 6600 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000441', 3, ST_GeomFromText('POLYGON((6750 900, 6850 900, 6850 1000, 6750 1000, 6750 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000442', 3, ST_GeomFromText('POLYGON((6900 900, 7000 900, 7000 1000, 6900 1000, 6900 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000443', 3, ST_GeomFromText('POLYGON((7050 900, 7150 900, 7150 1000, 7050 1000, 7050 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000444', 3, ST_GeomFromText('POLYGON((7200 900, 7300 900, 7300 1000, 7200 1000, 7200 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000445', 3, ST_GeomFromText('POLYGON((7350 900, 7450 900, 7450 1000, 7350 1000, 7350 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000446', 3, ST_GeomFromText('POLYGON((7500 900, 7600 900, 7600 1000, 7500 1000, 7500 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000447', 3, ST_GeomFromText('POLYGON((7650 900, 7750 900, 7750 1000, 7650 1000, 7650 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000448', 3, ST_GeomFromText('POLYGON((7800 900, 7900 900, 7900 1000, 7800 1000, 7800 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000449', 3, ST_GeomFromText('POLYGON((7950 900, 8050 900, 8050 1000, 7950 1000, 7950 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000450', 3, ST_GeomFromText('POLYGON((8100 900, 8200 900, 8200 1000, 8100 1000, 8100 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000451', 3, ST_GeomFromText('POLYGON((8250 900, 8350 900, 8350 1000, 8250 1000, 8250 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000452', 3, ST_GeomFromText('POLYGON((8400 900, 8500 900, 8500 1000, 8400 1000, 8400 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000453', 3, ST_GeomFromText('POLYGON((8550 900, 8650 900, 8650 1000, 8550 1000, 8550 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000454', 3, ST_GeomFromText('POLYGON((8700 900, 8800 900, 8800 1000, 8700 1000, 8700 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000455', 3, ST_GeomFromText('POLYGON((8850 900, 8950 900, 8950 1000, 8850 1000, 8850 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000456', 3, ST_GeomFromText('POLYGON((9000 900, 9100 900, 9100 1000, 9000 1000, 9000 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000457', 3, ST_GeomFromText('POLYGON((9150 900, 9250 900, 9250 1000, 9150 1000, 9150 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000458', 3, ST_GeomFromText('POLYGON((9300 900, 9400 900, 9400 1000, 9300 1000, 9300 900))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000459', 3, ST_GeomFromText('POLYGON((9450 900, 9550 900, 9550 1000, 9450 1000, 9450 900))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000460', 3, ST_GeomFromText('POLYGON((9600 900, 9700 900, 9700 1000, 9600 1000, 9600 900))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000461', 3, ST_GeomFromText('POLYGON((9750 900, 9850 900, 9850 1000, 9750 1000, 9750 900))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000462', 3, ST_GeomFromText('POLYGON((0 1050, 100 1050, 100 1150, 0 1150, 0 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000463', 3, ST_GeomFromText('POLYGON((150 1050, 250 1050, 250 1150, 150 1150, 150 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000464', 3, ST_GeomFromText('POLYGON((300 1050, 400 1050, 400 1150, 300 1150, 300 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000465', 3, ST_GeomFromText('POLYGON((450 1050, 550 1050, 550 1150, 450 1150, 450 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000466', 3, ST_GeomFromText('POLYGON((600 1050, 700 1050, 700 1150, 600 1150, 600 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000467', 3, ST_GeomFromText('POLYGON((750 1050, 850 1050, 850 1150, 750 1150, 750 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000468', 3, ST_GeomFromText('POLYGON((900 1050, 1000 1050, 1000 1150, 900 1150, 900 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000469', 3, ST_GeomFromText('POLYGON((1050 1050, 1150 1050, 1150 1150, 1050 1150, 1050 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000470', 3, ST_GeomFromText('POLYGON((1200 1050, 1300 1050, 1300 1150, 1200 1150, 1200 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000471', 3, ST_GeomFromText('POLYGON((1350 1050, 1450 1050, 1450 1150, 1350 1150, 1350 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000472', 3, ST_GeomFromText('POLYGON((1500 1050, 1600 1050, 1600 1150, 1500 1150, 1500 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000473', 3, ST_GeomFromText('POLYGON((1650 1050, 1750 1050, 1750 1150, 1650 1150, 1650 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000474', 3, ST_GeomFromText('POLYGON((1800 1050, 1900 1050, 1900 1150, 1800 1150, 1800 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000475', 3, ST_GeomFromText('POLYGON((1950 1050, 2050 1050, 2050 1150, 1950 1150, 1950 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000476', 3, ST_GeomFromText('POLYGON((2100 1050, 2200 1050, 2200 1150, 2100 1150, 2100 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000477', 3, ST_GeomFromText('POLYGON((2250 1050, 2350 1050, 2350 1150, 2250 1150, 2250 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000478', 3, ST_GeomFromText('POLYGON((2400 1050, 2500 1050, 2500 1150, 2400 1150, 2400 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000479', 3, ST_GeomFromText('POLYGON((2550 1050, 2650 1050, 2650 1150, 2550 1150, 2550 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000480', 3, ST_GeomFromText('POLYGON((2700 1050, 2800 1050, 2800 1150, 2700 1150, 2700 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000481', 3, ST_GeomFromText('POLYGON((2850 1050, 2950 1050, 2950 1150, 2850 1150, 2850 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000482', 3, ST_GeomFromText('POLYGON((3000 1050, 3100 1050, 3100 1150, 3000 1150, 3000 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000483', 3, ST_GeomFromText('POLYGON((3150 1050, 3250 1050, 3250 1150, 3150 1150, 3150 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000484', 3, ST_GeomFromText('POLYGON((3300 1050, 3400 1050, 3400 1150, 3300 1150, 3300 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000485', 3, ST_GeomFromText('POLYGON((3450 1050, 3550 1050, 3550 1150, 3450 1150, 3450 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000486', 3, ST_GeomFromText('POLYGON((3600 1050, 3700 1050, 3700 1150, 3600 1150, 3600 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000487', 3, ST_GeomFromText('POLYGON((3750 1050, 3850 1050, 3850 1150, 3750 1150, 3750 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000488', 3, ST_GeomFromText('POLYGON((3900 1050, 4000 1050, 4000 1150, 3900 1150, 3900 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000489', 3, ST_GeomFromText('POLYGON((4050 1050, 4150 1050, 4150 1150, 4050 1150, 4050 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000490', 3, ST_GeomFromText('POLYGON((4200 1050, 4300 1050, 4300 1150, 4200 1150, 4200 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000491', 3, ST_GeomFromText('POLYGON((4350 1050, 4450 1050, 4450 1150, 4350 1150, 4350 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000492', 3, ST_GeomFromText('POLYGON((4500 1050, 4600 1050, 4600 1150, 4500 1150, 4500 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000493', 3, ST_GeomFromText('POLYGON((4650 1050, 4750 1050, 4750 1150, 4650 1150, 4650 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000494', 3, ST_GeomFromText('POLYGON((4800 1050, 4900 1050, 4900 1150, 4800 1150, 4800 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000495', 3, ST_GeomFromText('POLYGON((4950 1050, 5050 1050, 5050 1150, 4950 1150, 4950 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000496', 3, ST_GeomFromText('POLYGON((5100 1050, 5200 1050, 5200 1150, 5100 1150, 5100 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000497', 3, ST_GeomFromText('POLYGON((5250 1050, 5350 1050, 5350 1150, 5250 1150, 5250 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000498', 3, ST_GeomFromText('POLYGON((5400 1050, 5500 1050, 5500 1150, 5400 1150, 5400 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000499', 3, ST_GeomFromText('POLYGON((5550 1050, 5650 1050, 5650 1150, 5550 1150, 5550 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000500', 3, ST_GeomFromText('POLYGON((5700 1050, 5800 1050, 5800 1150, 5700 1150, 5700 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000501', 3, ST_GeomFromText('POLYGON((5850 1050, 5950 1050, 5950 1150, 5850 1150, 5850 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000502', 3, ST_GeomFromText('POLYGON((6000 1050, 6100 1050, 6100 1150, 6000 1150, 6000 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000503', 3, ST_GeomFromText('POLYGON((6150 1050, 6250 1050, 6250 1150, 6150 1150, 6150 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000504', 3, ST_GeomFromText('POLYGON((6300 1050, 6400 1050, 6400 1150, 6300 1150, 6300 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000505', 3, ST_GeomFromText('POLYGON((6450 1050, 6550 1050, 6550 1150, 6450 1150, 6450 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000506', 3, ST_GeomFromText('POLYGON((6600 1050, 6700 1050, 6700 1150, 6600 1150, 6600 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000507', 3, ST_GeomFromText('POLYGON((6750 1050, 6850 1050, 6850 1150, 6750 1150, 6750 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000508', 3, ST_GeomFromText('POLYGON((6900 1050, 7000 1050, 7000 1150, 6900 1150, 6900 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000509', 3, ST_GeomFromText('POLYGON((7050 1050, 7150 1050, 7150 1150, 7050 1150, 7050 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000510', 3, ST_GeomFromText('POLYGON((7200 1050, 7300 1050, 7300 1150, 7200 1150, 7200 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000511', 3, ST_GeomFromText('POLYGON((7350 1050, 7450 1050, 7450 1150, 7350 1150, 7350 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000512', 3, ST_GeomFromText('POLYGON((7500 1050, 7600 1050, 7600 1150, 7500 1150, 7500 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000513', 3, ST_GeomFromText('POLYGON((7650 1050, 7750 1050, 7750 1150, 7650 1150, 7650 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000514', 3, ST_GeomFromText('POLYGON((7800 1050, 7900 1050, 7900 1150, 7800 1150, 7800 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000515', 3, ST_GeomFromText('POLYGON((7950 1050, 8050 1050, 8050 1150, 7950 1150, 7950 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000516', 3, ST_GeomFromText('POLYGON((8100 1050, 8200 1050, 8200 1150, 8100 1150, 8100 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000517', 3, ST_GeomFromText('POLYGON((8250 1050, 8350 1050, 8350 1150, 8250 1150, 8250 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000518', 3, ST_GeomFromText('POLYGON((8400 1050, 8500 1050, 8500 1150, 8400 1150, 8400 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000519', 3, ST_GeomFromText('POLYGON((8550 1050, 8650 1050, 8650 1150, 8550 1150, 8550 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000520', 3, ST_GeomFromText('POLYGON((8700 1050, 8800 1050, 8800 1150, 8700 1150, 8700 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000521', 3, ST_GeomFromText('POLYGON((8850 1050, 8950 1050, 8950 1150, 8850 1150, 8850 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000522', 3, ST_GeomFromText('POLYGON((9000 1050, 9100 1050, 9100 1150, 9000 1150, 9000 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000523', 3, ST_GeomFromText('POLYGON((9150 1050, 9250 1050, 9250 1150, 9150 1150, 9150 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000524', 3, ST_GeomFromText('POLYGON((9300 1050, 9400 1050, 9400 1150, 9300 1150, 9300 1050))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000525', 3, ST_GeomFromText('POLYGON((9450 1050, 9550 1050, 9550 1150, 9450 1150, 9450 1050))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000526', 3, ST_GeomFromText('POLYGON((9600 1050, 9700 1050, 9700 1150, 9600 1150, 9600 1050))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000527', 3, ST_GeomFromText('POLYGON((9750 1050, 9850 1050, 9850 1150, 9750 1150, 9750 1050))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000528', 3, ST_GeomFromText('POLYGON((0 1200, 100 1200, 100 1300, 0 1300, 0 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000529', 3, ST_GeomFromText('POLYGON((150 1200, 250 1200, 250 1300, 150 1300, 150 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000530', 3, ST_GeomFromText('POLYGON((300 1200, 400 1200, 400 1300, 300 1300, 300 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000531', 3, ST_GeomFromText('POLYGON((450 1200, 550 1200, 550 1300, 450 1300, 450 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000532', 3, ST_GeomFromText('POLYGON((600 1200, 700 1200, 700 1300, 600 1300, 600 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000533', 3, ST_GeomFromText('POLYGON((750 1200, 850 1200, 850 1300, 750 1300, 750 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000534', 3, ST_GeomFromText('POLYGON((900 1200, 1000 1200, 1000 1300, 900 1300, 900 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000535', 3, ST_GeomFromText('POLYGON((1050 1200, 1150 1200, 1150 1300, 1050 1300, 1050 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000536', 3, ST_GeomFromText('POLYGON((1200 1200, 1300 1200, 1300 1300, 1200 1300, 1200 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000537', 3, ST_GeomFromText('POLYGON((1350 1200, 1450 1200, 1450 1300, 1350 1300, 1350 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000538', 3, ST_GeomFromText('POLYGON((1500 1200, 1600 1200, 1600 1300, 1500 1300, 1500 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000539', 3, ST_GeomFromText('POLYGON((1650 1200, 1750 1200, 1750 1300, 1650 1300, 1650 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000540', 3, ST_GeomFromText('POLYGON((1800 1200, 1900 1200, 1900 1300, 1800 1300, 1800 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000541', 3, ST_GeomFromText('POLYGON((1950 1200, 2050 1200, 2050 1300, 1950 1300, 1950 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000542', 3, ST_GeomFromText('POLYGON((2100 1200, 2200 1200, 2200 1300, 2100 1300, 2100 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000543', 3, ST_GeomFromText('POLYGON((2250 1200, 2350 1200, 2350 1300, 2250 1300, 2250 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000544', 3, ST_GeomFromText('POLYGON((2400 1200, 2500 1200, 2500 1300, 2400 1300, 2400 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000545', 3, ST_GeomFromText('POLYGON((2550 1200, 2650 1200, 2650 1300, 2550 1300, 2550 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000546', 3, ST_GeomFromText('POLYGON((2700 1200, 2800 1200, 2800 1300, 2700 1300, 2700 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000547', 3, ST_GeomFromText('POLYGON((2850 1200, 2950 1200, 2950 1300, 2850 1300, 2850 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000548', 3, ST_GeomFromText('POLYGON((3000 1200, 3100 1200, 3100 1300, 3000 1300, 3000 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000549', 3, ST_GeomFromText('POLYGON((3150 1200, 3250 1200, 3250 1300, 3150 1300, 3150 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000550', 3, ST_GeomFromText('POLYGON((3300 1200, 3400 1200, 3400 1300, 3300 1300, 3300 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000551', 3, ST_GeomFromText('POLYGON((3450 1200, 3550 1200, 3550 1300, 3450 1300, 3450 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000552', 3, ST_GeomFromText('POLYGON((3600 1200, 3700 1200, 3700 1300, 3600 1300, 3600 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000553', 3, ST_GeomFromText('POLYGON((3750 1200, 3850 1200, 3850 1300, 3750 1300, 3750 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000554', 3, ST_GeomFromText('POLYGON((3900 1200, 4000 1200, 4000 1300, 3900 1300, 3900 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000555', 3, ST_GeomFromText('POLYGON((4050 1200, 4150 1200, 4150 1300, 4050 1300, 4050 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000556', 3, ST_GeomFromText('POLYGON((4200 1200, 4300 1200, 4300 1300, 4200 1300, 4200 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000557', 3, ST_GeomFromText('POLYGON((4350 1200, 4450 1200, 4450 1300, 4350 1300, 4350 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000558', 3, ST_GeomFromText('POLYGON((4500 1200, 4600 1200, 4600 1300, 4500 1300, 4500 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000559', 3, ST_GeomFromText('POLYGON((4650 1200, 4750 1200, 4750 1300, 4650 1300, 4650 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000560', 3, ST_GeomFromText('POLYGON((4800 1200, 4900 1200, 4900 1300, 4800 1300, 4800 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000561', 3, ST_GeomFromText('POLYGON((4950 1200, 5050 1200, 5050 1300, 4950 1300, 4950 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000562', 3, ST_GeomFromText('POLYGON((5100 1200, 5200 1200, 5200 1300, 5100 1300, 5100 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000563', 3, ST_GeomFromText('POLYGON((5250 1200, 5350 1200, 5350 1300, 5250 1300, 5250 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000564', 3, ST_GeomFromText('POLYGON((5400 1200, 5500 1200, 5500 1300, 5400 1300, 5400 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000565', 3, ST_GeomFromText('POLYGON((5550 1200, 5650 1200, 5650 1300, 5550 1300, 5550 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000566', 3, ST_GeomFromText('POLYGON((5700 1200, 5800 1200, 5800 1300, 5700 1300, 5700 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000567', 3, ST_GeomFromText('POLYGON((5850 1200, 5950 1200, 5950 1300, 5850 1300, 5850 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000568', 3, ST_GeomFromText('POLYGON((6000 1200, 6100 1200, 6100 1300, 6000 1300, 6000 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000569', 3, ST_GeomFromText('POLYGON((6150 1200, 6250 1200, 6250 1300, 6150 1300, 6150 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000570', 3, ST_GeomFromText('POLYGON((6300 1200, 6400 1200, 6400 1300, 6300 1300, 6300 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000571', 3, ST_GeomFromText('POLYGON((6450 1200, 6550 1200, 6550 1300, 6450 1300, 6450 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000572', 3, ST_GeomFromText('POLYGON((6600 1200, 6700 1200, 6700 1300, 6600 1300, 6600 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000573', 3, ST_GeomFromText('POLYGON((6750 1200, 6850 1200, 6850 1300, 6750 1300, 6750 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000574', 3, ST_GeomFromText('POLYGON((6900 1200, 7000 1200, 7000 1300, 6900 1300, 6900 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000575', 3, ST_GeomFromText('POLYGON((7050 1200, 7150 1200, 7150 1300, 7050 1300, 7050 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000576', 3, ST_GeomFromText('POLYGON((7200 1200, 7300 1200, 7300 1300, 7200 1300, 7200 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000577', 3, ST_GeomFromText('POLYGON((7350 1200, 7450 1200, 7450 1300, 7350 1300, 7350 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000578', 3, ST_GeomFromText('POLYGON((7500 1200, 7600 1200, 7600 1300, 7500 1300, 7500 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000579', 3, ST_GeomFromText('POLYGON((7650 1200, 7750 1200, 7750 1300, 7650 1300, 7650 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000580', 3, ST_GeomFromText('POLYGON((7800 1200, 7900 1200, 7900 1300, 7800 1300, 7800 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000581', 3, ST_GeomFromText('POLYGON((7950 1200, 8050 1200, 8050 1300, 7950 1300, 7950 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000582', 3, ST_GeomFromText('POLYGON((8100 1200, 8200 1200, 8200 1300, 8100 1300, 8100 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000583', 3, ST_GeomFromText('POLYGON((8250 1200, 8350 1200, 8350 1300, 8250 1300, 8250 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000584', 3, ST_GeomFromText('POLYGON((8400 1200, 8500 1200, 8500 1300, 8400 1300, 8400 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000585', 3, ST_GeomFromText('POLYGON((8550 1200, 8650 1200, 8650 1300, 8550 1300, 8550 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000586', 3, ST_GeomFromText('POLYGON((8700 1200, 8800 1200, 8800 1300, 8700 1300, 8700 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000587', 3, ST_GeomFromText('POLYGON((8850 1200, 8950 1200, 8950 1300, 8850 1300, 8850 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000588', 3, ST_GeomFromText('POLYGON((9000 1200, 9100 1200, 9100 1300, 9000 1300, 9000 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000589', 3, ST_GeomFromText('POLYGON((9150 1200, 9250 1200, 9250 1300, 9150 1300, 9150 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000590', 3, ST_GeomFromText('POLYGON((9300 1200, 9400 1200, 9400 1300, 9300 1300, 9300 1200))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000591', 3, ST_GeomFromText('POLYGON((9450 1200, 9550 1200, 9550 1300, 9450 1300, 9450 1200))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000592', 3, ST_GeomFromText('POLYGON((9600 1200, 9700 1200, 9700 1300, 9600 1300, 9600 1200))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000593', 3, ST_GeomFromText('POLYGON((9750 1200, 9850 1200, 9850 1300, 9750 1300, 9750 1200))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000594', 3, ST_GeomFromText('POLYGON((0 1350, 100 1350, 100 1450, 0 1450, 0 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000595', 3, ST_GeomFromText('POLYGON((150 1350, 250 1350, 250 1450, 150 1450, 150 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000596', 3, ST_GeomFromText('POLYGON((300 1350, 400 1350, 400 1450, 300 1450, 300 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000597', 3, ST_GeomFromText('POLYGON((450 1350, 550 1350, 550 1450, 450 1450, 450 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000598', 3, ST_GeomFromText('POLYGON((600 1350, 700 1350, 700 1450, 600 1450, 600 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000599', 3, ST_GeomFromText('POLYGON((750 1350, 850 1350, 850 1450, 750 1450, 750 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000600', 3, ST_GeomFromText('POLYGON((900 1350, 1000 1350, 1000 1450, 900 1450, 900 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000601', 3, ST_GeomFromText('POLYGON((1050 1350, 1150 1350, 1150 1450, 1050 1450, 1050 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000602', 3, ST_GeomFromText('POLYGON((1200 1350, 1300 1350, 1300 1450, 1200 1450, 1200 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000603', 3, ST_GeomFromText('POLYGON((1350 1350, 1450 1350, 1450 1450, 1350 1450, 1350 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000604', 3, ST_GeomFromText('POLYGON((1500 1350, 1600 1350, 1600 1450, 1500 1450, 1500 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000605', 3, ST_GeomFromText('POLYGON((1650 1350, 1750 1350, 1750 1450, 1650 1450, 1650 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000606', 3, ST_GeomFromText('POLYGON((1800 1350, 1900 1350, 1900 1450, 1800 1450, 1800 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000607', 3, ST_GeomFromText('POLYGON((1950 1350, 2050 1350, 2050 1450, 1950 1450, 1950 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000608', 3, ST_GeomFromText('POLYGON((2100 1350, 2200 1350, 2200 1450, 2100 1450, 2100 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000609', 3, ST_GeomFromText('POLYGON((2250 1350, 2350 1350, 2350 1450, 2250 1450, 2250 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000610', 3, ST_GeomFromText('POLYGON((2400 1350, 2500 1350, 2500 1450, 2400 1450, 2400 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000611', 3, ST_GeomFromText('POLYGON((2550 1350, 2650 1350, 2650 1450, 2550 1450, 2550 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000612', 3, ST_GeomFromText('POLYGON((2700 1350, 2800 1350, 2800 1450, 2700 1450, 2700 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000613', 3, ST_GeomFromText('POLYGON((2850 1350, 2950 1350, 2950 1450, 2850 1450, 2850 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000614', 3, ST_GeomFromText('POLYGON((3000 1350, 3100 1350, 3100 1450, 3000 1450, 3000 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000615', 3, ST_GeomFromText('POLYGON((3150 1350, 3250 1350, 3250 1450, 3150 1450, 3150 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000616', 3, ST_GeomFromText('POLYGON((3300 1350, 3400 1350, 3400 1450, 3300 1450, 3300 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000617', 3, ST_GeomFromText('POLYGON((3450 1350, 3550 1350, 3550 1450, 3450 1450, 3450 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000618', 3, ST_GeomFromText('POLYGON((3600 1350, 3700 1350, 3700 1450, 3600 1450, 3600 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000619', 3, ST_GeomFromText('POLYGON((3750 1350, 3850 1350, 3850 1450, 3750 1450, 3750 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000620', 3, ST_GeomFromText('POLYGON((3900 1350, 4000 1350, 4000 1450, 3900 1450, 3900 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000621', 3, ST_GeomFromText('POLYGON((4050 1350, 4150 1350, 4150 1450, 4050 1450, 4050 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000622', 3, ST_GeomFromText('POLYGON((4200 1350, 4300 1350, 4300 1450, 4200 1450, 4200 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000623', 3, ST_GeomFromText('POLYGON((4350 1350, 4450 1350, 4450 1450, 4350 1450, 4350 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000624', 3, ST_GeomFromText('POLYGON((4500 1350, 4600 1350, 4600 1450, 4500 1450, 4500 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000625', 3, ST_GeomFromText('POLYGON((4650 1350, 4750 1350, 4750 1450, 4650 1450, 4650 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000626', 3, ST_GeomFromText('POLYGON((4800 1350, 4900 1350, 4900 1450, 4800 1450, 4800 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000627', 3, ST_GeomFromText('POLYGON((4950 1350, 5050 1350, 5050 1450, 4950 1450, 4950 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000628', 3, ST_GeomFromText('POLYGON((5100 1350, 5200 1350, 5200 1450, 5100 1450, 5100 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000629', 3, ST_GeomFromText('POLYGON((5250 1350, 5350 1350, 5350 1450, 5250 1450, 5250 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000630', 3, ST_GeomFromText('POLYGON((5400 1350, 5500 1350, 5500 1450, 5400 1450, 5400 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000631', 3, ST_GeomFromText('POLYGON((5550 1350, 5650 1350, 5650 1450, 5550 1450, 5550 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000632', 3, ST_GeomFromText('POLYGON((5700 1350, 5800 1350, 5800 1450, 5700 1450, 5700 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000633', 3, ST_GeomFromText('POLYGON((5850 1350, 5950 1350, 5950 1450, 5850 1450, 5850 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000634', 3, ST_GeomFromText('POLYGON((6000 1350, 6100 1350, 6100 1450, 6000 1450, 6000 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000635', 3, ST_GeomFromText('POLYGON((6150 1350, 6250 1350, 6250 1450, 6150 1450, 6150 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000636', 3, ST_GeomFromText('POLYGON((6300 1350, 6400 1350, 6400 1450, 6300 1450, 6300 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000637', 3, ST_GeomFromText('POLYGON((6450 1350, 6550 1350, 6550 1450, 6450 1450, 6450 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000638', 3, ST_GeomFromText('POLYGON((6600 1350, 6700 1350, 6700 1450, 6600 1450, 6600 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000639', 3, ST_GeomFromText('POLYGON((6750 1350, 6850 1350, 6850 1450, 6750 1450, 6750 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000640', 3, ST_GeomFromText('POLYGON((6900 1350, 7000 1350, 7000 1450, 6900 1450, 6900 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000641', 3, ST_GeomFromText('POLYGON((7050 1350, 7150 1350, 7150 1450, 7050 1450, 7050 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000642', 3, ST_GeomFromText('POLYGON((7200 1350, 7300 1350, 7300 1450, 7200 1450, 7200 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000643', 3, ST_GeomFromText('POLYGON((7350 1350, 7450 1350, 7450 1450, 7350 1450, 7350 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000644', 3, ST_GeomFromText('POLYGON((7500 1350, 7600 1350, 7600 1450, 7500 1450, 7500 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000645', 3, ST_GeomFromText('POLYGON((7650 1350, 7750 1350, 7750 1450, 7650 1450, 7650 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000646', 3, ST_GeomFromText('POLYGON((7800 1350, 7900 1350, 7900 1450, 7800 1450, 7800 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000647', 3, ST_GeomFromText('POLYGON((7950 1350, 8050 1350, 8050 1450, 7950 1450, 7950 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000648', 3, ST_GeomFromText('POLYGON((8100 1350, 8200 1350, 8200 1450, 8100 1450, 8100 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000649', 3, ST_GeomFromText('POLYGON((8250 1350, 8350 1350, 8350 1450, 8250 1450, 8250 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000650', 3, ST_GeomFromText('POLYGON((8400 1350, 8500 1350, 8500 1450, 8400 1450, 8400 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000651', 3, ST_GeomFromText('POLYGON((8550 1350, 8650 1350, 8650 1450, 8550 1450, 8550 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000652', 3, ST_GeomFromText('POLYGON((8700 1350, 8800 1350, 8800 1450, 8700 1450, 8700 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000653', 3, ST_GeomFromText('POLYGON((8850 1350, 8950 1350, 8950 1450, 8850 1450, 8850 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000654', 3, ST_GeomFromText('POLYGON((9000 1350, 9100 1350, 9100 1450, 9000 1450, 9000 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000655', 3, ST_GeomFromText('POLYGON((9150 1350, 9250 1350, 9250 1450, 9150 1450, 9150 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000656', 3, ST_GeomFromText('POLYGON((9300 1350, 9400 1350, 9400 1450, 9300 1450, 9300 1350))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000657', 3, ST_GeomFromText('POLYGON((9450 1350, 9550 1350, 9550 1450, 9450 1450, 9450 1350))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000658', 3, ST_GeomFromText('POLYGON((9600 1350, 9700 1350, 9700 1450, 9600 1450, 9600 1350))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000659', 3, ST_GeomFromText('POLYGON((9750 1350, 9850 1350, 9850 1450, 9750 1450, 9750 1350))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000660', 3, ST_GeomFromText('POLYGON((0 1500, 100 1500, 100 1600, 0 1600, 0 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000661', 3, ST_GeomFromText('POLYGON((150 1500, 250 1500, 250 1600, 150 1600, 150 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000662', 3, ST_GeomFromText('POLYGON((300 1500, 400 1500, 400 1600, 300 1600, 300 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000663', 3, ST_GeomFromText('POLYGON((450 1500, 550 1500, 550 1600, 450 1600, 450 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000664', 3, ST_GeomFromText('POLYGON((600 1500, 700 1500, 700 1600, 600 1600, 600 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000665', 3, ST_GeomFromText('POLYGON((750 1500, 850 1500, 850 1600, 750 1600, 750 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000666', 3, ST_GeomFromText('POLYGON((900 1500, 1000 1500, 1000 1600, 900 1600, 900 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000667', 3, ST_GeomFromText('POLYGON((1050 1500, 1150 1500, 1150 1600, 1050 1600, 1050 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000668', 3, ST_GeomFromText('POLYGON((1200 1500, 1300 1500, 1300 1600, 1200 1600, 1200 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000669', 3, ST_GeomFromText('POLYGON((1350 1500, 1450 1500, 1450 1600, 1350 1600, 1350 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000670', 3, ST_GeomFromText('POLYGON((1500 1500, 1600 1500, 1600 1600, 1500 1600, 1500 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000671', 3, ST_GeomFromText('POLYGON((1650 1500, 1750 1500, 1750 1600, 1650 1600, 1650 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000672', 3, ST_GeomFromText('POLYGON((1800 1500, 1900 1500, 1900 1600, 1800 1600, 1800 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000673', 3, ST_GeomFromText('POLYGON((1950 1500, 2050 1500, 2050 1600, 1950 1600, 1950 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000674', 3, ST_GeomFromText('POLYGON((2100 1500, 2200 1500, 2200 1600, 2100 1600, 2100 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000675', 3, ST_GeomFromText('POLYGON((2250 1500, 2350 1500, 2350 1600, 2250 1600, 2250 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000676', 3, ST_GeomFromText('POLYGON((2400 1500, 2500 1500, 2500 1600, 2400 1600, 2400 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000677', 3, ST_GeomFromText('POLYGON((2550 1500, 2650 1500, 2650 1600, 2550 1600, 2550 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000678', 3, ST_GeomFromText('POLYGON((2700 1500, 2800 1500, 2800 1600, 2700 1600, 2700 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000679', 3, ST_GeomFromText('POLYGON((2850 1500, 2950 1500, 2950 1600, 2850 1600, 2850 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000680', 3, ST_GeomFromText('POLYGON((3000 1500, 3100 1500, 3100 1600, 3000 1600, 3000 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000681', 3, ST_GeomFromText('POLYGON((3150 1500, 3250 1500, 3250 1600, 3150 1600, 3150 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000682', 3, ST_GeomFromText('POLYGON((3300 1500, 3400 1500, 3400 1600, 3300 1600, 3300 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000683', 3, ST_GeomFromText('POLYGON((3450 1500, 3550 1500, 3550 1600, 3450 1600, 3450 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000684', 3, ST_GeomFromText('POLYGON((3600 1500, 3700 1500, 3700 1600, 3600 1600, 3600 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000685', 3, ST_GeomFromText('POLYGON((3750 1500, 3850 1500, 3850 1600, 3750 1600, 3750 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000686', 3, ST_GeomFromText('POLYGON((3900 1500, 4000 1500, 4000 1600, 3900 1600, 3900 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000687', 3, ST_GeomFromText('POLYGON((4050 1500, 4150 1500, 4150 1600, 4050 1600, 4050 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000688', 3, ST_GeomFromText('POLYGON((4200 1500, 4300 1500, 4300 1600, 4200 1600, 4200 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000689', 3, ST_GeomFromText('POLYGON((4350 1500, 4450 1500, 4450 1600, 4350 1600, 4350 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000690', 3, ST_GeomFromText('POLYGON((4500 1500, 4600 1500, 4600 1600, 4500 1600, 4500 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000691', 3, ST_GeomFromText('POLYGON((4650 1500, 4750 1500, 4750 1600, 4650 1600, 4650 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000692', 3, ST_GeomFromText('POLYGON((4800 1500, 4900 1500, 4900 1600, 4800 1600, 4800 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000693', 3, ST_GeomFromText('POLYGON((4950 1500, 5050 1500, 5050 1600, 4950 1600, 4950 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000694', 3, ST_GeomFromText('POLYGON((5100 1500, 5200 1500, 5200 1600, 5100 1600, 5100 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000695', 3, ST_GeomFromText('POLYGON((5250 1500, 5350 1500, 5350 1600, 5250 1600, 5250 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000696', 3, ST_GeomFromText('POLYGON((5400 1500, 5500 1500, 5500 1600, 5400 1600, 5400 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000697', 3, ST_GeomFromText('POLYGON((5550 1500, 5650 1500, 5650 1600, 5550 1600, 5550 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000698', 3, ST_GeomFromText('POLYGON((5700 1500, 5800 1500, 5800 1600, 5700 1600, 5700 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000699', 3, ST_GeomFromText('POLYGON((5850 1500, 5950 1500, 5950 1600, 5850 1600, 5850 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000700', 3, ST_GeomFromText('POLYGON((6000 1500, 6100 1500, 6100 1600, 6000 1600, 6000 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000701', 3, ST_GeomFromText('POLYGON((6150 1500, 6250 1500, 6250 1600, 6150 1600, 6150 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000702', 3, ST_GeomFromText('POLYGON((6300 1500, 6400 1500, 6400 1600, 6300 1600, 6300 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000703', 3, ST_GeomFromText('POLYGON((6450 1500, 6550 1500, 6550 1600, 6450 1600, 6450 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000704', 3, ST_GeomFromText('POLYGON((6600 1500, 6700 1500, 6700 1600, 6600 1600, 6600 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000705', 3, ST_GeomFromText('POLYGON((6750 1500, 6850 1500, 6850 1600, 6750 1600, 6750 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000706', 3, ST_GeomFromText('POLYGON((6900 1500, 7000 1500, 7000 1600, 6900 1600, 6900 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000707', 3, ST_GeomFromText('POLYGON((7050 1500, 7150 1500, 7150 1600, 7050 1600, 7050 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000708', 3, ST_GeomFromText('POLYGON((7200 1500, 7300 1500, 7300 1600, 7200 1600, 7200 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000709', 3, ST_GeomFromText('POLYGON((7350 1500, 7450 1500, 7450 1600, 7350 1600, 7350 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000710', 3, ST_GeomFromText('POLYGON((7500 1500, 7600 1500, 7600 1600, 7500 1600, 7500 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000711', 3, ST_GeomFromText('POLYGON((7650 1500, 7750 1500, 7750 1600, 7650 1600, 7650 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000712', 3, ST_GeomFromText('POLYGON((7800 1500, 7900 1500, 7900 1600, 7800 1600, 7800 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000713', 3, ST_GeomFromText('POLYGON((7950 1500, 8050 1500, 8050 1600, 7950 1600, 7950 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000714', 3, ST_GeomFromText('POLYGON((8100 1500, 8200 1500, 8200 1600, 8100 1600, 8100 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000715', 3, ST_GeomFromText('POLYGON((8250 1500, 8350 1500, 8350 1600, 8250 1600, 8250 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000716', 3, ST_GeomFromText('POLYGON((8400 1500, 8500 1500, 8500 1600, 8400 1600, 8400 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000717', 3, ST_GeomFromText('POLYGON((8550 1500, 8650 1500, 8650 1600, 8550 1600, 8550 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000718', 3, ST_GeomFromText('POLYGON((8700 1500, 8800 1500, 8800 1600, 8700 1600, 8700 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000719', 3, ST_GeomFromText('POLYGON((8850 1500, 8950 1500, 8950 1600, 8850 1600, 8850 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000720', 3, ST_GeomFromText('POLYGON((9000 1500, 9100 1500, 9100 1600, 9000 1600, 9000 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000721', 3, ST_GeomFromText('POLYGON((9150 1500, 9250 1500, 9250 1600, 9150 1600, 9150 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000722', 3, ST_GeomFromText('POLYGON((9300 1500, 9400 1500, 9400 1600, 9300 1600, 9300 1500))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000723', 3, ST_GeomFromText('POLYGON((9450 1500, 9550 1500, 9550 1600, 9450 1600, 9450 1500))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000724', 3, ST_GeomFromText('POLYGON((9600 1500, 9700 1500, 9700 1600, 9600 1600, 9600 1500))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000725', 3, ST_GeomFromText('POLYGON((9750 1500, 9850 1500, 9850 1600, 9750 1600, 9750 1500))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000726', 3, ST_GeomFromText('POLYGON((0 1650, 100 1650, 100 1750, 0 1750, 0 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000727', 3, ST_GeomFromText('POLYGON((150 1650, 250 1650, 250 1750, 150 1750, 150 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000728', 3, ST_GeomFromText('POLYGON((300 1650, 400 1650, 400 1750, 300 1750, 300 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000729', 3, ST_GeomFromText('POLYGON((450 1650, 550 1650, 550 1750, 450 1750, 450 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000730', 3, ST_GeomFromText('POLYGON((600 1650, 700 1650, 700 1750, 600 1750, 600 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000731', 3, ST_GeomFromText('POLYGON((750 1650, 850 1650, 850 1750, 750 1750, 750 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000732', 3, ST_GeomFromText('POLYGON((900 1650, 1000 1650, 1000 1750, 900 1750, 900 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000733', 3, ST_GeomFromText('POLYGON((1050 1650, 1150 1650, 1150 1750, 1050 1750, 1050 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000734', 3, ST_GeomFromText('POLYGON((1200 1650, 1300 1650, 1300 1750, 1200 1750, 1200 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000735', 3, ST_GeomFromText('POLYGON((1350 1650, 1450 1650, 1450 1750, 1350 1750, 1350 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000736', 3, ST_GeomFromText('POLYGON((1500 1650, 1600 1650, 1600 1750, 1500 1750, 1500 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000737', 3, ST_GeomFromText('POLYGON((1650 1650, 1750 1650, 1750 1750, 1650 1750, 1650 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000738', 3, ST_GeomFromText('POLYGON((1800 1650, 1900 1650, 1900 1750, 1800 1750, 1800 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000739', 3, ST_GeomFromText('POLYGON((1950 1650, 2050 1650, 2050 1750, 1950 1750, 1950 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000740', 3, ST_GeomFromText('POLYGON((2100 1650, 2200 1650, 2200 1750, 2100 1750, 2100 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000741', 3, ST_GeomFromText('POLYGON((2250 1650, 2350 1650, 2350 1750, 2250 1750, 2250 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000742', 3, ST_GeomFromText('POLYGON((2400 1650, 2500 1650, 2500 1750, 2400 1750, 2400 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000743', 3, ST_GeomFromText('POLYGON((2550 1650, 2650 1650, 2650 1750, 2550 1750, 2550 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000744', 3, ST_GeomFromText('POLYGON((2700 1650, 2800 1650, 2800 1750, 2700 1750, 2700 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000745', 3, ST_GeomFromText('POLYGON((2850 1650, 2950 1650, 2950 1750, 2850 1750, 2850 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000746', 3, ST_GeomFromText('POLYGON((3000 1650, 3100 1650, 3100 1750, 3000 1750, 3000 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000747', 3, ST_GeomFromText('POLYGON((3150 1650, 3250 1650, 3250 1750, 3150 1750, 3150 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000748', 3, ST_GeomFromText('POLYGON((3300 1650, 3400 1650, 3400 1750, 3300 1750, 3300 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000749', 3, ST_GeomFromText('POLYGON((3450 1650, 3550 1650, 3550 1750, 3450 1750, 3450 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000750', 3, ST_GeomFromText('POLYGON((3600 1650, 3700 1650, 3700 1750, 3600 1750, 3600 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000751', 3, ST_GeomFromText('POLYGON((3750 1650, 3850 1650, 3850 1750, 3750 1750, 3750 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000752', 3, ST_GeomFromText('POLYGON((3900 1650, 4000 1650, 4000 1750, 3900 1750, 3900 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000753', 3, ST_GeomFromText('POLYGON((4050 1650, 4150 1650, 4150 1750, 4050 1750, 4050 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000754', 3, ST_GeomFromText('POLYGON((4200 1650, 4300 1650, 4300 1750, 4200 1750, 4200 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000755', 3, ST_GeomFromText('POLYGON((4350 1650, 4450 1650, 4450 1750, 4350 1750, 4350 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000756', 3, ST_GeomFromText('POLYGON((4500 1650, 4600 1650, 4600 1750, 4500 1750, 4500 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000757', 3, ST_GeomFromText('POLYGON((4650 1650, 4750 1650, 4750 1750, 4650 1750, 4650 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000758', 3, ST_GeomFromText('POLYGON((4800 1650, 4900 1650, 4900 1750, 4800 1750, 4800 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000759', 3, ST_GeomFromText('POLYGON((4950 1650, 5050 1650, 5050 1750, 4950 1750, 4950 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000760', 3, ST_GeomFromText('POLYGON((5100 1650, 5200 1650, 5200 1750, 5100 1750, 5100 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000761', 3, ST_GeomFromText('POLYGON((5250 1650, 5350 1650, 5350 1750, 5250 1750, 5250 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000762', 3, ST_GeomFromText('POLYGON((5400 1650, 5500 1650, 5500 1750, 5400 1750, 5400 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000763', 3, ST_GeomFromText('POLYGON((5550 1650, 5650 1650, 5650 1750, 5550 1750, 5550 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000764', 3, ST_GeomFromText('POLYGON((5700 1650, 5800 1650, 5800 1750, 5700 1750, 5700 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000765', 3, ST_GeomFromText('POLYGON((5850 1650, 5950 1650, 5950 1750, 5850 1750, 5850 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000766', 3, ST_GeomFromText('POLYGON((6000 1650, 6100 1650, 6100 1750, 6000 1750, 6000 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000767', 3, ST_GeomFromText('POLYGON((6150 1650, 6250 1650, 6250 1750, 6150 1750, 6150 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000768', 3, ST_GeomFromText('POLYGON((6300 1650, 6400 1650, 6400 1750, 6300 1750, 6300 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000769', 3, ST_GeomFromText('POLYGON((6450 1650, 6550 1650, 6550 1750, 6450 1750, 6450 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000770', 3, ST_GeomFromText('POLYGON((6600 1650, 6700 1650, 6700 1750, 6600 1750, 6600 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000771', 3, ST_GeomFromText('POLYGON((6750 1650, 6850 1650, 6850 1750, 6750 1750, 6750 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000772', 3, ST_GeomFromText('POLYGON((6900 1650, 7000 1650, 7000 1750, 6900 1750, 6900 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000773', 3, ST_GeomFromText('POLYGON((7050 1650, 7150 1650, 7150 1750, 7050 1750, 7050 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000774', 3, ST_GeomFromText('POLYGON((7200 1650, 7300 1650, 7300 1750, 7200 1750, 7200 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000775', 3, ST_GeomFromText('POLYGON((7350 1650, 7450 1650, 7450 1750, 7350 1750, 7350 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000776', 3, ST_GeomFromText('POLYGON((7500 1650, 7600 1650, 7600 1750, 7500 1750, 7500 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000777', 3, ST_GeomFromText('POLYGON((7650 1650, 7750 1650, 7750 1750, 7650 1750, 7650 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000778', 3, ST_GeomFromText('POLYGON((7800 1650, 7900 1650, 7900 1750, 7800 1750, 7800 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000779', 3, ST_GeomFromText('POLYGON((7950 1650, 8050 1650, 8050 1750, 7950 1750, 7950 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000780', 3, ST_GeomFromText('POLYGON((8100 1650, 8200 1650, 8200 1750, 8100 1750, 8100 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000781', 3, ST_GeomFromText('POLYGON((8250 1650, 8350 1650, 8350 1750, 8250 1750, 8250 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000782', 3, ST_GeomFromText('POLYGON((8400 1650, 8500 1650, 8500 1750, 8400 1750, 8400 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000783', 3, ST_GeomFromText('POLYGON((8550 1650, 8650 1650, 8650 1750, 8550 1750, 8550 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000784', 3, ST_GeomFromText('POLYGON((8700 1650, 8800 1650, 8800 1750, 8700 1750, 8700 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000785', 3, ST_GeomFromText('POLYGON((8850 1650, 8950 1650, 8950 1750, 8850 1750, 8850 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000786', 3, ST_GeomFromText('POLYGON((9000 1650, 9100 1650, 9100 1750, 9000 1750, 9000 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000787', 3, ST_GeomFromText('POLYGON((9150 1650, 9250 1650, 9250 1750, 9150 1750, 9150 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000788', 3, ST_GeomFromText('POLYGON((9300 1650, 9400 1650, 9400 1750, 9300 1750, 9300 1650))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000789', 3, ST_GeomFromText('POLYGON((9450 1650, 9550 1650, 9550 1750, 9450 1750, 9450 1650))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000790', 3, ST_GeomFromText('POLYGON((9600 1650, 9700 1650, 9700 1750, 9600 1750, 9600 1650))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000791', 3, ST_GeomFromText('POLYGON((9750 1650, 9850 1650, 9850 1750, 9750 1750, 9750 1650))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000792', 3, ST_GeomFromText('POLYGON((0 1800, 100 1800, 100 1900, 0 1900, 0 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000793', 3, ST_GeomFromText('POLYGON((150 1800, 250 1800, 250 1900, 150 1900, 150 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000794', 3, ST_GeomFromText('POLYGON((300 1800, 400 1800, 400 1900, 300 1900, 300 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000795', 3, ST_GeomFromText('POLYGON((450 1800, 550 1800, 550 1900, 450 1900, 450 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000796', 3, ST_GeomFromText('POLYGON((600 1800, 700 1800, 700 1900, 600 1900, 600 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000797', 3, ST_GeomFromText('POLYGON((750 1800, 850 1800, 850 1900, 750 1900, 750 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000798', 3, ST_GeomFromText('POLYGON((900 1800, 1000 1800, 1000 1900, 900 1900, 900 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000799', 3, ST_GeomFromText('POLYGON((1050 1800, 1150 1800, 1150 1900, 1050 1900, 1050 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000800', 3, ST_GeomFromText('POLYGON((1200 1800, 1300 1800, 1300 1900, 1200 1900, 1200 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000801', 3, ST_GeomFromText('POLYGON((1350 1800, 1450 1800, 1450 1900, 1350 1900, 1350 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000802', 3, ST_GeomFromText('POLYGON((1500 1800, 1600 1800, 1600 1900, 1500 1900, 1500 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000803', 3, ST_GeomFromText('POLYGON((1650 1800, 1750 1800, 1750 1900, 1650 1900, 1650 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000804', 3, ST_GeomFromText('POLYGON((1800 1800, 1900 1800, 1900 1900, 1800 1900, 1800 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000805', 3, ST_GeomFromText('POLYGON((1950 1800, 2050 1800, 2050 1900, 1950 1900, 1950 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000806', 3, ST_GeomFromText('POLYGON((2100 1800, 2200 1800, 2200 1900, 2100 1900, 2100 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000807', 3, ST_GeomFromText('POLYGON((2250 1800, 2350 1800, 2350 1900, 2250 1900, 2250 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000808', 3, ST_GeomFromText('POLYGON((2400 1800, 2500 1800, 2500 1900, 2400 1900, 2400 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000809', 3, ST_GeomFromText('POLYGON((2550 1800, 2650 1800, 2650 1900, 2550 1900, 2550 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000810', 3, ST_GeomFromText('POLYGON((2700 1800, 2800 1800, 2800 1900, 2700 1900, 2700 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000811', 3, ST_GeomFromText('POLYGON((2850 1800, 2950 1800, 2950 1900, 2850 1900, 2850 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000812', 3, ST_GeomFromText('POLYGON((3000 1800, 3100 1800, 3100 1900, 3000 1900, 3000 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000813', 3, ST_GeomFromText('POLYGON((3150 1800, 3250 1800, 3250 1900, 3150 1900, 3150 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000814', 3, ST_GeomFromText('POLYGON((3300 1800, 3400 1800, 3400 1900, 3300 1900, 3300 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000815', 3, ST_GeomFromText('POLYGON((3450 1800, 3550 1800, 3550 1900, 3450 1900, 3450 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000816', 3, ST_GeomFromText('POLYGON((3600 1800, 3700 1800, 3700 1900, 3600 1900, 3600 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000817', 3, ST_GeomFromText('POLYGON((3750 1800, 3850 1800, 3850 1900, 3750 1900, 3750 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000818', 3, ST_GeomFromText('POLYGON((3900 1800, 4000 1800, 4000 1900, 3900 1900, 3900 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000819', 3, ST_GeomFromText('POLYGON((4050 1800, 4150 1800, 4150 1900, 4050 1900, 4050 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000820', 3, ST_GeomFromText('POLYGON((4200 1800, 4300 1800, 4300 1900, 4200 1900, 4200 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000821', 3, ST_GeomFromText('POLYGON((4350 1800, 4450 1800, 4450 1900, 4350 1900, 4350 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000822', 3, ST_GeomFromText('POLYGON((4500 1800, 4600 1800, 4600 1900, 4500 1900, 4500 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000823', 3, ST_GeomFromText('POLYGON((4650 1800, 4750 1800, 4750 1900, 4650 1900, 4650 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000824', 3, ST_GeomFromText('POLYGON((4800 1800, 4900 1800, 4900 1900, 4800 1900, 4800 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000825', 3, ST_GeomFromText('POLYGON((4950 1800, 5050 1800, 5050 1900, 4950 1900, 4950 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000826', 3, ST_GeomFromText('POLYGON((5100 1800, 5200 1800, 5200 1900, 5100 1900, 5100 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000827', 3, ST_GeomFromText('POLYGON((5250 1800, 5350 1800, 5350 1900, 5250 1900, 5250 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000828', 3, ST_GeomFromText('POLYGON((5400 1800, 5500 1800, 5500 1900, 5400 1900, 5400 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000829', 3, ST_GeomFromText('POLYGON((5550 1800, 5650 1800, 5650 1900, 5550 1900, 5550 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000830', 3, ST_GeomFromText('POLYGON((5700 1800, 5800 1800, 5800 1900, 5700 1900, 5700 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000831', 3, ST_GeomFromText('POLYGON((5850 1800, 5950 1800, 5950 1900, 5850 1900, 5850 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000832', 3, ST_GeomFromText('POLYGON((6000 1800, 6100 1800, 6100 1900, 6000 1900, 6000 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000833', 3, ST_GeomFromText('POLYGON((6150 1800, 6250 1800, 6250 1900, 6150 1900, 6150 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000834', 3, ST_GeomFromText('POLYGON((6300 1800, 6400 1800, 6400 1900, 6300 1900, 6300 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000835', 3, ST_GeomFromText('POLYGON((6450 1800, 6550 1800, 6550 1900, 6450 1900, 6450 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000836', 3, ST_GeomFromText('POLYGON((6600 1800, 6700 1800, 6700 1900, 6600 1900, 6600 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000837', 3, ST_GeomFromText('POLYGON((6750 1800, 6850 1800, 6850 1900, 6750 1900, 6750 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000838', 3, ST_GeomFromText('POLYGON((6900 1800, 7000 1800, 7000 1900, 6900 1900, 6900 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000839', 3, ST_GeomFromText('POLYGON((7050 1800, 7150 1800, 7150 1900, 7050 1900, 7050 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000840', 3, ST_GeomFromText('POLYGON((7200 1800, 7300 1800, 7300 1900, 7200 1900, 7200 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000841', 3, ST_GeomFromText('POLYGON((7350 1800, 7450 1800, 7450 1900, 7350 1900, 7350 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000842', 3, ST_GeomFromText('POLYGON((7500 1800, 7600 1800, 7600 1900, 7500 1900, 7500 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000843', 3, ST_GeomFromText('POLYGON((7650 1800, 7750 1800, 7750 1900, 7650 1900, 7650 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000844', 3, ST_GeomFromText('POLYGON((7800 1800, 7900 1800, 7900 1900, 7800 1900, 7800 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000845', 3, ST_GeomFromText('POLYGON((7950 1800, 8050 1800, 8050 1900, 7950 1900, 7950 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000846', 3, ST_GeomFromText('POLYGON((8100 1800, 8200 1800, 8200 1900, 8100 1900, 8100 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000847', 3, ST_GeomFromText('POLYGON((8250 1800, 8350 1800, 8350 1900, 8250 1900, 8250 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000848', 3, ST_GeomFromText('POLYGON((8400 1800, 8500 1800, 8500 1900, 8400 1900, 8400 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000849', 3, ST_GeomFromText('POLYGON((8550 1800, 8650 1800, 8650 1900, 8550 1900, 8550 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000850', 3, ST_GeomFromText('POLYGON((8700 1800, 8800 1800, 8800 1900, 8700 1900, 8700 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000851', 3, ST_GeomFromText('POLYGON((8850 1800, 8950 1800, 8950 1900, 8850 1900, 8850 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000852', 3, ST_GeomFromText('POLYGON((9000 1800, 9100 1800, 9100 1900, 9000 1900, 9000 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000853', 3, ST_GeomFromText('POLYGON((9150 1800, 9250 1800, 9250 1900, 9150 1900, 9150 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000854', 3, ST_GeomFromText('POLYGON((9300 1800, 9400 1800, 9400 1900, 9300 1900, 9300 1800))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000855', 3, ST_GeomFromText('POLYGON((9450 1800, 9550 1800, 9550 1900, 9450 1900, 9450 1800))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000856', 3, ST_GeomFromText('POLYGON((9600 1800, 9700 1800, 9700 1900, 9600 1900, 9600 1800))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000857', 3, ST_GeomFromText('POLYGON((9750 1800, 9850 1800, 9850 1900, 9750 1900, 9750 1800))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000858', 3, ST_GeomFromText('POLYGON((0 1950, 100 1950, 100 2050, 0 2050, 0 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000859', 3, ST_GeomFromText('POLYGON((150 1950, 250 1950, 250 2050, 150 2050, 150 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000860', 3, ST_GeomFromText('POLYGON((300 1950, 400 1950, 400 2050, 300 2050, 300 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000861', 3, ST_GeomFromText('POLYGON((450 1950, 550 1950, 550 2050, 450 2050, 450 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000862', 3, ST_GeomFromText('POLYGON((600 1950, 700 1950, 700 2050, 600 2050, 600 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000863', 3, ST_GeomFromText('POLYGON((750 1950, 850 1950, 850 2050, 750 2050, 750 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000864', 3, ST_GeomFromText('POLYGON((900 1950, 1000 1950, 1000 2050, 900 2050, 900 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000865', 3, ST_GeomFromText('POLYGON((1050 1950, 1150 1950, 1150 2050, 1050 2050, 1050 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000866', 3, ST_GeomFromText('POLYGON((1200 1950, 1300 1950, 1300 2050, 1200 2050, 1200 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000867', 3, ST_GeomFromText('POLYGON((1350 1950, 1450 1950, 1450 2050, 1350 2050, 1350 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000868', 3, ST_GeomFromText('POLYGON((1500 1950, 1600 1950, 1600 2050, 1500 2050, 1500 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000869', 3, ST_GeomFromText('POLYGON((1650 1950, 1750 1950, 1750 2050, 1650 2050, 1650 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000870', 3, ST_GeomFromText('POLYGON((1800 1950, 1900 1950, 1900 2050, 1800 2050, 1800 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000871', 3, ST_GeomFromText('POLYGON((1950 1950, 2050 1950, 2050 2050, 1950 2050, 1950 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000872', 3, ST_GeomFromText('POLYGON((2100 1950, 2200 1950, 2200 2050, 2100 2050, 2100 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000873', 3, ST_GeomFromText('POLYGON((2250 1950, 2350 1950, 2350 2050, 2250 2050, 2250 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000874', 3, ST_GeomFromText('POLYGON((2400 1950, 2500 1950, 2500 2050, 2400 2050, 2400 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000875', 3, ST_GeomFromText('POLYGON((2550 1950, 2650 1950, 2650 2050, 2550 2050, 2550 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000876', 3, ST_GeomFromText('POLYGON((2700 1950, 2800 1950, 2800 2050, 2700 2050, 2700 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000877', 3, ST_GeomFromText('POLYGON((2850 1950, 2950 1950, 2950 2050, 2850 2050, 2850 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000878', 3, ST_GeomFromText('POLYGON((3000 1950, 3100 1950, 3100 2050, 3000 2050, 3000 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000879', 3, ST_GeomFromText('POLYGON((3150 1950, 3250 1950, 3250 2050, 3150 2050, 3150 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000880', 3, ST_GeomFromText('POLYGON((3300 1950, 3400 1950, 3400 2050, 3300 2050, 3300 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000881', 3, ST_GeomFromText('POLYGON((3450 1950, 3550 1950, 3550 2050, 3450 2050, 3450 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000882', 3, ST_GeomFromText('POLYGON((3600 1950, 3700 1950, 3700 2050, 3600 2050, 3600 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000883', 3, ST_GeomFromText('POLYGON((3750 1950, 3850 1950, 3850 2050, 3750 2050, 3750 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000884', 3, ST_GeomFromText('POLYGON((3900 1950, 4000 1950, 4000 2050, 3900 2050, 3900 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000885', 3, ST_GeomFromText('POLYGON((4050 1950, 4150 1950, 4150 2050, 4050 2050, 4050 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000886', 3, ST_GeomFromText('POLYGON((4200 1950, 4300 1950, 4300 2050, 4200 2050, 4200 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000887', 3, ST_GeomFromText('POLYGON((4350 1950, 4450 1950, 4450 2050, 4350 2050, 4350 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000888', 3, ST_GeomFromText('POLYGON((4500 1950, 4600 1950, 4600 2050, 4500 2050, 4500 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000889', 3, ST_GeomFromText('POLYGON((4650 1950, 4750 1950, 4750 2050, 4650 2050, 4650 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000890', 3, ST_GeomFromText('POLYGON((4800 1950, 4900 1950, 4900 2050, 4800 2050, 4800 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000891', 3, ST_GeomFromText('POLYGON((4950 1950, 5050 1950, 5050 2050, 4950 2050, 4950 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000892', 3, ST_GeomFromText('POLYGON((5100 1950, 5200 1950, 5200 2050, 5100 2050, 5100 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000893', 3, ST_GeomFromText('POLYGON((5250 1950, 5350 1950, 5350 2050, 5250 2050, 5250 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000894', 3, ST_GeomFromText('POLYGON((5400 1950, 5500 1950, 5500 2050, 5400 2050, 5400 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000895', 3, ST_GeomFromText('POLYGON((5550 1950, 5650 1950, 5650 2050, 5550 2050, 5550 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000896', 3, ST_GeomFromText('POLYGON((5700 1950, 5800 1950, 5800 2050, 5700 2050, 5700 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000897', 3, ST_GeomFromText('POLYGON((5850 1950, 5950 1950, 5950 2050, 5850 2050, 5850 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000898', 3, ST_GeomFromText('POLYGON((6000 1950, 6100 1950, 6100 2050, 6000 2050, 6000 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000899', 3, ST_GeomFromText('POLYGON((6150 1950, 6250 1950, 6250 2050, 6150 2050, 6150 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000900', 3, ST_GeomFromText('POLYGON((6300 1950, 6400 1950, 6400 2050, 6300 2050, 6300 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000901', 3, ST_GeomFromText('POLYGON((6450 1950, 6550 1950, 6550 2050, 6450 2050, 6450 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000902', 3, ST_GeomFromText('POLYGON((6600 1950, 6700 1950, 6700 2050, 6600 2050, 6600 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000903', 3, ST_GeomFromText('POLYGON((6750 1950, 6850 1950, 6850 2050, 6750 2050, 6750 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000904', 3, ST_GeomFromText('POLYGON((6900 1950, 7000 1950, 7000 2050, 6900 2050, 6900 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000905', 3, ST_GeomFromText('POLYGON((7050 1950, 7150 1950, 7150 2050, 7050 2050, 7050 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000906', 3, ST_GeomFromText('POLYGON((7200 1950, 7300 1950, 7300 2050, 7200 2050, 7200 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000907', 3, ST_GeomFromText('POLYGON((7350 1950, 7450 1950, 7450 2050, 7350 2050, 7350 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000908', 3, ST_GeomFromText('POLYGON((7500 1950, 7600 1950, 7600 2050, 7500 2050, 7500 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000909', 3, ST_GeomFromText('POLYGON((7650 1950, 7750 1950, 7750 2050, 7650 2050, 7650 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000910', 3, ST_GeomFromText('POLYGON((7800 1950, 7900 1950, 7900 2050, 7800 2050, 7800 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000911', 3, ST_GeomFromText('POLYGON((7950 1950, 8050 1950, 8050 2050, 7950 2050, 7950 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000912', 3, ST_GeomFromText('POLYGON((8100 1950, 8200 1950, 8200 2050, 8100 2050, 8100 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000913', 3, ST_GeomFromText('POLYGON((8250 1950, 8350 1950, 8350 2050, 8250 2050, 8250 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000914', 3, ST_GeomFromText('POLYGON((8400 1950, 8500 1950, 8500 2050, 8400 2050, 8400 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000915', 3, ST_GeomFromText('POLYGON((8550 1950, 8650 1950, 8650 2050, 8550 2050, 8550 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000916', 3, ST_GeomFromText('POLYGON((8700 1950, 8800 1950, 8800 2050, 8700 2050, 8700 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000917', 3, ST_GeomFromText('POLYGON((8850 1950, 8950 1950, 8950 2050, 8850 2050, 8850 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000918', 3, ST_GeomFromText('POLYGON((9000 1950, 9100 1950, 9100 2050, 9000 2050, 9000 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000919', 3, ST_GeomFromText('POLYGON((9150 1950, 9250 1950, 9250 2050, 9150 2050, 9150 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000920', 3, ST_GeomFromText('POLYGON((9300 1950, 9400 1950, 9400 2050, 9300 2050, 9300 1950))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000921', 3, ST_GeomFromText('POLYGON((9450 1950, 9550 1950, 9550 2050, 9450 2050, 9450 1950))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000922', 3, ST_GeomFromText('POLYGON((9600 1950, 9700 1950, 9700 2050, 9600 2050, 9600 1950))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000923', 3, ST_GeomFromText('POLYGON((9750 1950, 9850 1950, 9850 2050, 9750 2050, 9750 1950))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000924', 3, ST_GeomFromText('POLYGON((0 2100, 100 2100, 100 2200, 0 2200, 0 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000925', 3, ST_GeomFromText('POLYGON((150 2100, 250 2100, 250 2200, 150 2200, 150 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000926', 3, ST_GeomFromText('POLYGON((300 2100, 400 2100, 400 2200, 300 2200, 300 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000927', 3, ST_GeomFromText('POLYGON((450 2100, 550 2100, 550 2200, 450 2200, 450 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000928', 3, ST_GeomFromText('POLYGON((600 2100, 700 2100, 700 2200, 600 2200, 600 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000929', 3, ST_GeomFromText('POLYGON((750 2100, 850 2100, 850 2200, 750 2200, 750 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000930', 3, ST_GeomFromText('POLYGON((900 2100, 1000 2100, 1000 2200, 900 2200, 900 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000931', 3, ST_GeomFromText('POLYGON((1050 2100, 1150 2100, 1150 2200, 1050 2200, 1050 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000932', 3, ST_GeomFromText('POLYGON((1200 2100, 1300 2100, 1300 2200, 1200 2200, 1200 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000933', 3, ST_GeomFromText('POLYGON((1350 2100, 1450 2100, 1450 2200, 1350 2200, 1350 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000934', 3, ST_GeomFromText('POLYGON((1500 2100, 1600 2100, 1600 2200, 1500 2200, 1500 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000935', 3, ST_GeomFromText('POLYGON((1650 2100, 1750 2100, 1750 2200, 1650 2200, 1650 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000936', 3, ST_GeomFromText('POLYGON((1800 2100, 1900 2100, 1900 2200, 1800 2200, 1800 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000937', 3, ST_GeomFromText('POLYGON((1950 2100, 2050 2100, 2050 2200, 1950 2200, 1950 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000938', 3, ST_GeomFromText('POLYGON((2100 2100, 2200 2100, 2200 2200, 2100 2200, 2100 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000939', 3, ST_GeomFromText('POLYGON((2250 2100, 2350 2100, 2350 2200, 2250 2200, 2250 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000940', 3, ST_GeomFromText('POLYGON((2400 2100, 2500 2100, 2500 2200, 2400 2200, 2400 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000941', 3, ST_GeomFromText('POLYGON((2550 2100, 2650 2100, 2650 2200, 2550 2200, 2550 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000942', 3, ST_GeomFromText('POLYGON((2700 2100, 2800 2100, 2800 2200, 2700 2200, 2700 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000943', 3, ST_GeomFromText('POLYGON((2850 2100, 2950 2100, 2950 2200, 2850 2200, 2850 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000944', 3, ST_GeomFromText('POLYGON((3000 2100, 3100 2100, 3100 2200, 3000 2200, 3000 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000945', 3, ST_GeomFromText('POLYGON((3150 2100, 3250 2100, 3250 2200, 3150 2200, 3150 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000946', 3, ST_GeomFromText('POLYGON((3300 2100, 3400 2100, 3400 2200, 3300 2200, 3300 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000947', 3, ST_GeomFromText('POLYGON((3450 2100, 3550 2100, 3550 2200, 3450 2200, 3450 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000948', 3, ST_GeomFromText('POLYGON((3600 2100, 3700 2100, 3700 2200, 3600 2200, 3600 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000949', 3, ST_GeomFromText('POLYGON((3750 2100, 3850 2100, 3850 2200, 3750 2200, 3750 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000950', 3, ST_GeomFromText('POLYGON((3900 2100, 4000 2100, 4000 2200, 3900 2200, 3900 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000951', 3, ST_GeomFromText('POLYGON((4050 2100, 4150 2100, 4150 2200, 4050 2200, 4050 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000952', 3, ST_GeomFromText('POLYGON((4200 2100, 4300 2100, 4300 2200, 4200 2200, 4200 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000953', 3, ST_GeomFromText('POLYGON((4350 2100, 4450 2100, 4450 2200, 4350 2200, 4350 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000954', 3, ST_GeomFromText('POLYGON((4500 2100, 4600 2100, 4600 2200, 4500 2200, 4500 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000955', 3, ST_GeomFromText('POLYGON((4650 2100, 4750 2100, 4750 2200, 4650 2200, 4650 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000956', 3, ST_GeomFromText('POLYGON((4800 2100, 4900 2100, 4900 2200, 4800 2200, 4800 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000957', 3, ST_GeomFromText('POLYGON((4950 2100, 5050 2100, 5050 2200, 4950 2200, 4950 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000958', 3, ST_GeomFromText('POLYGON((5100 2100, 5200 2100, 5200 2200, 5100 2200, 5100 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000959', 3, ST_GeomFromText('POLYGON((5250 2100, 5350 2100, 5350 2200, 5250 2200, 5250 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000960', 3, ST_GeomFromText('POLYGON((5400 2100, 5500 2100, 5500 2200, 5400 2200, 5400 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000961', 3, ST_GeomFromText('POLYGON((5550 2100, 5650 2100, 5650 2200, 5550 2200, 5550 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000962', 3, ST_GeomFromText('POLYGON((5700 2100, 5800 2100, 5800 2200, 5700 2200, 5700 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000963', 3, ST_GeomFromText('POLYGON((5850 2100, 5950 2100, 5950 2200, 5850 2200, 5850 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000964', 3, ST_GeomFromText('POLYGON((6000 2100, 6100 2100, 6100 2200, 6000 2200, 6000 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000965', 3, ST_GeomFromText('POLYGON((6150 2100, 6250 2100, 6250 2200, 6150 2200, 6150 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000966', 3, ST_GeomFromText('POLYGON((6300 2100, 6400 2100, 6400 2200, 6300 2200, 6300 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000967', 3, ST_GeomFromText('POLYGON((6450 2100, 6550 2100, 6550 2200, 6450 2200, 6450 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000968', 3, ST_GeomFromText('POLYGON((6600 2100, 6700 2100, 6700 2200, 6600 2200, 6600 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000969', 3, ST_GeomFromText('POLYGON((6750 2100, 6850 2100, 6850 2200, 6750 2200, 6750 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000970', 3, ST_GeomFromText('POLYGON((6900 2100, 7000 2100, 7000 2200, 6900 2200, 6900 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000971', 3, ST_GeomFromText('POLYGON((7050 2100, 7150 2100, 7150 2200, 7050 2200, 7050 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000972', 3, ST_GeomFromText('POLYGON((7200 2100, 7300 2100, 7300 2200, 7200 2200, 7200 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000973', 3, ST_GeomFromText('POLYGON((7350 2100, 7450 2100, 7450 2200, 7350 2200, 7350 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000974', 3, ST_GeomFromText('POLYGON((7500 2100, 7600 2100, 7600 2200, 7500 2200, 7500 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000975', 3, ST_GeomFromText('POLYGON((7650 2100, 7750 2100, 7750 2200, 7650 2200, 7650 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000976', 3, ST_GeomFromText('POLYGON((7800 2100, 7900 2100, 7900 2200, 7800 2200, 7800 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000977', 3, ST_GeomFromText('POLYGON((7950 2100, 8050 2100, 8050 2200, 7950 2200, 7950 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000978', 3, ST_GeomFromText('POLYGON((8100 2100, 8200 2100, 8200 2200, 8100 2200, 8100 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000979', 3, ST_GeomFromText('POLYGON((8250 2100, 8350 2100, 8350 2200, 8250 2200, 8250 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000980', 3, ST_GeomFromText('POLYGON((8400 2100, 8500 2100, 8500 2200, 8400 2200, 8400 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000981', 3, ST_GeomFromText('POLYGON((8550 2100, 8650 2100, 8650 2200, 8550 2200, 8550 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000982', 3, ST_GeomFromText('POLYGON((8700 2100, 8800 2100, 8800 2200, 8700 2200, 8700 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000983', 3, ST_GeomFromText('POLYGON((8850 2100, 8950 2100, 8950 2200, 8850 2200, 8850 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000984', 3, ST_GeomFromText('POLYGON((9000 2100, 9100 2100, 9100 2200, 9000 2200, 9000 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000985', 3, ST_GeomFromText('POLYGON((9150 2100, 9250 2100, 9250 2200, 9150 2200, 9150 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000986', 3, ST_GeomFromText('POLYGON((9300 2100, 9400 2100, 9400 2200, 9300 2200, 9300 2100))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000987', 3, ST_GeomFromText('POLYGON((9450 2100, 9550 2100, 9550 2200, 9450 2200, 9450 2100))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000988', 3, ST_GeomFromText('POLYGON((9600 2100, 9700 2100, 9700 2200, 9600 2200, 9600 2100))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000989', 3, ST_GeomFromText('POLYGON((9750 2100, 9850 2100, 9850 2200, 9750 2200, 9750 2100))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000990', 3, ST_GeomFromText('POLYGON((0 2250, 100 2250, 100 2350, 0 2350, 0 2250))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000991', 3, ST_GeomFromText('POLYGON((150 2250, 250 2250, 250 2350, 150 2350, 150 2250))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000992', 3, ST_GeomFromText('POLYGON((300 2250, 400 2250, 400 2350, 300 2350, 300 2250))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000993', 3, ST_GeomFromText('POLYGON((450 2250, 550 2250, 550 2350, 450 2350, 450 2250))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000994', 3, ST_GeomFromText('POLYGON((600 2250, 700 2250, 700 2350, 600 2350, 600 2250))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000995', 3, ST_GeomFromText('POLYGON((750 2250, 850 2250, 850 2350, 750 2350, 750 2250))'), 'permanent deep shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000996', 3, ST_GeomFromText('POLYGON((900 2250, 1000 2250, 1000 2350, 900 2350, 900 2250))'), 'light shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000997', 3, ST_GeomFromText('POLYGON((1050 2250, 1150 2250, 1150 2350, 1050 2350, 1050 2250))'), 'partial shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000998', 3, ST_GeomFromText('POLYGON((1200 2250, 1300 2250, 1300 2350, 1200 2350, 1200 2250))'), 'permanent shade', NULL, NULL), +('e6622aab-dc5d-4865-89d2-000000000999', 3, ST_GeomFromText('POLYGON((1350 2250, 1450 2250, 1450 2350, 1350 2350, 1350 2250))'), 'permanent deep shade', NULL, NULL); diff --git a/benchmarks/backend/heatmap_sql/setup_data/insert_100_shadings.sql b/benchmarks/backend/heatmap_sql/setup_data/insert_100_shadings.sql new file mode 100644 index 000000000..e2164d61b --- /dev/null +++ b/benchmarks/backend/heatmap_sql/setup_data/insert_100_shadings.sql @@ -0,0 +1,802 @@ +DELETE FROM public.shadings WHERE layer_id = 3; +INSERT INTO public.shadings (id, layer_id, geometry, shade, add_date, remove_date) VALUES +( + 'e6622aab-dc5d-4865-89d2-000000000000', + 3, + st_geomfromtext('POLYGON((0 0, 100 0, 100 100, 0 100, 0 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000001', + 3, + st_geomfromtext('POLYGON((150 0, 250 0, 250 100, 150 100, 150 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000002', + 3, + st_geomfromtext('POLYGON((300 0, 400 0, 400 100, 300 100, 300 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000003', + 3, + st_geomfromtext('POLYGON((450 0, 550 0, 550 100, 450 100, 450 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000004', + 3, + st_geomfromtext('POLYGON((600 0, 700 0, 700 100, 600 100, 600 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000005', + 3, + st_geomfromtext('POLYGON((750 0, 850 0, 850 100, 750 100, 750 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000006', + 3, + st_geomfromtext('POLYGON((900 0, 1000 0, 1000 100, 900 100, 900 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000007', + 3, + st_geomfromtext('POLYGON((1050 0, 1150 0, 1150 100, 1050 100, 1050 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000008', + 3, + st_geomfromtext('POLYGON((1200 0, 1300 0, 1300 100, 1200 100, 1200 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000009', + 3, + st_geomfromtext('POLYGON((1350 0, 1450 0, 1450 100, 1350 100, 1350 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000010', + 3, + st_geomfromtext('POLYGON((1500 0, 1600 0, 1600 100, 1500 100, 1500 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000011', + 3, + st_geomfromtext('POLYGON((1650 0, 1750 0, 1750 100, 1650 100, 1650 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000012', + 3, + st_geomfromtext('POLYGON((1800 0, 1900 0, 1900 100, 1800 100, 1800 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000013', + 3, + st_geomfromtext('POLYGON((1950 0, 2050 0, 2050 100, 1950 100, 1950 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000014', + 3, + st_geomfromtext('POLYGON((2100 0, 2200 0, 2200 100, 2100 100, 2100 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000015', + 3, + st_geomfromtext('POLYGON((2250 0, 2350 0, 2350 100, 2250 100, 2250 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000016', + 3, + st_geomfromtext('POLYGON((2400 0, 2500 0, 2500 100, 2400 100, 2400 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000017', + 3, + st_geomfromtext('POLYGON((2550 0, 2650 0, 2650 100, 2550 100, 2550 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000018', + 3, + st_geomfromtext('POLYGON((2700 0, 2800 0, 2800 100, 2700 100, 2700 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000019', + 3, + st_geomfromtext('POLYGON((2850 0, 2950 0, 2950 100, 2850 100, 2850 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000020', + 3, + st_geomfromtext('POLYGON((3000 0, 3100 0, 3100 100, 3000 100, 3000 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000021', + 3, + st_geomfromtext('POLYGON((3150 0, 3250 0, 3250 100, 3150 100, 3150 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000022', + 3, + st_geomfromtext('POLYGON((3300 0, 3400 0, 3400 100, 3300 100, 3300 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000023', + 3, + st_geomfromtext('POLYGON((3450 0, 3550 0, 3550 100, 3450 100, 3450 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000024', + 3, + st_geomfromtext('POLYGON((3600 0, 3700 0, 3700 100, 3600 100, 3600 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000025', + 3, + st_geomfromtext('POLYGON((3750 0, 3850 0, 3850 100, 3750 100, 3750 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000026', + 3, + st_geomfromtext('POLYGON((3900 0, 4000 0, 4000 100, 3900 100, 3900 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000027', + 3, + st_geomfromtext('POLYGON((4050 0, 4150 0, 4150 100, 4050 100, 4050 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000028', + 3, + st_geomfromtext('POLYGON((4200 0, 4300 0, 4300 100, 4200 100, 4200 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000029', + 3, + st_geomfromtext('POLYGON((4350 0, 4450 0, 4450 100, 4350 100, 4350 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000030', + 3, + st_geomfromtext('POLYGON((4500 0, 4600 0, 4600 100, 4500 100, 4500 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000031', + 3, + st_geomfromtext('POLYGON((4650 0, 4750 0, 4750 100, 4650 100, 4650 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000032', + 3, + st_geomfromtext('POLYGON((4800 0, 4900 0, 4900 100, 4800 100, 4800 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000033', + 3, + st_geomfromtext('POLYGON((4950 0, 5050 0, 5050 100, 4950 100, 4950 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000034', + 3, + st_geomfromtext('POLYGON((5100 0, 5200 0, 5200 100, 5100 100, 5100 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000035', + 3, + st_geomfromtext('POLYGON((5250 0, 5350 0, 5350 100, 5250 100, 5250 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000036', + 3, + st_geomfromtext('POLYGON((5400 0, 5500 0, 5500 100, 5400 100, 5400 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000037', + 3, + st_geomfromtext('POLYGON((5550 0, 5650 0, 5650 100, 5550 100, 5550 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000038', + 3, + st_geomfromtext('POLYGON((5700 0, 5800 0, 5800 100, 5700 100, 5700 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000039', + 3, + st_geomfromtext('POLYGON((5850 0, 5950 0, 5950 100, 5850 100, 5850 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000040', + 3, + st_geomfromtext('POLYGON((6000 0, 6100 0, 6100 100, 6000 100, 6000 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000041', + 3, + st_geomfromtext('POLYGON((6150 0, 6250 0, 6250 100, 6150 100, 6150 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000042', + 3, + st_geomfromtext('POLYGON((6300 0, 6400 0, 6400 100, 6300 100, 6300 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000043', + 3, + st_geomfromtext('POLYGON((6450 0, 6550 0, 6550 100, 6450 100, 6450 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000044', + 3, + st_geomfromtext('POLYGON((6600 0, 6700 0, 6700 100, 6600 100, 6600 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000045', + 3, + st_geomfromtext('POLYGON((6750 0, 6850 0, 6850 100, 6750 100, 6750 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000046', + 3, + st_geomfromtext('POLYGON((6900 0, 7000 0, 7000 100, 6900 100, 6900 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000047', + 3, + st_geomfromtext('POLYGON((7050 0, 7150 0, 7150 100, 7050 100, 7050 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000048', + 3, + st_geomfromtext('POLYGON((7200 0, 7300 0, 7300 100, 7200 100, 7200 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000049', + 3, + st_geomfromtext('POLYGON((7350 0, 7450 0, 7450 100, 7350 100, 7350 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000050', + 3, + st_geomfromtext('POLYGON((7500 0, 7600 0, 7600 100, 7500 100, 7500 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000051', + 3, + st_geomfromtext('POLYGON((7650 0, 7750 0, 7750 100, 7650 100, 7650 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000052', + 3, + st_geomfromtext('POLYGON((7800 0, 7900 0, 7900 100, 7800 100, 7800 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000053', + 3, + st_geomfromtext('POLYGON((7950 0, 8050 0, 8050 100, 7950 100, 7950 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000054', + 3, + st_geomfromtext('POLYGON((8100 0, 8200 0, 8200 100, 8100 100, 8100 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000055', + 3, + st_geomfromtext('POLYGON((8250 0, 8350 0, 8350 100, 8250 100, 8250 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000056', + 3, + st_geomfromtext('POLYGON((8400 0, 8500 0, 8500 100, 8400 100, 8400 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000057', + 3, + st_geomfromtext('POLYGON((8550 0, 8650 0, 8650 100, 8550 100, 8550 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000058', + 3, + st_geomfromtext('POLYGON((8700 0, 8800 0, 8800 100, 8700 100, 8700 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000059', + 3, + st_geomfromtext('POLYGON((8850 0, 8950 0, 8950 100, 8850 100, 8850 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000060', + 3, + st_geomfromtext('POLYGON((9000 0, 9100 0, 9100 100, 9000 100, 9000 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000061', + 3, + st_geomfromtext('POLYGON((9150 0, 9250 0, 9250 100, 9150 100, 9150 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000062', + 3, + st_geomfromtext('POLYGON((9300 0, 9400 0, 9400 100, 9300 100, 9300 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000063', + 3, + st_geomfromtext('POLYGON((9450 0, 9550 0, 9550 100, 9450 100, 9450 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000064', + 3, + st_geomfromtext('POLYGON((9600 0, 9700 0, 9700 100, 9600 100, 9600 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000065', + 3, + st_geomfromtext('POLYGON((9750 0, 9850 0, 9850 100, 9750 100, 9750 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000066', + 3, + st_geomfromtext('POLYGON((0 150, 100 150, 100 250, 0 250, 0 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000067', + 3, + st_geomfromtext('POLYGON((150 150, 250 150, 250 250, 150 250, 150 150))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000068', + 3, + st_geomfromtext('POLYGON((300 150, 400 150, 400 250, 300 250, 300 150))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000069', + 3, + st_geomfromtext('POLYGON((450 150, 550 150, 550 250, 450 250, 450 150))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000070', + 3, + st_geomfromtext('POLYGON((600 150, 700 150, 700 250, 600 250, 600 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000071', + 3, + st_geomfromtext('POLYGON((750 150, 850 150, 850 250, 750 250, 750 150))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000072', + 3, + st_geomfromtext('POLYGON((900 150, 1000 150, 1000 250, 900 250, 900 150))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000073', + 3, + st_geomfromtext('POLYGON((1050 150, 1150 150, 1150 250, 1050 250, 1050 150))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000074', + 3, + st_geomfromtext('POLYGON((1200 150, 1300 150, 1300 250, 1200 250, 1200 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000075', + 3, + st_geomfromtext('POLYGON((1350 150, 1450 150, 1450 250, 1350 250, 1350 150))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000076', + 3, + st_geomfromtext('POLYGON((1500 150, 1600 150, 1600 250, 1500 250, 1500 150))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000077', + 3, + st_geomfromtext('POLYGON((1650 150, 1750 150, 1750 250, 1650 250, 1650 150))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000078', + 3, + st_geomfromtext('POLYGON((1800 150, 1900 150, 1900 250, 1800 250, 1800 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000079', + 3, + st_geomfromtext('POLYGON((1950 150, 2050 150, 2050 250, 1950 250, 1950 150))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000080', + 3, + st_geomfromtext('POLYGON((2100 150, 2200 150, 2200 250, 2100 250, 2100 150))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000081', + 3, + st_geomfromtext('POLYGON((2250 150, 2350 150, 2350 250, 2250 250, 2250 150))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000082', + 3, + st_geomfromtext('POLYGON((2400 150, 2500 150, 2500 250, 2400 250, 2400 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000083', + 3, + st_geomfromtext('POLYGON((2550 150, 2650 150, 2650 250, 2550 250, 2550 150))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000084', + 3, + st_geomfromtext('POLYGON((2700 150, 2800 150, 2800 250, 2700 250, 2700 150))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000085', + 3, + st_geomfromtext('POLYGON((2850 150, 2950 150, 2950 250, 2850 250, 2850 150))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000086', + 3, + st_geomfromtext('POLYGON((3000 150, 3100 150, 3100 250, 3000 250, 3000 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000087', + 3, + st_geomfromtext('POLYGON((3150 150, 3250 150, 3250 250, 3150 250, 3150 150))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000088', + 3, + st_geomfromtext('POLYGON((3300 150, 3400 150, 3400 250, 3300 250, 3300 150))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000089', + 3, + st_geomfromtext('POLYGON((3450 150, 3550 150, 3550 250, 3450 250, 3450 150))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000090', + 3, + st_geomfromtext('POLYGON((3600 150, 3700 150, 3700 250, 3600 250, 3600 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000091', + 3, + st_geomfromtext('POLYGON((3750 150, 3850 150, 3850 250, 3750 250, 3750 150))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000092', + 3, + st_geomfromtext('POLYGON((3900 150, 4000 150, 4000 250, 3900 250, 3900 150))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000093', + 3, + st_geomfromtext('POLYGON((4050 150, 4150 150, 4150 250, 4050 250, 4050 150))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000094', + 3, + st_geomfromtext('POLYGON((4200 150, 4300 150, 4300 250, 4200 250, 4200 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000095', + 3, + st_geomfromtext('POLYGON((4350 150, 4450 150, 4450 250, 4350 250, 4350 150))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000096', + 3, + st_geomfromtext('POLYGON((4500 150, 4600 150, 4600 250, 4500 250, 4500 150))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000097', + 3, + st_geomfromtext('POLYGON((4650 150, 4750 150, 4750 250, 4650 250, 4650 150))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000098', + 3, + st_geomfromtext('POLYGON((4800 150, 4900 150, 4900 250, 4800 250, 4800 150))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000099', + 3, + st_geomfromtext('POLYGON((4950 150, 5050 150, 5050 250, 4950 250, 4950 150))'), + 'permanent deep shade', + null, + null +); diff --git a/benchmarks/backend/heatmap_sql/setup_data/insert_10_shadings.sql b/benchmarks/backend/heatmap_sql/setup_data/insert_10_shadings.sql new file mode 100644 index 000000000..eea897777 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/setup_data/insert_10_shadings.sql @@ -0,0 +1,82 @@ +DELETE FROM public.shadings WHERE layer_id = 3; +INSERT INTO public.shadings (id, layer_id, geometry, shade, add_date, remove_date) VALUES +( + 'e6622aab-dc5d-4865-89d2-000000000000', + 3, + st_geomfromtext('POLYGON((0 0, 100 0, 100 100, 0 100, 0 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000001', + 3, + st_geomfromtext('POLYGON((150 0, 250 0, 250 100, 150 100, 150 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000002', + 3, + st_geomfromtext('POLYGON((300 0, 400 0, 400 100, 300 100, 300 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000003', + 3, + st_geomfromtext('POLYGON((450 0, 550 0, 550 100, 450 100, 450 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000004', + 3, + st_geomfromtext('POLYGON((600 0, 700 0, 700 100, 600 100, 600 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000005', + 3, + st_geomfromtext('POLYGON((750 0, 850 0, 850 100, 750 100, 750 0))'), + 'partial shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000006', + 3, + st_geomfromtext('POLYGON((900 0, 1000 0, 1000 100, 900 100, 900 0))'), + 'permanent shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000007', + 3, + st_geomfromtext('POLYGON((1050 0, 1150 0, 1150 100, 1050 100, 1050 0))'), + 'permanent deep shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000008', + 3, + st_geomfromtext('POLYGON((1200 0, 1300 0, 1300 100, 1200 100, 1200 0))'), + 'light shade', + null, + null +), +( + 'e6622aab-dc5d-4865-89d2-000000000009', + 3, + st_geomfromtext('POLYGON((1350 0, 1450 0, 1450 100, 1350 100, 1350 0))'), + 'partial shade', + null, + null +); diff --git a/benchmarks/backend/heatmap_sql/setup_data/large_map.sql b/benchmarks/backend/heatmap_sql/setup_data/large_map.sql new file mode 100755 index 000000000..01cbe7a32 --- /dev/null +++ b/benchmarks/backend/heatmap_sql/setup_data/large_map.sql @@ -0,0 +1,208 @@ +CREATE EXTENSION IF NOT EXISTS plprofiler WITH SCHEMA public; + + +-- Data for Name: maps; Type: TABLE DATA; Schema: public; Owner: permaplant +-- Map geometry is a ring of size 10000x10000 +-- from (0,0) to (10000,0) to (10000,10000) to (0,10000) to (0,0) + +INSERT INTO public.maps ( + id, + name, + creation_date, + deletion_date, + last_visit, + is_inactive, + zoom_factor, + honors, + visits, + harvested, + privacy, + description, + location, + owner_id, + geometry +) VALUES +( + 1, + 'Test Map', + '2023-07-25', + null, + null, + false, + 100, + 0, + 0, + 0, + 'public', + '', + null, + 'affb3987-0d75-42b8-b34a-cf7eec4e151b', + st_geomfromtext('POLYGON((0 0,10000 0,10000 10000,0 10000,0 0))') +); + + +-- +-- Data for Name: layers; Type: TABLE DATA; Schema: public; Owner: permaplant +-- + +INSERT INTO public.layers (id, map_id, type, name, is_alternative) VALUES +(1, 1, 'base', 'Base Layer', false), +(2, 1, 'plants', 'Plants Layer', false), +(3, 1, 'shade', 'Shade Layer', false); + + +-- +-- Data for Name: plantings; Type: TABLE DATA; Schema: public; Owner: permaplant +-- + +INSERT INTO public.plantings ( + id, + layer_id, + plant_id, + x, + y, + width, + height, + rotation, + scale_x, + scale_y, + add_date, + remove_date, + seed_id, + is_area, + notes +) VALUES +('00000000-0000-0000-0000-000000000000', 2, 4506, 300, 1200, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000001', 2, 4532, 400, 200, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000002', 2, 1658, 0, 0, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000003', 2, 1658, 10, 5, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000004', 2, 1658, 300, 10, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000005', 2, 1658, 350, 0, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000006', 2, 1658, 400, 0, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000007', 2, 1658, 500, 20, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000008', 2, 1658, 520, 15, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000009', 2, 1658, 550, 0, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000010', 2, 1658, 600, 15, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000011', 2, 1658, 610, 0, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000012', 2, 1658, 620, 15, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000013', 2, 1658, 650, 15, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000014', 2, 1658, 800, 15, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000015', 2, 1658, 820, 15, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000016', 2, 1658, 880, 15, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000017', 2, 1658, 900, 15, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000018', 2, 1658, 80, 600, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000019', 2, 1658, 80, 650, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000020', 2, 1658, 80, 700, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000021', 2, 1658, 80, 750, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000022', 2, 1658, 80, 800, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000023', 2, 1658, 80, 850, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000024', 2, 5557, 600, 1050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000025', 2, 5557, 650, 1050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000026', 2, 5557, 700, 1050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000027', 2, 355, 740, 1050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000028', 2, 355, 760, 1050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000029', 2, 6247, 550, 1030, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000030', 2, 7708, 550, 1000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000031', 2, 7708, 575, 1000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000032', 2, 7708, 600, 1000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000033', 2, 7708, 625, 1000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000034', 2, 7708, 650, 1000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000035', 2, 7708, 675, 1000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000036', 2, 5807, 0, 1970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000037', 2, 5807, 100, 1970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000038', 2, 5807, 200, 1970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000039', 2, 5807, 300, 1970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000040', 2, 5807, 400, 1970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000041', 2, 5807, 500, 1970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000042', 2, 5807, 600, 1970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-000000000043', 2, 5807, 700, 1970, 0, 0, 0, 0, 0, null, null, null, false, null), + +('00000000-0000-0000-0000-100000000000', 2, 4506, 5300, 6200, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000001', 2, 4532, 5400, 5200, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000002', 2, 1658, 5000, 5000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000003', 2, 1658, 5010, 5005, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000004', 2, 1658, 5300, 5010, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000005', 2, 1658, 5350, 5000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000006', 2, 1658, 5400, 5000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000007', 2, 1658, 5500, 5020, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000008', 2, 1658, 5520, 5015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000009', 2, 1658, 5550, 5000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000010', 2, 1658, 5600, 5015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000011', 2, 1658, 5610, 5000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000012', 2, 1658, 5620, 5015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000013', 2, 1658, 5650, 5015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000014', 2, 1658, 5800, 5015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000015', 2, 1658, 5820, 5015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000016', 2, 1658, 5880, 5015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000017', 2, 1658, 5900, 5015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000018', 2, 1658, 5080, 5600, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000019', 2, 1658, 5080, 5650, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000020', 2, 1658, 5080, 5700, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000021', 2, 1658, 5080, 5750, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000022', 2, 1658, 5080, 5800, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000023', 2, 1658, 5080, 5850, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000024', 2, 5557, 5600, 6050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000025', 2, 5557, 5650, 6050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000026', 2, 5557, 5700, 6050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000027', 2, 355, 5740, 6050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000028', 2, 355, 5760, 6050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000029', 2, 6247, 5550, 6030, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000030', 2, 7708, 5550, 6000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000031', 2, 7708, 5575, 6000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000032', 2, 7708, 5600, 6000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000033', 2, 7708, 5625, 6000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000034', 2, 7708, 5650, 6000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000035', 2, 7708, 5675, 6000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000036', 2, 5807, 5000, 6970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000037', 2, 5807, 5100, 6970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000038', 2, 5807, 5200, 6970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000039', 2, 5807, 5300, 6970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000040', 2, 5807, 5400, 6970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000041', 2, 5807, 5500, 6970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000042', 2, 5807, 5600, 6970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-100000000043', 2, 5807, 5700, 6970, 0, 0, 0, 0, 0, null, null, null, false, null), + +('00000000-0000-0000-0000-200000000000', 2, 4506, 8300, 8200, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000001', 2, 4532, 8400, 8200, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000002', 2, 1658, 8000, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000003', 2, 1658, 8010, 8005, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000004', 2, 1658, 8300, 8010, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000005', 2, 1658, 8350, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000006', 2, 1658, 8400, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000007', 2, 1658, 8500, 8020, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000008', 2, 1658, 8520, 8015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000009', 2, 1658, 8550, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000010', 2, 1658, 8600, 8015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000011', 2, 1658, 8610, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000012', 2, 1658, 8620, 8015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000013', 2, 1658, 8650, 8015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000014', 2, 1658, 8800, 8015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000015', 2, 1658, 8820, 8015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000016', 2, 1658, 8880, 8015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000017', 2, 1658, 8900, 8015, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000018', 2, 1658, 8080, 8600, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000019', 2, 1658, 8080, 8650, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000020', 2, 1658, 8080, 8700, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000021', 2, 1658, 8080, 8750, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000022', 2, 1658, 8080, 8800, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000023', 2, 1658, 8080, 8850, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000024', 2, 5557, 8600, 8050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000025', 2, 5557, 8650, 8050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000026', 2, 5557, 8700, 8050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000027', 2, 355, 8740, 8050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000028', 2, 355, 8760, 8050, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000029', 2, 6247, 8550, 8030, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000030', 2, 7708, 8550, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000031', 2, 7708, 8575, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000032', 2, 7708, 8600, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000033', 2, 7708, 8625, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000034', 2, 7708, 8650, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000035', 2, 7708, 8675, 8000, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000036', 2, 5807, 8000, 8970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000037', 2, 5807, 8100, 8970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000038', 2, 5807, 8200, 8970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000039', 2, 5807, 8300, 8970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000040', 2, 5807, 8400, 8970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000041', 2, 5807, 8500, 8970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000042', 2, 5807, 8600, 8970, 0, 0, 0, 0, 0, null, null, null, false, null), +('00000000-0000-0000-0000-200000000043', 2, 5807, 8700, 8970, 0, 0, 0, 0, 0, null, null, null, false, null); diff --git a/doc/changelog.md b/doc/changelog.md index 0b447aa18..ec22e93b6 100644 --- a/doc/changelog.md +++ b/doc/changelog.md @@ -56,7 +56,7 @@ Syntax: `- short text describing the change _(Your Name)_` - _()_ - Use arrow keys to navigate between timepicker sliders and fix timeline performance issues _(Daniel Steinkogler)_ - _()_ -- _()_ +- Add heatmap benchmark for shadings _(Christoph Schreiner)_ - _()_ - Increased zoom scaling factor for Map Editor / faster zooming _(Samuel)_ - _()_