pgLatLon
diff latlon--0.4.sql @ 16:e319679cefbd
Added more operators for clusters (including polygons); Bugfix regarding missing entries in ecluster_ops operator class (index was not used for nearest-neighbor searches)
author | jbe |
---|---|
date | Fri Sep 09 19:22:30 2016 +0200 (2016-09-09) |
parents | 95f185a648a4 |
children |
line diff
1.1 --- a/latlon--0.4.sql Sat Sep 03 16:00:22 2016 +0200 1.2 +++ b/latlon--0.4.sql Fri Sep 09 19:22:30 2016 +0200 1.3 @@ -767,11 +767,21 @@ 1.4 LANGUAGE C IMMUTABLE STRICT 1.5 AS '$libdir/latlon-v0004', 'pgl_ecircle_ecluster_may_overlap'; 1.6 1.7 +CREATE FUNCTION ecluster_overlap_proc(ecluster, ecluster) 1.8 + RETURNS boolean 1.9 + LANGUAGE C IMMUTABLE STRICT 1.10 + AS '$libdir/latlon-v0004', 'pgl_ecluster_overlap'; 1.11 + 1.12 CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster) 1.13 RETURNS boolean 1.14 LANGUAGE C IMMUTABLE STRICT 1.15 AS '$libdir/latlon-v0004', 'pgl_ecluster_may_overlap'; 1.16 1.17 +CREATE FUNCTION ecluster_contains_proc(ecluster, ecluster) 1.18 + RETURNS boolean 1.19 + LANGUAGE C IMMUTABLE STRICT 1.20 + AS '$libdir/latlon-v0004', 'pgl_ecluster_contains'; 1.21 + 1.22 CREATE FUNCTION epoint_distance_proc(epoint, epoint) 1.23 RETURNS float8 1.24 LANGUAGE C IMMUTABLE STRICT 1.25 @@ -797,6 +807,11 @@ 1.26 LANGUAGE C IMMUTABLE STRICT 1.27 AS '$libdir/latlon-v0004', 'pgl_ecircle_ecluster_distance'; 1.28 1.29 +CREATE FUNCTION ecluster_distance_proc(ecluster, ecluster) 1.30 + RETURNS float8 1.31 + LANGUAGE C IMMUTABLE STRICT 1.32 + AS '$libdir/latlon-v0004', 'pgl_ecluster_distance'; 1.33 + 1.34 CREATE OPERATOR && ( 1.35 leftarg = epoint, 1.36 rightarg = ebox, 1.37 @@ -903,6 +918,67 @@ 1.38 join = areajoinsel 1.39 ); 1.40 1.41 +CREATE OPERATOR && ( 1.42 + leftarg = ecluster, 1.43 + rightarg = ecluster, 1.44 + procedure = ecluster_overlap_proc, 1.45 + commutator = &&, 1.46 + restrict = areasel, 1.47 + join = areajoinsel 1.48 +); 1.49 + 1.50 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle) 1.51 + RETURNS boolean 1.52 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2'; 1.53 + 1.54 +CREATE OPERATOR && ( 1.55 + leftarg = ebox, 1.56 + rightarg = ecircle, 1.57 + procedure = ebox_ecircle_overlap_castwrap, 1.58 + commutator = &&, 1.59 + restrict = areasel, 1.60 + join = areajoinsel 1.61 +); 1.62 + 1.63 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox) 1.64 + RETURNS boolean 1.65 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster'; 1.66 + 1.67 +CREATE OPERATOR && ( 1.68 + leftarg = ecircle, 1.69 + rightarg = ebox, 1.70 + procedure = ebox_ecircle_overlap_castwrap, 1.71 + commutator = &&, 1.72 + restrict = areasel, 1.73 + join = areajoinsel 1.74 +); 1.75 + 1.76 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster) 1.77 + RETURNS boolean 1.78 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2'; 1.79 + 1.80 +CREATE OPERATOR && ( 1.81 + leftarg = ebox, 1.82 + rightarg = ecluster, 1.83 + procedure = ebox_ecluster_overlap_castwrap, 1.84 + commutator = &&, 1.85 + restrict = areasel, 1.86 + join = areajoinsel 1.87 +); 1.88 + 1.89 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox) 1.90 + RETURNS boolean 1.91 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster'; 1.92 + 1.93 +CREATE OPERATOR && ( 1.94 + leftarg = ecluster, 1.95 + rightarg = ebox, 1.96 + procedure = ebox_ecluster_overlap_castwrap, 1.97 + commutator = &&, 1.98 + restrict = areasel, 1.99 + join = areajoinsel 1.100 +); 1.101 + 1.102 CREATE OPERATOR &&+ ( 1.103 leftarg = epoint, 1.104 rightarg = ecluster, 1.105 @@ -1000,6 +1076,116 @@ 1.106 join = areajoinsel 1.107 ); 1.108 1.109 +CREATE OPERATOR @> ( 1.110 + leftarg = ebox, 1.111 + rightarg = epoint, 1.112 + procedure = epoint_ebox_overlap_commutator, 1.113 + commutator = <@, 1.114 + restrict = areasel, 1.115 + join = areajoinsel 1.116 +); 1.117 + 1.118 +CREATE OPERATOR <@ ( 1.119 + leftarg = epoint, 1.120 + rightarg = ebox, 1.121 + procedure = epoint_ebox_overlap_proc, 1.122 + commutator = @>, 1.123 + restrict = areasel, 1.124 + join = areajoinsel 1.125 +); 1.126 + 1.127 +CREATE OPERATOR @> ( 1.128 + leftarg = ecluster, 1.129 + rightarg = epoint, 1.130 + procedure = epoint_ecluster_overlap_commutator, 1.131 + commutator = <@, 1.132 + restrict = areasel, 1.133 + join = areajoinsel 1.134 +); 1.135 + 1.136 +CREATE OPERATOR <@ ( 1.137 + leftarg = epoint, 1.138 + rightarg = ecluster, 1.139 + procedure = epoint_ecluster_overlap_proc, 1.140 + commutator = <@, 1.141 + restrict = areasel, 1.142 + join = areajoinsel 1.143 +); 1.144 + 1.145 +CREATE OPERATOR @> ( 1.146 + leftarg = ecluster, 1.147 + rightarg = ecluster, 1.148 + procedure = ecluster_contains_proc, 1.149 + commutator = <@, 1.150 + restrict = areasel, 1.151 + join = areajoinsel 1.152 +); 1.153 + 1.154 +CREATE FUNCTION ecluster_contains_commutator(ecluster, ecluster) 1.155 + RETURNS boolean 1.156 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1'; 1.157 + 1.158 +CREATE OPERATOR <@ ( 1.159 + leftarg = ecluster, 1.160 + rightarg = ecluster, 1.161 + procedure = ecluster_contains_commutator, 1.162 + commutator = @>, 1.163 + restrict = areasel, 1.164 + join = areajoinsel 1.165 +); 1.166 + 1.167 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster) 1.168 + RETURNS boolean 1.169 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2'; 1.170 + 1.171 +CREATE OPERATOR @> ( 1.172 + leftarg = ebox, 1.173 + rightarg = ecluster, 1.174 + procedure = ebox_ecluster_contains_castwrap, 1.175 + commutator = <@, 1.176 + restrict = areasel, 1.177 + join = areajoinsel 1.178 +); 1.179 + 1.180 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox) 1.181 + RETURNS boolean 1.182 + LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1'; 1.183 + 1.184 +CREATE OPERATOR <@ ( 1.185 + leftarg = ecluster, 1.186 + rightarg = ebox, 1.187 + procedure = ebox_ecluster_contains_castwrap, 1.188 + commutator = @>, 1.189 + restrict = areasel, 1.190 + join = areajoinsel 1.191 +); 1.192 + 1.193 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox) 1.194 + RETURNS boolean 1.195 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 @> $2::ecluster'; 1.196 + 1.197 +CREATE OPERATOR @> ( 1.198 + leftarg = ecluster, 1.199 + rightarg = ebox, 1.200 + procedure = ecluster_ebox_contains_castwrap, 1.201 + commutator = <@, 1.202 + restrict = areasel, 1.203 + join = areajoinsel 1.204 +); 1.205 + 1.206 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster) 1.207 + RETURNS boolean 1.208 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1::ecluster'; 1.209 + 1.210 +CREATE OPERATOR <@ ( 1.211 + leftarg = ebox, 1.212 + rightarg = ecluster, 1.213 + procedure = ecluster_ebox_contains_castwrap, 1.214 + commutator = @>, 1.215 + restrict = areasel, 1.216 + join = areajoinsel 1.217 +); 1.218 + 1.219 CREATE OPERATOR <-> ( 1.220 leftarg = epoint, 1.221 rightarg = epoint, 1.222 @@ -1068,6 +1254,90 @@ 1.223 commutator = <-> 1.224 ); 1.225 1.226 +CREATE OPERATOR <-> ( 1.227 + leftarg = ecluster, 1.228 + rightarg = ecluster, 1.229 + procedure = ecluster_distance_proc, 1.230 + commutator = <-> 1.231 +); 1.232 + 1.233 +CREATE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox) 1.234 + RETURNS float8 1.235 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.236 + 1.237 +CREATE OPERATOR <-> ( 1.238 + leftarg = epoint, 1.239 + rightarg = ebox, 1.240 + procedure = epoint_ebox_distance_castwrap, 1.241 + commutator = <-> 1.242 +); 1.243 + 1.244 +CREATE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint) 1.245 + RETURNS float8 1.246 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.247 + 1.248 +CREATE OPERATOR <-> ( 1.249 + leftarg = ebox, 1.250 + rightarg = epoint, 1.251 + procedure = epoint_ebox_distance_castwrap, 1.252 + commutator = <-> 1.253 +); 1.254 + 1.255 +CREATE FUNCTION ebox_distance_castwrap(ebox, ebox) 1.256 + RETURNS float8 1.257 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2::ecluster'; 1.258 + 1.259 +CREATE OPERATOR <-> ( 1.260 + leftarg = ebox, 1.261 + rightarg = ebox, 1.262 + procedure = ebox_distance_castwrap, 1.263 + commutator = <-> 1.264 +); 1.265 + 1.266 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle) 1.267 + RETURNS float8 1.268 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.269 + 1.270 +CREATE OPERATOR <-> ( 1.271 + leftarg = ebox, 1.272 + rightarg = ecircle, 1.273 + procedure = ebox_ecircle_distance_castwrap, 1.274 + commutator = <-> 1.275 +); 1.276 + 1.277 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox) 1.278 + RETURNS float8 1.279 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.280 + 1.281 +CREATE OPERATOR <-> ( 1.282 + leftarg = ecircle, 1.283 + rightarg = ebox, 1.284 + procedure = ebox_ecircle_distance_castwrap, 1.285 + commutator = <-> 1.286 +); 1.287 + 1.288 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster) 1.289 + RETURNS float8 1.290 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.291 + 1.292 +CREATE OPERATOR <-> ( 1.293 + leftarg = ebox, 1.294 + rightarg = ecluster, 1.295 + procedure = ebox_ecluster_distance_castwrap, 1.296 + commutator = <-> 1.297 +); 1.298 + 1.299 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox) 1.300 + RETURNS float8 1.301 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.302 + 1.303 +CREATE OPERATOR <-> ( 1.304 + leftarg = ecluster, 1.305 + rightarg = ebox, 1.306 + procedure = ebox_ecluster_distance_castwrap, 1.307 + commutator = <-> 1.308 +); 1.309 + 1.310 1.311 ---------------- 1.312 -- GiST index -- 1.313 @@ -1127,10 +1397,13 @@ 1.314 DEFAULT FOR TYPE epoint USING gist AS 1.315 OPERATOR 11 = , 1.316 OPERATOR 22 && (epoint, ebox), 1.317 + OPERATOR 222 <@ (epoint, ebox), 1.318 OPERATOR 23 && (epoint, ecircle), 1.319 OPERATOR 24 && (epoint, ecluster), 1.320 OPERATOR 124 &&+ (epoint, ecluster), 1.321 + OPERATOR 224 <@ (epoint, ecluster), 1.322 OPERATOR 31 <-> (epoint, epoint) FOR ORDER BY float_ops, 1.323 + OPERATOR 32 <-> (epoint, ebox) FOR ORDER BY float_ops, 1.324 OPERATOR 33 <-> (epoint, ecircle) FOR ORDER BY float_ops, 1.325 OPERATOR 34 <-> (epoint, ecluster) FOR ORDER BY float_ops, 1.326 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.327 @@ -1147,11 +1420,13 @@ 1.328 DEFAULT FOR TYPE ecircle USING gist AS 1.329 OPERATOR 13 = , 1.330 OPERATOR 21 && (ecircle, epoint), 1.331 + OPERATOR 22 && (ecircle, ebox), 1.332 OPERATOR 122 &&+ (ecircle, ebox), 1.333 OPERATOR 23 && (ecircle, ecircle), 1.334 OPERATOR 24 && (ecircle, ecluster), 1.335 OPERATOR 124 &&+ (ecircle, ecluster), 1.336 OPERATOR 31 <-> (ecircle, epoint) FOR ORDER BY float_ops, 1.337 + OPERATOR 32 <-> (ecircle, ebox) FOR ORDER BY float_ops, 1.338 OPERATOR 33 <-> (ecircle, ecircle) FOR ORDER BY float_ops, 1.339 OPERATOR 34 <-> (ecircle, ecluster) FOR ORDER BY float_ops, 1.340 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.341 @@ -1168,10 +1443,21 @@ 1.342 DEFAULT FOR TYPE ecluster USING gist AS 1.343 OPERATOR 21 && (ecluster, epoint), 1.344 OPERATOR 121 &&+ (ecluster, epoint), 1.345 + OPERATOR 221 @> (ecluster, epoint), 1.346 + OPERATOR 22 && (ecluster, ebox), 1.347 OPERATOR 122 &&+ (ecluster, ebox), 1.348 + OPERATOR 222 @> (ecluster, ebox), 1.349 + OPERATOR 322 <@ (ecluster, ebox), 1.350 OPERATOR 23 && (ecluster, ecircle), 1.351 OPERATOR 123 &&+ (ecluster, ecircle), 1.352 + OPERATOR 24 && (ecluster, ecluster), 1.353 OPERATOR 124 &&+ (ecluster, ecluster), 1.354 + OPERATOR 224 @> (ecluster, ecluster), 1.355 + OPERATOR 324 <@ (ecluster, ecluster), 1.356 + OPERATOR 31 <-> (ecluster, epoint) FOR ORDER BY float_ops, 1.357 + OPERATOR 32 <-> (ecluster, ebox) FOR ORDER BY float_ops, 1.358 + OPERATOR 33 <-> (ecluster, ecircle) FOR ORDER BY float_ops, 1.359 + OPERATOR 34 <-> (ecluster, ecluster) FOR ORDER BY float_ops, 1.360 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.361 FUNCTION 2 pgl_gist_union(internal, internal), 1.362 FUNCTION 3 pgl_gist_compress_ecluster(internal),