pgLatLon
changeset 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 | f1a9a5de9a12 |
files | latlon--0.7--0.8.sql latlon--0.8.sql |
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 +
2.1 --- a/latlon--0.8.sql Thu Oct 20 21:44:17 2016 +0200 2.2 +++ b/latlon--0.8.sql Fri Oct 21 12:51:37 2016 +0200 2.3 @@ -1520,7 +1520,7 @@ 2.4 -- other data storage formats -- 2.5 -------------------------------- 2.6 2.7 -CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint_lonlat') 2.8 +CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint') 2.9 RETURNS epoint 2.10 LANGUAGE plpgsql IMMUTABLE STRICT AS $$ 2.11 DECLARE 2.12 @@ -1539,14 +1539,38 @@ 2.13 END; 2.14 $$; 2.15 2.16 +CREATE FUNCTION GeoJSON_LinearRing_vertices(jsonb, text = 'epoint_lonlat') 2.17 + RETURNS SETOF jsonb 2.18 + LANGUAGE sql IMMUTABLE STRICT AS $$ 2.19 + SELECT "result" FROM 2.20 + ( SELECT jsonb_array_length($1) - 1 ) AS "lastindex_row" ("lastindex") 2.21 + CROSS JOIN LATERAL jsonb_array_elements( 2.22 + CASE WHEN 2.23 + coords_to_epoint( 2.24 + ($1->0->>0)::float8, 2.25 + ($1->0->>1)::float8, 2.26 + $2 2.27 + ) = coords_to_epoint( 2.28 + ($1->"lastindex"->>0)::float8, 2.29 + ($1->"lastindex"->>1)::float8, 2.30 + $2 2.31 + ) 2.32 + THEN 2.33 + $1 - "lastindex" 2.34 + ELSE 2.35 + $1 2.36 + END 2.37 + ) AS "result_row" ("result") 2.38 + $$; 2.39 + 2.40 CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat') 2.41 RETURNS epoint 2.42 LANGUAGE sql IMMUTABLE STRICT AS $$ 2.43 SELECT CASE 2.44 WHEN $1->>'type' = 'Point' THEN 2.45 coords_to_epoint( 2.46 + ($1->'coordinates'->>0)::float8, 2.47 ($1->'coordinates'->>1)::float8, 2.48 - ($1->'coordinates'->>0)::float8, 2.49 $2 2.50 ) 2.51 WHEN $1->>'type' = 'Feature' THEN 2.52 @@ -1562,15 +1586,15 @@ 2.53 SELECT CASE $1->>'type' 2.54 WHEN 'Point' THEN 2.55 coords_to_epoint( 2.56 + ($1->'coordinates'->>0)::float8, 2.57 ($1->'coordinates'->>1)::float8, 2.58 - ($1->'coordinates'->>0)::float8, 2.59 $2 2.60 )::ecluster 2.61 WHEN 'MultiPoint' THEN 2.62 ( SELECT ecluster_create_multipoint(array_agg( 2.63 coords_to_epoint( 2.64 + ("coord"->>0)::float8, 2.65 ("coord"->>1)::float8, 2.66 - ("coord"->>0)::float8, 2.67 $2 2.68 ) 2.69 )) 2.70 @@ -1579,8 +1603,8 @@ 2.71 WHEN 'LineString' THEN 2.72 ( SELECT ecluster_create_path(array_agg( 2.73 coords_to_epoint( 2.74 + ("coord"->>0)::float8, 2.75 ("coord"->>1)::float8, 2.76 - ("coord"->>0)::float8, 2.77 $2 2.78 ) 2.79 )) 2.80 @@ -1590,8 +1614,8 @@ 2.81 ( SELECT ecluster_concat(array_agg( 2.82 ( SELECT ecluster_create_path(array_agg( 2.83 coords_to_epoint( 2.84 + ("coord"->>0)::float8, 2.85 ("coord"->>1)::float8, 2.86 - ("coord"->>0)::float8, 2.87 $2 2.88 ) 2.89 )) 2.90 @@ -1604,12 +1628,12 @@ 2.91 ( SELECT ecluster_concat(array_agg( 2.92 ( SELECT ecluster_create_polygon(array_agg( 2.93 coords_to_epoint( 2.94 + ("coord"->>0)::float8, 2.95 ("coord"->>1)::float8, 2.96 - ("coord"->>0)::float8, 2.97 $2 2.98 ) 2.99 )) 2.100 - FROM jsonb_array_elements("coord_array") AS "coord" 2.101 + FROM GeoJSON_LinearRing_vertices("coord_array", $2) AS "coord" 2.102 ) 2.103 )) 2.104 FROM jsonb_array_elements($1->'coordinates') AS "coord_array" 2.105 @@ -1619,12 +1643,12 @@ 2.106 ( SELECT ecluster_concat(array_agg( 2.107 ( SELECT ecluster_create_polygon(array_agg( 2.108 coords_to_epoint( 2.109 + ("coord"->>0)::float8, 2.110 ("coord"->>1)::float8, 2.111 - ("coord"->>0)::float8, 2.112 $2 2.113 ) 2.114 )) 2.115 - FROM jsonb_array_elements("coord_array") AS "coord" 2.116 + FROM GeoJSON_LinearRing_vertices("coord_array", $2) AS "coord" 2.117 ) 2.118 )) 2.119 FROM jsonb_array_elements("coord_array_array") AS "coord_array" 2.120 @@ -1632,6 +1656,12 @@ 2.121 )) 2.122 FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array" 2.123 ) 2.124 + WHEN 'GeometryCollection' THEN 2.125 + ( SELECT ecluster_concat(array_agg( 2.126 + GeoJSON_to_ecluster("geometry", $2) 2.127 + )) 2.128 + FROM jsonb_array_elements($1->'geometries') AS "geometry" 2.129 + ) 2.130 WHEN 'Feature' THEN 2.131 GeoJSON_to_ecluster($1->'geometry', $2) 2.132 WHEN 'FeatureCollection' THEN