pgLatLon
diff latlon--0.7--0.8.sql @ 39:2890e859c8a8
Bugfixes in GeoJSON_to_epoint and GeoJSON_to_ecluster functions
| author | jbe |
|---|---|
| date | Fri Oct 21 12:51:37 2016 +0200 (2016-10-21) |
| parents | 9cd46e55d576 |
| children |
line diff
1.1 --- a/latlon--0.7--0.8.sql Thu Oct 20 21:44:17 2016 +0200 1.2 +++ b/latlon--0.7--0.8.sql Fri Oct 21 12:51:37 2016 +0200 1.3 @@ -0,0 +1,124 @@ 1.4 + 1.5 +CREATE FUNCTION GeoJSON_LinearRing_vertices(jsonb, text = 'epoint_lonlat') 1.6 + RETURNS SETOF jsonb 1.7 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.8 + SELECT "result" FROM 1.9 + ( SELECT jsonb_array_length($1) - 1 ) AS "lastindex_row" ("lastindex") 1.10 + CROSS JOIN LATERAL jsonb_array_elements( 1.11 + CASE WHEN 1.12 + coords_to_epoint( 1.13 + ($1->0->>0)::float8, 1.14 + ($1->0->>1)::float8, 1.15 + $2 1.16 + ) = coords_to_epoint( 1.17 + ($1->"lastindex"->>0)::float8, 1.18 + ($1->"lastindex"->>1)::float8, 1.19 + $2 1.20 + ) 1.21 + THEN 1.22 + $1 - "lastindex" 1.23 + ELSE 1.24 + $1 1.25 + END 1.26 + ) AS "result_row" ("result") 1.27 + $$; 1.28 + 1.29 +-- NOTE: drop function to throw error if indices depend on it 1.30 +-- (they need to be rebuilt) 1.31 +DROP FUNCTION GeoJSON_to_ecluster(jsonb, text); 1.32 + 1.33 +CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat') 1.34 + RETURNS ecluster 1.35 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.36 + SELECT CASE $1->>'type' 1.37 + WHEN 'Point' THEN 1.38 + coords_to_epoint( 1.39 + ($1->'coordinates'->>0)::float8, 1.40 + ($1->'coordinates'->>1)::float8, 1.41 + $2 1.42 + )::ecluster 1.43 + WHEN 'MultiPoint' THEN 1.44 + ( SELECT ecluster_create_multipoint(array_agg( 1.45 + coords_to_epoint( 1.46 + ("coord"->>0)::float8, 1.47 + ("coord"->>1)::float8, 1.48 + $2 1.49 + ) 1.50 + )) 1.51 + FROM jsonb_array_elements($1->'coordinates') AS "coord" 1.52 + ) 1.53 + WHEN 'LineString' THEN 1.54 + ( SELECT ecluster_create_path(array_agg( 1.55 + coords_to_epoint( 1.56 + ("coord"->>0)::float8, 1.57 + ("coord"->>1)::float8, 1.58 + $2 1.59 + ) 1.60 + )) 1.61 + FROM jsonb_array_elements($1->'coordinates') AS "coord" 1.62 + ) 1.63 + WHEN 'MultiLineString' THEN 1.64 + ( SELECT ecluster_concat(array_agg( 1.65 + ( SELECT ecluster_create_path(array_agg( 1.66 + coords_to_epoint( 1.67 + ("coord"->>0)::float8, 1.68 + ("coord"->>1)::float8, 1.69 + $2 1.70 + ) 1.71 + )) 1.72 + FROM jsonb_array_elements("coord_array") AS "coord" 1.73 + ) 1.74 + )) 1.75 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array" 1.76 + ) 1.77 + WHEN 'Polygon' THEN 1.78 + ( SELECT ecluster_concat(array_agg( 1.79 + ( SELECT ecluster_create_polygon(array_agg( 1.80 + coords_to_epoint( 1.81 + ("coord"->>0)::float8, 1.82 + ("coord"->>1)::float8, 1.83 + $2 1.84 + ) 1.85 + )) 1.86 + FROM GeoJSON_LinearRing_vertices("coord_array", $2) AS "coord" 1.87 + ) 1.88 + )) 1.89 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array" 1.90 + ) 1.91 + WHEN 'MultiPolygon' THEN 1.92 + ( SELECT ecluster_concat(array_agg( 1.93 + ( SELECT ecluster_concat(array_agg( 1.94 + ( SELECT ecluster_create_polygon(array_agg( 1.95 + coords_to_epoint( 1.96 + ("coord"->>0)::float8, 1.97 + ("coord"->>1)::float8, 1.98 + $2 1.99 + ) 1.100 + )) 1.101 + FROM GeoJSON_LinearRing_vertices("coord_array", $2) AS "coord" 1.102 + ) 1.103 + )) 1.104 + FROM jsonb_array_elements("coord_array_array") AS "coord_array" 1.105 + ) 1.106 + )) 1.107 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array" 1.108 + ) 1.109 + WHEN 'GeometryCollection' THEN 1.110 + ( SELECT ecluster_concat(array_agg( 1.111 + GeoJSON_to_ecluster("geometry", $2) 1.112 + )) 1.113 + FROM jsonb_array_elements($1->'geometries') AS "geometry" 1.114 + ) 1.115 + WHEN 'Feature' THEN 1.116 + GeoJSON_to_ecluster($1->'geometry', $2) 1.117 + WHEN 'FeatureCollection' THEN 1.118 + ( SELECT ecluster_concat(array_agg( 1.119 + GeoJSON_to_ecluster("feature", $2) 1.120 + )) 1.121 + FROM jsonb_array_elements($1->'features') AS "feature" 1.122 + ) 1.123 + ELSE 1.124 + NULL 1.125 + END 1.126 + $$; 1.127 +