pgLatLon
diff latlon--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.8.sql Thu Oct 20 21:44:17 2016 +0200 1.2 +++ b/latlon--0.8.sql Fri Oct 21 12:51:37 2016 +0200 1.3 @@ -1520,7 +1520,7 @@ 1.4 -- other data storage formats -- 1.5 -------------------------------- 1.6 1.7 -CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint_lonlat') 1.8 +CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint') 1.9 RETURNS epoint 1.10 LANGUAGE plpgsql IMMUTABLE STRICT AS $$ 1.11 DECLARE 1.12 @@ -1539,14 +1539,38 @@ 1.13 END; 1.14 $$; 1.15 1.16 +CREATE FUNCTION GeoJSON_LinearRing_vertices(jsonb, text = 'epoint_lonlat') 1.17 + RETURNS SETOF jsonb 1.18 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.19 + SELECT "result" FROM 1.20 + ( SELECT jsonb_array_length($1) - 1 ) AS "lastindex_row" ("lastindex") 1.21 + CROSS JOIN LATERAL jsonb_array_elements( 1.22 + CASE WHEN 1.23 + coords_to_epoint( 1.24 + ($1->0->>0)::float8, 1.25 + ($1->0->>1)::float8, 1.26 + $2 1.27 + ) = coords_to_epoint( 1.28 + ($1->"lastindex"->>0)::float8, 1.29 + ($1->"lastindex"->>1)::float8, 1.30 + $2 1.31 + ) 1.32 + THEN 1.33 + $1 - "lastindex" 1.34 + ELSE 1.35 + $1 1.36 + END 1.37 + ) AS "result_row" ("result") 1.38 + $$; 1.39 + 1.40 CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat') 1.41 RETURNS epoint 1.42 LANGUAGE sql IMMUTABLE STRICT AS $$ 1.43 SELECT CASE 1.44 WHEN $1->>'type' = 'Point' THEN 1.45 coords_to_epoint( 1.46 + ($1->'coordinates'->>0)::float8, 1.47 ($1->'coordinates'->>1)::float8, 1.48 - ($1->'coordinates'->>0)::float8, 1.49 $2 1.50 ) 1.51 WHEN $1->>'type' = 'Feature' THEN 1.52 @@ -1562,15 +1586,15 @@ 1.53 SELECT CASE $1->>'type' 1.54 WHEN 'Point' THEN 1.55 coords_to_epoint( 1.56 + ($1->'coordinates'->>0)::float8, 1.57 ($1->'coordinates'->>1)::float8, 1.58 - ($1->'coordinates'->>0)::float8, 1.59 $2 1.60 )::ecluster 1.61 WHEN 'MultiPoint' THEN 1.62 ( SELECT ecluster_create_multipoint(array_agg( 1.63 coords_to_epoint( 1.64 + ("coord"->>0)::float8, 1.65 ("coord"->>1)::float8, 1.66 - ("coord"->>0)::float8, 1.67 $2 1.68 ) 1.69 )) 1.70 @@ -1579,8 +1603,8 @@ 1.71 WHEN 'LineString' THEN 1.72 ( SELECT ecluster_create_path(array_agg( 1.73 coords_to_epoint( 1.74 + ("coord"->>0)::float8, 1.75 ("coord"->>1)::float8, 1.76 - ("coord"->>0)::float8, 1.77 $2 1.78 ) 1.79 )) 1.80 @@ -1590,8 +1614,8 @@ 1.81 ( SELECT ecluster_concat(array_agg( 1.82 ( SELECT ecluster_create_path(array_agg( 1.83 coords_to_epoint( 1.84 + ("coord"->>0)::float8, 1.85 ("coord"->>1)::float8, 1.86 - ("coord"->>0)::float8, 1.87 $2 1.88 ) 1.89 )) 1.90 @@ -1604,12 +1628,12 @@ 1.91 ( SELECT ecluster_concat(array_agg( 1.92 ( SELECT ecluster_create_polygon(array_agg( 1.93 coords_to_epoint( 1.94 + ("coord"->>0)::float8, 1.95 ("coord"->>1)::float8, 1.96 - ("coord"->>0)::float8, 1.97 $2 1.98 ) 1.99 )) 1.100 - FROM jsonb_array_elements("coord_array") AS "coord" 1.101 + FROM GeoJSON_LinearRing_vertices("coord_array", $2) AS "coord" 1.102 ) 1.103 )) 1.104 FROM jsonb_array_elements($1->'coordinates') AS "coord_array" 1.105 @@ -1619,12 +1643,12 @@ 1.106 ( SELECT ecluster_concat(array_agg( 1.107 ( SELECT ecluster_create_polygon(array_agg( 1.108 coords_to_epoint( 1.109 + ("coord"->>0)::float8, 1.110 ("coord"->>1)::float8, 1.111 - ("coord"->>0)::float8, 1.112 $2 1.113 ) 1.114 )) 1.115 - FROM jsonb_array_elements("coord_array") AS "coord" 1.116 + FROM GeoJSON_LinearRing_vertices("coord_array", $2) AS "coord" 1.117 ) 1.118 )) 1.119 FROM jsonb_array_elements("coord_array_array") AS "coord_array" 1.120 @@ -1632,6 +1656,12 @@ 1.121 )) 1.122 FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array" 1.123 ) 1.124 + WHEN 'GeometryCollection' THEN 1.125 + ( SELECT ecluster_concat(array_agg( 1.126 + GeoJSON_to_ecluster("geometry", $2) 1.127 + )) 1.128 + FROM jsonb_array_elements($1->'geometries') AS "geometry" 1.129 + ) 1.130 WHEN 'Feature' THEN 1.131 GeoJSON_to_ecluster($1->'geometry', $2) 1.132 WHEN 'FeatureCollection' THEN