pgLatLon
diff latlon--0.7.sql @ 29:868220477afb
Added files for next version 0.7 (latlon-v0007.c)
author | jbe |
---|---|
date | Sat Sep 24 01:23:11 2016 +0200 (2016-09-24) |
parents | latlon--0.6.sql@6b4bdf99eb64 |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/latlon--0.7.sql Sat Sep 24 01:23:11 2016 +0200 1.3 @@ -0,0 +1,1647 @@ 1.4 + 1.5 +---------------------------------------- 1.6 +-- forward declarations (shell types) -- 1.7 +---------------------------------------- 1.8 + 1.9 +CREATE TYPE epoint; 1.10 +CREATE TYPE ebox; 1.11 +CREATE TYPE ecircle; 1.12 +CREATE TYPE ecluster; 1.13 + 1.14 + 1.15 +------------------------------------------------------------ 1.16 +-- dummy input/output functions for dummy index key types -- 1.17 +------------------------------------------------------------ 1.18 + 1.19 +CREATE FUNCTION ekey_point_in_dummy(cstring) 1.20 + RETURNS ekey_point 1.21 + LANGUAGE C IMMUTABLE STRICT 1.22 + AS '$libdir/latlon-v0007', 'pgl_notimpl'; 1.23 + 1.24 +CREATE FUNCTION ekey_point_out_dummy(ekey_point) 1.25 + RETURNS cstring 1.26 + LANGUAGE C IMMUTABLE STRICT 1.27 + AS '$libdir/latlon-v0007', 'pgl_notimpl'; 1.28 + 1.29 +CREATE FUNCTION ekey_area_in_dummy(cstring) 1.30 + RETURNS ekey_area 1.31 + LANGUAGE C IMMUTABLE STRICT 1.32 + AS '$libdir/latlon-v0007', 'pgl_notimpl'; 1.33 + 1.34 +CREATE FUNCTION ekey_area_out_dummy(ekey_area) 1.35 + RETURNS cstring 1.36 + LANGUAGE C IMMUTABLE STRICT 1.37 + AS '$libdir/latlon-v0007', 'pgl_notimpl'; 1.38 + 1.39 + 1.40 +-------------------------- 1.41 +-- text input functions -- 1.42 +-------------------------- 1.43 + 1.44 +CREATE FUNCTION epoint_in(cstring) 1.45 + RETURNS epoint 1.46 + LANGUAGE C IMMUTABLE STRICT 1.47 + AS '$libdir/latlon-v0007', 'pgl_epoint_in'; 1.48 + 1.49 +CREATE FUNCTION ebox_in(cstring) 1.50 + RETURNS ebox 1.51 + LANGUAGE C IMMUTABLE STRICT 1.52 + AS '$libdir/latlon-v0007', 'pgl_ebox_in'; 1.53 + 1.54 +CREATE FUNCTION ecircle_in(cstring) 1.55 + RETURNS ecircle 1.56 + LANGUAGE C IMMUTABLE STRICT 1.57 + AS '$libdir/latlon-v0007', 'pgl_ecircle_in'; 1.58 + 1.59 +CREATE FUNCTION ecluster_in(cstring) 1.60 + RETURNS ecluster 1.61 + LANGUAGE C IMMUTABLE STRICT 1.62 + AS '$libdir/latlon-v0007', 'pgl_ecluster_in'; 1.63 + 1.64 + 1.65 +--------------------------- 1.66 +-- text output functions -- 1.67 +--------------------------- 1.68 + 1.69 +CREATE FUNCTION epoint_out(epoint) 1.70 + RETURNS cstring 1.71 + LANGUAGE C IMMUTABLE STRICT 1.72 + AS '$libdir/latlon-v0007', 'pgl_epoint_out'; 1.73 + 1.74 +CREATE FUNCTION ebox_out(ebox) 1.75 + RETURNS cstring 1.76 + LANGUAGE C IMMUTABLE STRICT 1.77 + AS '$libdir/latlon-v0007', 'pgl_ebox_out'; 1.78 + 1.79 +CREATE FUNCTION ecircle_out(ecircle) 1.80 + RETURNS cstring 1.81 + LANGUAGE C IMMUTABLE STRICT 1.82 + AS '$libdir/latlon-v0007', 'pgl_ecircle_out'; 1.83 + 1.84 +CREATE FUNCTION ecluster_out(ecluster) 1.85 + RETURNS cstring 1.86 + LANGUAGE C IMMUTABLE STRICT 1.87 + AS '$libdir/latlon-v0007', 'pgl_ecluster_out'; 1.88 + 1.89 + 1.90 +-------------------------- 1.91 +-- binary I/O functions -- 1.92 +-------------------------- 1.93 + 1.94 +CREATE FUNCTION epoint_recv(internal) 1.95 + RETURNS epoint 1.96 + LANGUAGE C IMMUTABLE STRICT 1.97 + AS '$libdir/latlon-v0007', 'pgl_epoint_recv'; 1.98 + 1.99 +CREATE FUNCTION ebox_recv(internal) 1.100 + RETURNS ebox 1.101 + LANGUAGE C IMMUTABLE STRICT 1.102 + AS '$libdir/latlon-v0007', 'pgl_ebox_recv'; 1.103 + 1.104 +CREATE FUNCTION ecircle_recv(internal) 1.105 + RETURNS ecircle 1.106 + LANGUAGE C IMMUTABLE STRICT 1.107 + AS '$libdir/latlon-v0007', 'pgl_ecircle_recv'; 1.108 + 1.109 +CREATE FUNCTION epoint_send(epoint) 1.110 + RETURNS bytea 1.111 + LANGUAGE C IMMUTABLE STRICT 1.112 + AS '$libdir/latlon-v0007', 'pgl_epoint_send'; 1.113 + 1.114 +CREATE FUNCTION ebox_send(ebox) 1.115 + RETURNS bytea 1.116 + LANGUAGE C IMMUTABLE STRICT 1.117 + AS '$libdir/latlon-v0007', 'pgl_ebox_send'; 1.118 + 1.119 +CREATE FUNCTION ecircle_send(ecircle) 1.120 + RETURNS bytea 1.121 + LANGUAGE C IMMUTABLE STRICT 1.122 + AS '$libdir/latlon-v0007', 'pgl_ecircle_send'; 1.123 + 1.124 + 1.125 +----------------------------------------------- 1.126 +-- type definitions of dummy index key types -- 1.127 +----------------------------------------------- 1.128 + 1.129 +CREATE TYPE ekey_point ( 1.130 + internallength = 8, 1.131 + input = ekey_point_in_dummy, 1.132 + output = ekey_point_out_dummy, 1.133 + alignment = char ); 1.134 + 1.135 +CREATE TYPE ekey_area ( 1.136 + internallength = 9, 1.137 + input = ekey_area_in_dummy, 1.138 + output = ekey_area_out_dummy, 1.139 + alignment = char ); 1.140 + 1.141 + 1.142 +------------------------------------------ 1.143 +-- definitions of geographic data types -- 1.144 +------------------------------------------ 1.145 + 1.146 +CREATE TYPE epoint ( 1.147 + internallength = 16, 1.148 + input = epoint_in, 1.149 + output = epoint_out, 1.150 + receive = epoint_recv, 1.151 + send = epoint_send, 1.152 + alignment = double ); 1.153 + 1.154 +CREATE TYPE ebox ( 1.155 + internallength = 32, 1.156 + input = ebox_in, 1.157 + output = ebox_out, 1.158 + receive = ebox_recv, 1.159 + send = ebox_send, 1.160 + alignment = double ); 1.161 + 1.162 +CREATE TYPE ecircle ( 1.163 + internallength = 24, 1.164 + input = ecircle_in, 1.165 + output = ecircle_out, 1.166 + receive = ecircle_recv, 1.167 + send = ecircle_send, 1.168 + alignment = double ); 1.169 + 1.170 +CREATE TYPE ecluster ( 1.171 + internallength = VARIABLE, 1.172 + input = ecluster_in, 1.173 + output = ecluster_out, 1.174 + alignment = double, 1.175 + storage = external ); 1.176 + 1.177 + 1.178 +-------------------- 1.179 +-- B-tree support -- 1.180 +-------------------- 1.181 + 1.182 +-- begin of B-tree support for epoint 1.183 + 1.184 +CREATE FUNCTION epoint_btree_lt(epoint, epoint) 1.185 + RETURNS boolean 1.186 + LANGUAGE C IMMUTABLE STRICT 1.187 + AS '$libdir/latlon-v0007', 'pgl_btree_epoint_lt'; 1.188 + 1.189 +CREATE FUNCTION epoint_btree_le(epoint, epoint) 1.190 + RETURNS boolean 1.191 + LANGUAGE C IMMUTABLE STRICT 1.192 + AS '$libdir/latlon-v0007', 'pgl_btree_epoint_le'; 1.193 + 1.194 +CREATE FUNCTION epoint_btree_eq(epoint, epoint) 1.195 + RETURNS boolean 1.196 + LANGUAGE C IMMUTABLE STRICT 1.197 + AS '$libdir/latlon-v0007', 'pgl_btree_epoint_eq'; 1.198 + 1.199 +CREATE FUNCTION epoint_btree_ne(epoint, epoint) 1.200 + RETURNS boolean 1.201 + LANGUAGE C IMMUTABLE STRICT 1.202 + AS '$libdir/latlon-v0007', 'pgl_btree_epoint_ne'; 1.203 + 1.204 +CREATE FUNCTION epoint_btree_ge(epoint, epoint) 1.205 + RETURNS boolean 1.206 + LANGUAGE C IMMUTABLE STRICT 1.207 + AS '$libdir/latlon-v0007', 'pgl_btree_epoint_ge'; 1.208 + 1.209 +CREATE FUNCTION epoint_btree_gt(epoint, epoint) 1.210 + RETURNS boolean 1.211 + LANGUAGE C IMMUTABLE STRICT 1.212 + AS '$libdir/latlon-v0007', 'pgl_btree_epoint_gt'; 1.213 + 1.214 +CREATE OPERATOR <<< ( 1.215 + leftarg = epoint, 1.216 + rightarg = epoint, 1.217 + procedure = epoint_btree_lt, 1.218 + commutator = >>>, 1.219 + negator = >>>=, 1.220 + restrict = scalarltsel, 1.221 + join = scalarltjoinsel 1.222 +); 1.223 + 1.224 +CREATE OPERATOR <<<= ( 1.225 + leftarg = epoint, 1.226 + rightarg = epoint, 1.227 + procedure = epoint_btree_le, 1.228 + commutator = >>>=, 1.229 + negator = >>>, 1.230 + restrict = scalarltsel, 1.231 + join = scalarltjoinsel 1.232 +); 1.233 + 1.234 +CREATE OPERATOR = ( 1.235 + leftarg = epoint, 1.236 + rightarg = epoint, 1.237 + procedure = epoint_btree_eq, 1.238 + commutator = =, 1.239 + negator = <>, 1.240 + restrict = eqsel, 1.241 + join = eqjoinsel, 1.242 + merges 1.243 +); 1.244 + 1.245 +CREATE OPERATOR <> ( 1.246 + leftarg = epoint, 1.247 + rightarg = epoint, 1.248 + procedure = epoint_btree_eq, 1.249 + commutator = <>, 1.250 + negator = =, 1.251 + restrict = neqsel, 1.252 + join = neqjoinsel 1.253 +); 1.254 + 1.255 +CREATE OPERATOR >>>= ( 1.256 + leftarg = epoint, 1.257 + rightarg = epoint, 1.258 + procedure = epoint_btree_ge, 1.259 + commutator = <<<=, 1.260 + negator = <<<, 1.261 + restrict = scalargtsel, 1.262 + join = scalargtjoinsel 1.263 +); 1.264 + 1.265 +CREATE OPERATOR >>> ( 1.266 + leftarg = epoint, 1.267 + rightarg = epoint, 1.268 + procedure = epoint_btree_gt, 1.269 + commutator = <<<, 1.270 + negator = <<<=, 1.271 + restrict = scalargtsel, 1.272 + join = scalargtjoinsel 1.273 +); 1.274 + 1.275 +CREATE FUNCTION epoint_btree_cmp(epoint, epoint) 1.276 + RETURNS int4 1.277 + LANGUAGE C IMMUTABLE STRICT 1.278 + AS '$libdir/latlon-v0007', 'pgl_btree_epoint_cmp'; 1.279 + 1.280 +CREATE OPERATOR CLASS epoint_btree_ops 1.281 + DEFAULT FOR TYPE epoint USING btree AS 1.282 + OPERATOR 1 <<< , 1.283 + OPERATOR 2 <<<= , 1.284 + OPERATOR 3 = , 1.285 + OPERATOR 4 >>>= , 1.286 + OPERATOR 5 >>> , 1.287 + FUNCTION 1 epoint_btree_cmp(epoint, epoint); 1.288 + 1.289 +-- end of B-tree support for epoint 1.290 + 1.291 +-- begin of B-tree support for ebox 1.292 + 1.293 +CREATE FUNCTION ebox_btree_lt(ebox, ebox) 1.294 + RETURNS boolean 1.295 + LANGUAGE C IMMUTABLE STRICT 1.296 + AS '$libdir/latlon-v0007', 'pgl_btree_ebox_lt'; 1.297 + 1.298 +CREATE FUNCTION ebox_btree_le(ebox, ebox) 1.299 + RETURNS boolean 1.300 + LANGUAGE C IMMUTABLE STRICT 1.301 + AS '$libdir/latlon-v0007', 'pgl_btree_ebox_le'; 1.302 + 1.303 +CREATE FUNCTION ebox_btree_eq(ebox, ebox) 1.304 + RETURNS boolean 1.305 + LANGUAGE C IMMUTABLE STRICT 1.306 + AS '$libdir/latlon-v0007', 'pgl_btree_ebox_eq'; 1.307 + 1.308 +CREATE FUNCTION ebox_btree_ne(ebox, ebox) 1.309 + RETURNS boolean 1.310 + LANGUAGE C IMMUTABLE STRICT 1.311 + AS '$libdir/latlon-v0007', 'pgl_btree_ebox_ne'; 1.312 + 1.313 +CREATE FUNCTION ebox_btree_ge(ebox, ebox) 1.314 + RETURNS boolean 1.315 + LANGUAGE C IMMUTABLE STRICT 1.316 + AS '$libdir/latlon-v0007', 'pgl_btree_ebox_ge'; 1.317 + 1.318 +CREATE FUNCTION ebox_btree_gt(ebox, ebox) 1.319 + RETURNS boolean 1.320 + LANGUAGE C IMMUTABLE STRICT 1.321 + AS '$libdir/latlon-v0007', 'pgl_btree_ebox_gt'; 1.322 + 1.323 +CREATE OPERATOR <<< ( 1.324 + leftarg = ebox, 1.325 + rightarg = ebox, 1.326 + procedure = ebox_btree_lt, 1.327 + commutator = >>>, 1.328 + negator = >>>=, 1.329 + restrict = scalarltsel, 1.330 + join = scalarltjoinsel 1.331 +); 1.332 + 1.333 +CREATE OPERATOR <<<= ( 1.334 + leftarg = ebox, 1.335 + rightarg = ebox, 1.336 + procedure = ebox_btree_le, 1.337 + commutator = >>>=, 1.338 + negator = >>>, 1.339 + restrict = scalarltsel, 1.340 + join = scalarltjoinsel 1.341 +); 1.342 + 1.343 +CREATE OPERATOR = ( 1.344 + leftarg = ebox, 1.345 + rightarg = ebox, 1.346 + procedure = ebox_btree_eq, 1.347 + commutator = =, 1.348 + negator = <>, 1.349 + restrict = eqsel, 1.350 + join = eqjoinsel, 1.351 + merges 1.352 +); 1.353 + 1.354 +CREATE OPERATOR <> ( 1.355 + leftarg = ebox, 1.356 + rightarg = ebox, 1.357 + procedure = ebox_btree_eq, 1.358 + commutator = <>, 1.359 + negator = =, 1.360 + restrict = neqsel, 1.361 + join = neqjoinsel 1.362 +); 1.363 + 1.364 +CREATE OPERATOR >>>= ( 1.365 + leftarg = ebox, 1.366 + rightarg = ebox, 1.367 + procedure = ebox_btree_ge, 1.368 + commutator = <<<=, 1.369 + negator = <<<, 1.370 + restrict = scalargtsel, 1.371 + join = scalargtjoinsel 1.372 +); 1.373 + 1.374 +CREATE OPERATOR >>> ( 1.375 + leftarg = ebox, 1.376 + rightarg = ebox, 1.377 + procedure = ebox_btree_gt, 1.378 + commutator = <<<, 1.379 + negator = <<<=, 1.380 + restrict = scalargtsel, 1.381 + join = scalargtjoinsel 1.382 +); 1.383 + 1.384 +CREATE FUNCTION ebox_btree_cmp(ebox, ebox) 1.385 + RETURNS int4 1.386 + LANGUAGE C IMMUTABLE STRICT 1.387 + AS '$libdir/latlon-v0007', 'pgl_btree_ebox_cmp'; 1.388 + 1.389 +CREATE OPERATOR CLASS ebox_btree_ops 1.390 + DEFAULT FOR TYPE ebox USING btree AS 1.391 + OPERATOR 1 <<< , 1.392 + OPERATOR 2 <<<= , 1.393 + OPERATOR 3 = , 1.394 + OPERATOR 4 >>>= , 1.395 + OPERATOR 5 >>> , 1.396 + FUNCTION 1 ebox_btree_cmp(ebox, ebox); 1.397 + 1.398 +-- end of B-tree support for ebox 1.399 + 1.400 +-- begin of B-tree support for ecircle 1.401 + 1.402 +CREATE FUNCTION ecircle_btree_lt(ecircle, ecircle) 1.403 + RETURNS boolean 1.404 + LANGUAGE C IMMUTABLE STRICT 1.405 + AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_lt'; 1.406 + 1.407 +CREATE FUNCTION ecircle_btree_le(ecircle, ecircle) 1.408 + RETURNS boolean 1.409 + LANGUAGE C IMMUTABLE STRICT 1.410 + AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_le'; 1.411 + 1.412 +CREATE FUNCTION ecircle_btree_eq(ecircle, ecircle) 1.413 + RETURNS boolean 1.414 + LANGUAGE C IMMUTABLE STRICT 1.415 + AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_eq'; 1.416 + 1.417 +CREATE FUNCTION ecircle_btree_ne(ecircle, ecircle) 1.418 + RETURNS boolean 1.419 + LANGUAGE C IMMUTABLE STRICT 1.420 + AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_ne'; 1.421 + 1.422 +CREATE FUNCTION ecircle_btree_ge(ecircle, ecircle) 1.423 + RETURNS boolean 1.424 + LANGUAGE C IMMUTABLE STRICT 1.425 + AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_ge'; 1.426 + 1.427 +CREATE FUNCTION ecircle_btree_gt(ecircle, ecircle) 1.428 + RETURNS boolean 1.429 + LANGUAGE C IMMUTABLE STRICT 1.430 + AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_gt'; 1.431 + 1.432 +CREATE OPERATOR <<< ( 1.433 + leftarg = ecircle, 1.434 + rightarg = ecircle, 1.435 + procedure = ecircle_btree_lt, 1.436 + commutator = >>>, 1.437 + negator = >>>=, 1.438 + restrict = scalarltsel, 1.439 + join = scalarltjoinsel 1.440 +); 1.441 + 1.442 +CREATE OPERATOR <<<= ( 1.443 + leftarg = ecircle, 1.444 + rightarg = ecircle, 1.445 + procedure = ecircle_btree_le, 1.446 + commutator = >>>=, 1.447 + negator = >>>, 1.448 + restrict = scalarltsel, 1.449 + join = scalarltjoinsel 1.450 +); 1.451 + 1.452 +CREATE OPERATOR = ( 1.453 + leftarg = ecircle, 1.454 + rightarg = ecircle, 1.455 + procedure = ecircle_btree_eq, 1.456 + commutator = =, 1.457 + negator = <>, 1.458 + restrict = eqsel, 1.459 + join = eqjoinsel, 1.460 + merges 1.461 +); 1.462 + 1.463 +CREATE OPERATOR <> ( 1.464 + leftarg = ecircle, 1.465 + rightarg = ecircle, 1.466 + procedure = ecircle_btree_eq, 1.467 + commutator = <>, 1.468 + negator = =, 1.469 + restrict = neqsel, 1.470 + join = neqjoinsel 1.471 +); 1.472 + 1.473 +CREATE OPERATOR >>>= ( 1.474 + leftarg = ecircle, 1.475 + rightarg = ecircle, 1.476 + procedure = ecircle_btree_ge, 1.477 + commutator = <<<=, 1.478 + negator = <<<, 1.479 + restrict = scalargtsel, 1.480 + join = scalargtjoinsel 1.481 +); 1.482 + 1.483 +CREATE OPERATOR >>> ( 1.484 + leftarg = ecircle, 1.485 + rightarg = ecircle, 1.486 + procedure = ecircle_btree_gt, 1.487 + commutator = <<<, 1.488 + negator = <<<=, 1.489 + restrict = scalargtsel, 1.490 + join = scalargtjoinsel 1.491 +); 1.492 + 1.493 +CREATE FUNCTION ecircle_btree_cmp(ecircle, ecircle) 1.494 + RETURNS int4 1.495 + LANGUAGE C IMMUTABLE STRICT 1.496 + AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_cmp'; 1.497 + 1.498 +CREATE OPERATOR CLASS ecircle_btree_ops 1.499 + DEFAULT FOR TYPE ecircle USING btree AS 1.500 + OPERATOR 1 <<< , 1.501 + OPERATOR 2 <<<= , 1.502 + OPERATOR 3 = , 1.503 + OPERATOR 4 >>>= , 1.504 + OPERATOR 5 >>> , 1.505 + FUNCTION 1 ecircle_btree_cmp(ecircle, ecircle); 1.506 + 1.507 +-- end of B-tree support for ecircle 1.508 + 1.509 + 1.510 +---------------- 1.511 +-- type casts -- 1.512 +---------------- 1.513 + 1.514 +CREATE FUNCTION cast_epoint_to_ebox(epoint) 1.515 + RETURNS ebox 1.516 + LANGUAGE C IMMUTABLE STRICT 1.517 + AS '$libdir/latlon-v0007', 'pgl_epoint_to_ebox'; 1.518 + 1.519 +CREATE CAST (epoint AS ebox) WITH FUNCTION cast_epoint_to_ebox(epoint); 1.520 + 1.521 +CREATE FUNCTION cast_epoint_to_ecircle(epoint) 1.522 + RETURNS ecircle 1.523 + LANGUAGE C IMMUTABLE STRICT 1.524 + AS '$libdir/latlon-v0007', 'pgl_epoint_to_ecircle'; 1.525 + 1.526 +CREATE CAST (epoint AS ecircle) WITH FUNCTION cast_epoint_to_ecircle(epoint); 1.527 + 1.528 +CREATE FUNCTION cast_epoint_to_ecluster(epoint) 1.529 + RETURNS ecluster 1.530 + LANGUAGE C IMMUTABLE STRICT 1.531 + AS '$libdir/latlon-v0007', 'pgl_epoint_to_ecluster'; 1.532 + 1.533 +CREATE CAST (epoint AS ecluster) WITH FUNCTION cast_epoint_to_ecluster(epoint); 1.534 + 1.535 +CREATE FUNCTION cast_ebox_to_ecluster(ebox) 1.536 + RETURNS ecluster 1.537 + LANGUAGE C IMMUTABLE STRICT 1.538 + AS '$libdir/latlon-v0007', 'pgl_ebox_to_ecluster'; 1.539 + 1.540 +CREATE CAST (ebox AS ecluster) WITH FUNCTION cast_ebox_to_ecluster(ebox); 1.541 + 1.542 + 1.543 +--------------------------- 1.544 +-- constructor functions -- 1.545 +--------------------------- 1.546 + 1.547 +CREATE FUNCTION epoint(float8, float8) 1.548 + RETURNS epoint 1.549 + LANGUAGE C IMMUTABLE STRICT 1.550 + AS '$libdir/latlon-v0007', 'pgl_create_epoint'; 1.551 + 1.552 +CREATE FUNCTION epoint_latlon(float8, float8) 1.553 + RETURNS epoint 1.554 + LANGUAGE SQL IMMUTABLE STRICT AS $$ 1.555 + SELECT epoint($1, $2) 1.556 + $$; 1.557 + 1.558 +CREATE FUNCTION epoint_lonlat(float8, float8) 1.559 + RETURNS epoint 1.560 + LANGUAGE SQL IMMUTABLE STRICT AS $$ 1.561 + SELECT epoint($2, $1) 1.562 + $$; 1.563 + 1.564 +CREATE FUNCTION empty_ebox() 1.565 + RETURNS ebox 1.566 + LANGUAGE C IMMUTABLE STRICT 1.567 + AS '$libdir/latlon-v0007', 'pgl_create_empty_ebox'; 1.568 + 1.569 +CREATE FUNCTION ebox(float8, float8, float8, float8) 1.570 + RETURNS ebox 1.571 + LANGUAGE C IMMUTABLE STRICT 1.572 + AS '$libdir/latlon-v0007', 'pgl_create_ebox'; 1.573 + 1.574 +CREATE FUNCTION ebox(epoint, epoint) 1.575 + RETURNS ebox 1.576 + LANGUAGE C IMMUTABLE STRICT 1.577 + AS '$libdir/latlon-v0007', 'pgl_create_ebox_from_epoints'; 1.578 + 1.579 +CREATE FUNCTION ecircle(float8, float8, float8) 1.580 + RETURNS ecircle 1.581 + LANGUAGE C IMMUTABLE STRICT 1.582 + AS '$libdir/latlon-v0007', 'pgl_create_ecircle'; 1.583 + 1.584 +CREATE FUNCTION ecircle(epoint, float8) 1.585 + RETURNS ecircle 1.586 + LANGUAGE C IMMUTABLE STRICT 1.587 + AS '$libdir/latlon-v0007', 'pgl_create_ecircle_from_epoint'; 1.588 + 1.589 +CREATE FUNCTION ecluster_concat(ecluster[]) 1.590 + RETURNS ecluster 1.591 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.592 + SELECT array_to_string($1, ' ')::ecluster 1.593 + $$; 1.594 + 1.595 +CREATE FUNCTION ecluster_concat(ecluster, ecluster) 1.596 + RETURNS ecluster 1.597 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.598 + SELECT ($1::text || ' ' || $2::text)::ecluster 1.599 + $$; 1.600 + 1.601 +CREATE FUNCTION ecluster_create_multipoint(epoint[]) 1.602 + RETURNS ecluster 1.603 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.604 + SELECT 1.605 + array_to_string(array_agg('point (' || unnest || ')'), ' ')::ecluster 1.606 + FROM unnest($1) 1.607 + $$; 1.608 + 1.609 +CREATE FUNCTION ecluster_create_path(epoint[]) 1.610 + RETURNS ecluster 1.611 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.612 + SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE 1.613 + ('path (' || array_to_string($1, ' ') || ')')::ecluster 1.614 + END 1.615 + FROM array_to_string($1, ' ') AS "str" 1.616 + $$; 1.617 + 1.618 +CREATE FUNCTION ecluster_create_outline(epoint[]) 1.619 + RETURNS ecluster 1.620 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.621 + SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE 1.622 + ('outline (' || array_to_string($1, ' ') || ')')::ecluster 1.623 + END 1.624 + FROM array_to_string($1, ' ') AS "str" 1.625 + $$; 1.626 + 1.627 +CREATE FUNCTION ecluster_create_polygon(epoint[]) 1.628 + RETURNS ecluster 1.629 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.630 + SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE 1.631 + ('polygon (' || array_to_string($1, ' ') || ')')::ecluster 1.632 + END 1.633 + FROM array_to_string($1, ' ') AS "str" 1.634 + $$; 1.635 + 1.636 + 1.637 +---------------------- 1.638 +-- getter functions -- 1.639 +---------------------- 1.640 + 1.641 +CREATE FUNCTION latitude(epoint) 1.642 + RETURNS float8 1.643 + LANGUAGE C IMMUTABLE STRICT 1.644 + AS '$libdir/latlon-v0007', 'pgl_epoint_lat'; 1.645 + 1.646 +CREATE FUNCTION longitude(epoint) 1.647 + RETURNS float8 1.648 + LANGUAGE C IMMUTABLE STRICT 1.649 + AS '$libdir/latlon-v0007', 'pgl_epoint_lon'; 1.650 + 1.651 +CREATE FUNCTION min_latitude(ebox) 1.652 + RETURNS float8 1.653 + LANGUAGE C IMMUTABLE STRICT 1.654 + AS '$libdir/latlon-v0007', 'pgl_ebox_lat_min'; 1.655 + 1.656 +CREATE FUNCTION max_latitude(ebox) 1.657 + RETURNS float8 1.658 + LANGUAGE C IMMUTABLE STRICT 1.659 + AS '$libdir/latlon-v0007', 'pgl_ebox_lat_max'; 1.660 + 1.661 +CREATE FUNCTION min_longitude(ebox) 1.662 + RETURNS float8 1.663 + LANGUAGE C IMMUTABLE STRICT 1.664 + AS '$libdir/latlon-v0007', 'pgl_ebox_lon_min'; 1.665 + 1.666 +CREATE FUNCTION max_longitude(ebox) 1.667 + RETURNS float8 1.668 + LANGUAGE C IMMUTABLE STRICT 1.669 + AS '$libdir/latlon-v0007', 'pgl_ebox_lon_max'; 1.670 + 1.671 +CREATE FUNCTION center(ecircle) 1.672 + RETURNS epoint 1.673 + LANGUAGE C IMMUTABLE STRICT 1.674 + AS '$libdir/latlon-v0007', 'pgl_ecircle_center'; 1.675 + 1.676 +CREATE FUNCTION radius(ecircle) 1.677 + RETURNS float8 1.678 + LANGUAGE C IMMUTABLE STRICT 1.679 + AS '$libdir/latlon-v0007', 'pgl_ecircle_radius'; 1.680 + 1.681 +CREATE FUNCTION ecluster_extract_points(ecluster) 1.682 + RETURNS SETOF epoint 1.683 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.684 + SELECT "match"[2]::epoint 1.685 + FROM regexp_matches($1::text, e'(^| )point \\(([^)]+)\\)', 'g') AS "match" 1.686 + $$; 1.687 + 1.688 +CREATE FUNCTION ecluster_extract_paths(ecluster) 1.689 + RETURNS SETOF epoint[] 1.690 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.691 + SELECT ( 1.692 + SELECT array_agg("m2"[1]::epoint) 1.693 + FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2" 1.694 + ) 1.695 + FROM regexp_matches($1::text, e'(^| )path \\(([^)]+)\\)', 'g') AS "m1" 1.696 + $$; 1.697 + 1.698 +CREATE FUNCTION ecluster_extract_outlines(ecluster) 1.699 + RETURNS SETOF epoint[] 1.700 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.701 + SELECT ( 1.702 + SELECT array_agg("m2"[1]::epoint) 1.703 + FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2" 1.704 + ) 1.705 + FROM regexp_matches($1::text, e'(^| )outline \\(([^)]+)\\)', 'g') AS "m1" 1.706 + $$; 1.707 + 1.708 +CREATE FUNCTION ecluster_extract_polygons(ecluster) 1.709 + RETURNS SETOF epoint[] 1.710 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.711 + SELECT ( 1.712 + SELECT array_agg("m2"[1]::epoint) 1.713 + FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2" 1.714 + ) 1.715 + FROM regexp_matches($1::text, e'(^| )polygon \\(([^)]+)\\)', 'g') AS "m1" 1.716 + $$; 1.717 + 1.718 + 1.719 +--------------- 1.720 +-- operators -- 1.721 +--------------- 1.722 + 1.723 +CREATE FUNCTION epoint_ebox_overlap_proc(epoint, ebox) 1.724 + RETURNS boolean 1.725 + LANGUAGE C IMMUTABLE STRICT 1.726 + AS '$libdir/latlon-v0007', 'pgl_epoint_ebox_overlap'; 1.727 + 1.728 +CREATE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle) 1.729 + RETURNS boolean 1.730 + LANGUAGE C IMMUTABLE STRICT 1.731 + AS '$libdir/latlon-v0007', 'pgl_epoint_ecircle_overlap'; 1.732 + 1.733 +CREATE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster) 1.734 + RETURNS boolean 1.735 + LANGUAGE C IMMUTABLE STRICT 1.736 + AS '$libdir/latlon-v0007', 'pgl_epoint_ecluster_overlap'; 1.737 + 1.738 +CREATE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster) 1.739 + RETURNS boolean 1.740 + LANGUAGE C IMMUTABLE STRICT 1.741 + AS '$libdir/latlon-v0007', 'pgl_epoint_ecluster_may_overlap'; 1.742 + 1.743 +CREATE FUNCTION ebox_overlap_proc(ebox, ebox) 1.744 + RETURNS boolean 1.745 + LANGUAGE C IMMUTABLE STRICT 1.746 + AS '$libdir/latlon-v0007', 'pgl_ebox_overlap'; 1.747 + 1.748 +CREATE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle) 1.749 + RETURNS boolean 1.750 + LANGUAGE C IMMUTABLE STRICT 1.751 + AS '$libdir/latlon-v0007', 'pgl_ebox_ecircle_may_overlap'; 1.752 + 1.753 +CREATE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster) 1.754 + RETURNS boolean 1.755 + LANGUAGE C IMMUTABLE STRICT 1.756 + AS '$libdir/latlon-v0007', 'pgl_ebox_ecluster_may_overlap'; 1.757 + 1.758 +CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle) 1.759 + RETURNS boolean 1.760 + LANGUAGE C IMMUTABLE STRICT 1.761 + AS '$libdir/latlon-v0007', 'pgl_ecircle_overlap'; 1.762 + 1.763 +CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster) 1.764 + RETURNS boolean 1.765 + LANGUAGE C IMMUTABLE STRICT 1.766 + AS '$libdir/latlon-v0007', 'pgl_ecircle_ecluster_overlap'; 1.767 + 1.768 +CREATE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster) 1.769 + RETURNS boolean 1.770 + LANGUAGE C IMMUTABLE STRICT 1.771 + AS '$libdir/latlon-v0007', 'pgl_ecircle_ecluster_may_overlap'; 1.772 + 1.773 +CREATE FUNCTION ecluster_overlap_proc(ecluster, ecluster) 1.774 + RETURNS boolean 1.775 + LANGUAGE C IMMUTABLE STRICT 1.776 + AS '$libdir/latlon-v0007', 'pgl_ecluster_overlap'; 1.777 + 1.778 +CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster) 1.779 + RETURNS boolean 1.780 + LANGUAGE C IMMUTABLE STRICT 1.781 + AS '$libdir/latlon-v0007', 'pgl_ecluster_may_overlap'; 1.782 + 1.783 +CREATE FUNCTION ecluster_contains_proc(ecluster, ecluster) 1.784 + RETURNS boolean 1.785 + LANGUAGE C IMMUTABLE STRICT 1.786 + AS '$libdir/latlon-v0007', 'pgl_ecluster_contains'; 1.787 + 1.788 +CREATE FUNCTION epoint_distance_proc(epoint, epoint) 1.789 + RETURNS float8 1.790 + LANGUAGE C IMMUTABLE STRICT 1.791 + AS '$libdir/latlon-v0007', 'pgl_epoint_distance'; 1.792 + 1.793 +CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle) 1.794 + RETURNS float8 1.795 + LANGUAGE C IMMUTABLE STRICT 1.796 + AS '$libdir/latlon-v0007', 'pgl_epoint_ecircle_distance'; 1.797 + 1.798 +CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster) 1.799 + RETURNS float8 1.800 + LANGUAGE C IMMUTABLE STRICT 1.801 + AS '$libdir/latlon-v0007', 'pgl_epoint_ecluster_distance'; 1.802 + 1.803 +CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle) 1.804 + RETURNS float8 1.805 + LANGUAGE C IMMUTABLE STRICT 1.806 + AS '$libdir/latlon-v0007', 'pgl_ecircle_distance'; 1.807 + 1.808 +CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster) 1.809 + RETURNS float8 1.810 + LANGUAGE C IMMUTABLE STRICT 1.811 + AS '$libdir/latlon-v0007', 'pgl_ecircle_ecluster_distance'; 1.812 + 1.813 +CREATE FUNCTION ecluster_distance_proc(ecluster, ecluster) 1.814 + RETURNS float8 1.815 + LANGUAGE C IMMUTABLE STRICT 1.816 + AS '$libdir/latlon-v0007', 'pgl_ecluster_distance'; 1.817 + 1.818 +CREATE OPERATOR && ( 1.819 + leftarg = epoint, 1.820 + rightarg = ebox, 1.821 + procedure = epoint_ebox_overlap_proc, 1.822 + commutator = &&, 1.823 + restrict = areasel, 1.824 + join = areajoinsel 1.825 +); 1.826 + 1.827 +CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint) 1.828 + RETURNS boolean 1.829 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1'; 1.830 + 1.831 +CREATE OPERATOR && ( 1.832 + leftarg = ebox, 1.833 + rightarg = epoint, 1.834 + procedure = epoint_ebox_overlap_commutator, 1.835 + commutator = &&, 1.836 + restrict = areasel, 1.837 + join = areajoinsel 1.838 +); 1.839 + 1.840 +CREATE OPERATOR && ( 1.841 + leftarg = epoint, 1.842 + rightarg = ecircle, 1.843 + procedure = epoint_ecircle_overlap_proc, 1.844 + commutator = &&, 1.845 + restrict = areasel, 1.846 + join = areajoinsel 1.847 +); 1.848 + 1.849 +CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint) 1.850 + RETURNS boolean 1.851 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1'; 1.852 + 1.853 +CREATE OPERATOR && ( 1.854 + leftarg = ecircle, 1.855 + rightarg = epoint, 1.856 + procedure = epoint_ecircle_overlap_commutator, 1.857 + commutator = &&, 1.858 + restrict = areasel, 1.859 + join = areajoinsel 1.860 +); 1.861 + 1.862 +CREATE OPERATOR && ( 1.863 + leftarg = epoint, 1.864 + rightarg = ecluster, 1.865 + procedure = epoint_ecluster_overlap_proc, 1.866 + commutator = &&, 1.867 + restrict = areasel, 1.868 + join = areajoinsel 1.869 +); 1.870 + 1.871 +CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint) 1.872 + RETURNS boolean 1.873 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1'; 1.874 + 1.875 +CREATE OPERATOR && ( 1.876 + leftarg = ecluster, 1.877 + rightarg = epoint, 1.878 + procedure = epoint_ecluster_overlap_commutator, 1.879 + commutator = &&, 1.880 + restrict = areasel, 1.881 + join = areajoinsel 1.882 +); 1.883 + 1.884 +CREATE OPERATOR && ( 1.885 + leftarg = ebox, 1.886 + rightarg = ebox, 1.887 + procedure = ebox_overlap_proc, 1.888 + commutator = &&, 1.889 + restrict = areasel, 1.890 + join = areajoinsel 1.891 +); 1.892 + 1.893 +CREATE OPERATOR && ( 1.894 + leftarg = ecircle, 1.895 + rightarg = ecircle, 1.896 + procedure = ecircle_overlap_proc, 1.897 + commutator = &&, 1.898 + restrict = areasel, 1.899 + join = areajoinsel 1.900 +); 1.901 + 1.902 +CREATE OPERATOR && ( 1.903 + leftarg = ecircle, 1.904 + rightarg = ecluster, 1.905 + procedure = ecircle_ecluster_overlap_proc, 1.906 + commutator = &&, 1.907 + restrict = areasel, 1.908 + join = areajoinsel 1.909 +); 1.910 + 1.911 +CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle) 1.912 + RETURNS boolean 1.913 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1'; 1.914 + 1.915 +CREATE OPERATOR && ( 1.916 + leftarg = ecluster, 1.917 + rightarg = ecircle, 1.918 + procedure = ecircle_ecluster_overlap_commutator, 1.919 + commutator = &&, 1.920 + restrict = areasel, 1.921 + join = areajoinsel 1.922 +); 1.923 + 1.924 +CREATE OPERATOR && ( 1.925 + leftarg = ecluster, 1.926 + rightarg = ecluster, 1.927 + procedure = ecluster_overlap_proc, 1.928 + commutator = &&, 1.929 + restrict = areasel, 1.930 + join = areajoinsel 1.931 +); 1.932 + 1.933 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle) 1.934 + RETURNS boolean 1.935 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2'; 1.936 + 1.937 +CREATE OPERATOR && ( 1.938 + leftarg = ebox, 1.939 + rightarg = ecircle, 1.940 + procedure = ebox_ecircle_overlap_castwrap, 1.941 + commutator = &&, 1.942 + restrict = areasel, 1.943 + join = areajoinsel 1.944 +); 1.945 + 1.946 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox) 1.947 + RETURNS boolean 1.948 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster'; 1.949 + 1.950 +CREATE OPERATOR && ( 1.951 + leftarg = ecircle, 1.952 + rightarg = ebox, 1.953 + procedure = ebox_ecircle_overlap_castwrap, 1.954 + commutator = &&, 1.955 + restrict = areasel, 1.956 + join = areajoinsel 1.957 +); 1.958 + 1.959 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster) 1.960 + RETURNS boolean 1.961 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2'; 1.962 + 1.963 +CREATE OPERATOR && ( 1.964 + leftarg = ebox, 1.965 + rightarg = ecluster, 1.966 + procedure = ebox_ecluster_overlap_castwrap, 1.967 + commutator = &&, 1.968 + restrict = areasel, 1.969 + join = areajoinsel 1.970 +); 1.971 + 1.972 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox) 1.973 + RETURNS boolean 1.974 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster'; 1.975 + 1.976 +CREATE OPERATOR && ( 1.977 + leftarg = ecluster, 1.978 + rightarg = ebox, 1.979 + procedure = ebox_ecluster_overlap_castwrap, 1.980 + commutator = &&, 1.981 + restrict = areasel, 1.982 + join = areajoinsel 1.983 +); 1.984 + 1.985 +CREATE OPERATOR &&+ ( 1.986 + leftarg = epoint, 1.987 + rightarg = ecluster, 1.988 + procedure = epoint_ecluster_may_overlap_proc, 1.989 + commutator = &&+, 1.990 + restrict = areasel, 1.991 + join = areajoinsel 1.992 +); 1.993 + 1.994 +CREATE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint) 1.995 + RETURNS boolean 1.996 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1'; 1.997 + 1.998 +CREATE OPERATOR &&+ ( 1.999 + leftarg = ecluster, 1.1000 + rightarg = epoint, 1.1001 + procedure = epoint_ecluster_may_overlap_commutator, 1.1002 + commutator = &&+, 1.1003 + restrict = areasel, 1.1004 + join = areajoinsel 1.1005 +); 1.1006 + 1.1007 +CREATE OPERATOR &&+ ( 1.1008 + leftarg = ebox, 1.1009 + rightarg = ecircle, 1.1010 + procedure = ebox_ecircle_may_overlap_proc, 1.1011 + commutator = &&+, 1.1012 + restrict = areasel, 1.1013 + join = areajoinsel 1.1014 +); 1.1015 + 1.1016 +CREATE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox) 1.1017 + RETURNS boolean 1.1018 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1'; 1.1019 + 1.1020 +CREATE OPERATOR &&+ ( 1.1021 + leftarg = ecircle, 1.1022 + rightarg = ebox, 1.1023 + procedure = ebox_ecircle_may_overlap_commutator, 1.1024 + commutator = &&+, 1.1025 + restrict = areasel, 1.1026 + join = areajoinsel 1.1027 +); 1.1028 + 1.1029 +CREATE OPERATOR &&+ ( 1.1030 + leftarg = ebox, 1.1031 + rightarg = ecluster, 1.1032 + procedure = ebox_ecluster_may_overlap_proc, 1.1033 + commutator = &&+, 1.1034 + restrict = areasel, 1.1035 + join = areajoinsel 1.1036 +); 1.1037 + 1.1038 +CREATE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox) 1.1039 + RETURNS boolean 1.1040 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1'; 1.1041 + 1.1042 +CREATE OPERATOR &&+ ( 1.1043 + leftarg = ecluster, 1.1044 + rightarg = ebox, 1.1045 + procedure = ebox_ecluster_may_overlap_commutator, 1.1046 + commutator = &&+, 1.1047 + restrict = areasel, 1.1048 + join = areajoinsel 1.1049 +); 1.1050 + 1.1051 +CREATE OPERATOR &&+ ( 1.1052 + leftarg = ecircle, 1.1053 + rightarg = ecluster, 1.1054 + procedure = ecircle_ecluster_may_overlap_proc, 1.1055 + commutator = &&+, 1.1056 + restrict = areasel, 1.1057 + join = areajoinsel 1.1058 +); 1.1059 + 1.1060 +CREATE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle) 1.1061 + RETURNS boolean 1.1062 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1'; 1.1063 + 1.1064 +CREATE OPERATOR &&+ ( 1.1065 + leftarg = ecluster, 1.1066 + rightarg = ecircle, 1.1067 + procedure = ecircle_ecluster_may_overlap_commutator, 1.1068 + commutator = &&+, 1.1069 + restrict = areasel, 1.1070 + join = areajoinsel 1.1071 +); 1.1072 + 1.1073 +CREATE OPERATOR &&+ ( 1.1074 + leftarg = ecluster, 1.1075 + rightarg = ecluster, 1.1076 + procedure = ecluster_may_overlap_proc, 1.1077 + commutator = &&+, 1.1078 + restrict = areasel, 1.1079 + join = areajoinsel 1.1080 +); 1.1081 + 1.1082 +CREATE OPERATOR @> ( 1.1083 + leftarg = ebox, 1.1084 + rightarg = epoint, 1.1085 + procedure = epoint_ebox_overlap_commutator, 1.1086 + commutator = <@, 1.1087 + restrict = areasel, 1.1088 + join = areajoinsel 1.1089 +); 1.1090 + 1.1091 +CREATE OPERATOR <@ ( 1.1092 + leftarg = epoint, 1.1093 + rightarg = ebox, 1.1094 + procedure = epoint_ebox_overlap_proc, 1.1095 + commutator = @>, 1.1096 + restrict = areasel, 1.1097 + join = areajoinsel 1.1098 +); 1.1099 + 1.1100 +CREATE OPERATOR @> ( 1.1101 + leftarg = ecluster, 1.1102 + rightarg = epoint, 1.1103 + procedure = epoint_ecluster_overlap_commutator, 1.1104 + commutator = <@, 1.1105 + restrict = areasel, 1.1106 + join = areajoinsel 1.1107 +); 1.1108 + 1.1109 +CREATE OPERATOR <@ ( 1.1110 + leftarg = epoint, 1.1111 + rightarg = ecluster, 1.1112 + procedure = epoint_ecluster_overlap_proc, 1.1113 + commutator = <@, 1.1114 + restrict = areasel, 1.1115 + join = areajoinsel 1.1116 +); 1.1117 + 1.1118 +CREATE OPERATOR @> ( 1.1119 + leftarg = ecluster, 1.1120 + rightarg = ecluster, 1.1121 + procedure = ecluster_contains_proc, 1.1122 + commutator = <@, 1.1123 + restrict = areasel, 1.1124 + join = areajoinsel 1.1125 +); 1.1126 + 1.1127 +CREATE FUNCTION ecluster_contains_commutator(ecluster, ecluster) 1.1128 + RETURNS boolean 1.1129 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1'; 1.1130 + 1.1131 +CREATE OPERATOR <@ ( 1.1132 + leftarg = ecluster, 1.1133 + rightarg = ecluster, 1.1134 + procedure = ecluster_contains_commutator, 1.1135 + commutator = @>, 1.1136 + restrict = areasel, 1.1137 + join = areajoinsel 1.1138 +); 1.1139 + 1.1140 +CREATE FUNCTION ebox_contains_castwrap(ebox, ebox) 1.1141 + RETURNS boolean 1.1142 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2::ecluster'; 1.1143 + 1.1144 +CREATE OPERATOR @> ( 1.1145 + leftarg = ebox, 1.1146 + rightarg = ebox, 1.1147 + procedure = ebox_contains_castwrap, 1.1148 + commutator = <@, 1.1149 + restrict = areasel, 1.1150 + join = areajoinsel 1.1151 +); 1.1152 + 1.1153 +CREATE FUNCTION ebox_contains_swapped_castwrap(ebox, ebox) 1.1154 + RETURNS boolean 1.1155 + LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1::ecluster'; 1.1156 + 1.1157 +CREATE OPERATOR <@ ( 1.1158 + leftarg = ebox, 1.1159 + rightarg = ebox, 1.1160 + procedure = ebox_contains_swapped_castwrap, 1.1161 + commutator = @>, 1.1162 + restrict = areasel, 1.1163 + join = areajoinsel 1.1164 +); 1.1165 + 1.1166 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster) 1.1167 + RETURNS boolean 1.1168 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2'; 1.1169 + 1.1170 +CREATE OPERATOR @> ( 1.1171 + leftarg = ebox, 1.1172 + rightarg = ecluster, 1.1173 + procedure = ebox_ecluster_contains_castwrap, 1.1174 + commutator = <@, 1.1175 + restrict = areasel, 1.1176 + join = areajoinsel 1.1177 +); 1.1178 + 1.1179 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox) 1.1180 + RETURNS boolean 1.1181 + LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1'; 1.1182 + 1.1183 +CREATE OPERATOR <@ ( 1.1184 + leftarg = ecluster, 1.1185 + rightarg = ebox, 1.1186 + procedure = ebox_ecluster_contains_castwrap, 1.1187 + commutator = @>, 1.1188 + restrict = areasel, 1.1189 + join = areajoinsel 1.1190 +); 1.1191 + 1.1192 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox) 1.1193 + RETURNS boolean 1.1194 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 @> $2::ecluster'; 1.1195 + 1.1196 +CREATE OPERATOR @> ( 1.1197 + leftarg = ecluster, 1.1198 + rightarg = ebox, 1.1199 + procedure = ecluster_ebox_contains_castwrap, 1.1200 + commutator = <@, 1.1201 + restrict = areasel, 1.1202 + join = areajoinsel 1.1203 +); 1.1204 + 1.1205 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster) 1.1206 + RETURNS boolean 1.1207 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1::ecluster'; 1.1208 + 1.1209 +CREATE OPERATOR <@ ( 1.1210 + leftarg = ebox, 1.1211 + rightarg = ecluster, 1.1212 + procedure = ecluster_ebox_contains_castwrap, 1.1213 + commutator = @>, 1.1214 + restrict = areasel, 1.1215 + join = areajoinsel 1.1216 +); 1.1217 + 1.1218 +CREATE OPERATOR <-> ( 1.1219 + leftarg = epoint, 1.1220 + rightarg = epoint, 1.1221 + procedure = epoint_distance_proc, 1.1222 + commutator = <-> 1.1223 +); 1.1224 + 1.1225 +CREATE OPERATOR <-> ( 1.1226 + leftarg = epoint, 1.1227 + rightarg = ecircle, 1.1228 + procedure = epoint_ecircle_distance_proc, 1.1229 + commutator = <-> 1.1230 +); 1.1231 + 1.1232 +CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint) 1.1233 + RETURNS float8 1.1234 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1'; 1.1235 + 1.1236 +CREATE OPERATOR <-> ( 1.1237 + leftarg = ecircle, 1.1238 + rightarg = epoint, 1.1239 + procedure = epoint_ecircle_distance_commutator, 1.1240 + commutator = <-> 1.1241 +); 1.1242 + 1.1243 +CREATE OPERATOR <-> ( 1.1244 + leftarg = epoint, 1.1245 + rightarg = ecluster, 1.1246 + procedure = epoint_ecluster_distance_proc, 1.1247 + commutator = <-> 1.1248 +); 1.1249 + 1.1250 +CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint) 1.1251 + RETURNS float8 1.1252 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1'; 1.1253 + 1.1254 +CREATE OPERATOR <-> ( 1.1255 + leftarg = ecluster, 1.1256 + rightarg = epoint, 1.1257 + procedure = epoint_ecluster_distance_commutator, 1.1258 + commutator = <-> 1.1259 +); 1.1260 + 1.1261 +CREATE OPERATOR <-> ( 1.1262 + leftarg = ecircle, 1.1263 + rightarg = ecircle, 1.1264 + procedure = ecircle_distance_proc, 1.1265 + commutator = <-> 1.1266 +); 1.1267 + 1.1268 +CREATE OPERATOR <-> ( 1.1269 + leftarg = ecircle, 1.1270 + rightarg = ecluster, 1.1271 + procedure = ecircle_ecluster_distance_proc, 1.1272 + commutator = <-> 1.1273 +); 1.1274 + 1.1275 +CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle) 1.1276 + RETURNS float8 1.1277 + LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1'; 1.1278 + 1.1279 +CREATE OPERATOR <-> ( 1.1280 + leftarg = ecluster, 1.1281 + rightarg = ecircle, 1.1282 + procedure = ecircle_ecluster_distance_commutator, 1.1283 + commutator = <-> 1.1284 +); 1.1285 + 1.1286 +CREATE OPERATOR <-> ( 1.1287 + leftarg = ecluster, 1.1288 + rightarg = ecluster, 1.1289 + procedure = ecluster_distance_proc, 1.1290 + commutator = <-> 1.1291 +); 1.1292 + 1.1293 +CREATE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox) 1.1294 + RETURNS float8 1.1295 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.1296 + 1.1297 +CREATE OPERATOR <-> ( 1.1298 + leftarg = epoint, 1.1299 + rightarg = ebox, 1.1300 + procedure = epoint_ebox_distance_castwrap, 1.1301 + commutator = <-> 1.1302 +); 1.1303 + 1.1304 +CREATE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint) 1.1305 + RETURNS float8 1.1306 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.1307 + 1.1308 +CREATE OPERATOR <-> ( 1.1309 + leftarg = ebox, 1.1310 + rightarg = epoint, 1.1311 + procedure = epoint_ebox_distance_castwrap, 1.1312 + commutator = <-> 1.1313 +); 1.1314 + 1.1315 +CREATE FUNCTION ebox_distance_castwrap(ebox, ebox) 1.1316 + RETURNS float8 1.1317 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2::ecluster'; 1.1318 + 1.1319 +CREATE OPERATOR <-> ( 1.1320 + leftarg = ebox, 1.1321 + rightarg = ebox, 1.1322 + procedure = ebox_distance_castwrap, 1.1323 + commutator = <-> 1.1324 +); 1.1325 + 1.1326 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle) 1.1327 + RETURNS float8 1.1328 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.1329 + 1.1330 +CREATE OPERATOR <-> ( 1.1331 + leftarg = ebox, 1.1332 + rightarg = ecircle, 1.1333 + procedure = ebox_ecircle_distance_castwrap, 1.1334 + commutator = <-> 1.1335 +); 1.1336 + 1.1337 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox) 1.1338 + RETURNS float8 1.1339 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.1340 + 1.1341 +CREATE OPERATOR <-> ( 1.1342 + leftarg = ecircle, 1.1343 + rightarg = ebox, 1.1344 + procedure = ebox_ecircle_distance_castwrap, 1.1345 + commutator = <-> 1.1346 +); 1.1347 + 1.1348 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster) 1.1349 + RETURNS float8 1.1350 + LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2'; 1.1351 + 1.1352 +CREATE OPERATOR <-> ( 1.1353 + leftarg = ebox, 1.1354 + rightarg = ecluster, 1.1355 + procedure = ebox_ecluster_distance_castwrap, 1.1356 + commutator = <-> 1.1357 +); 1.1358 + 1.1359 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox) 1.1360 + RETURNS float8 1.1361 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster'; 1.1362 + 1.1363 +CREATE OPERATOR <-> ( 1.1364 + leftarg = ecluster, 1.1365 + rightarg = ebox, 1.1366 + procedure = ebox_ecluster_distance_castwrap, 1.1367 + commutator = <-> 1.1368 +); 1.1369 + 1.1370 + 1.1371 +---------------- 1.1372 +-- GiST index -- 1.1373 +---------------- 1.1374 + 1.1375 +CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal) 1.1376 + RETURNS boolean 1.1377 + LANGUAGE C STRICT 1.1378 + AS '$libdir/latlon-v0007', 'pgl_gist_consistent'; 1.1379 + 1.1380 +CREATE FUNCTION pgl_gist_union(internal, internal) 1.1381 + RETURNS internal 1.1382 + LANGUAGE C STRICT 1.1383 + AS '$libdir/latlon-v0007', 'pgl_gist_union'; 1.1384 + 1.1385 +CREATE FUNCTION pgl_gist_compress_epoint(internal) 1.1386 + RETURNS internal 1.1387 + LANGUAGE C STRICT 1.1388 + AS '$libdir/latlon-v0007', 'pgl_gist_compress_epoint'; 1.1389 + 1.1390 +CREATE FUNCTION pgl_gist_compress_ecircle(internal) 1.1391 + RETURNS internal 1.1392 + LANGUAGE C STRICT 1.1393 + AS '$libdir/latlon-v0007', 'pgl_gist_compress_ecircle'; 1.1394 + 1.1395 +CREATE FUNCTION pgl_gist_compress_ecluster(internal) 1.1396 + RETURNS internal 1.1397 + LANGUAGE C STRICT 1.1398 + AS '$libdir/latlon-v0007', 'pgl_gist_compress_ecluster'; 1.1399 + 1.1400 +CREATE FUNCTION pgl_gist_decompress(internal) 1.1401 + RETURNS internal 1.1402 + LANGUAGE C STRICT 1.1403 + AS '$libdir/latlon-v0007', 'pgl_gist_decompress'; 1.1404 + 1.1405 +CREATE FUNCTION pgl_gist_penalty(internal, internal, internal) 1.1406 + RETURNS internal 1.1407 + LANGUAGE C STRICT 1.1408 + AS '$libdir/latlon-v0007', 'pgl_gist_penalty'; 1.1409 + 1.1410 +CREATE FUNCTION pgl_gist_picksplit(internal, internal) 1.1411 + RETURNS internal 1.1412 + LANGUAGE C STRICT 1.1413 + AS '$libdir/latlon-v0007', 'pgl_gist_picksplit'; 1.1414 + 1.1415 +CREATE FUNCTION pgl_gist_same(internal, internal, internal) 1.1416 + RETURNS internal 1.1417 + LANGUAGE C STRICT 1.1418 + AS '$libdir/latlon-v0007', 'pgl_gist_same'; 1.1419 + 1.1420 +CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid) 1.1421 + RETURNS internal 1.1422 + LANGUAGE C STRICT 1.1423 + AS '$libdir/latlon-v0007', 'pgl_gist_distance'; 1.1424 + 1.1425 +CREATE OPERATOR CLASS epoint_ops 1.1426 + DEFAULT FOR TYPE epoint USING gist AS 1.1427 + OPERATOR 11 = , 1.1428 + OPERATOR 22 && (epoint, ebox), 1.1429 + OPERATOR 222 <@ (epoint, ebox), 1.1430 + OPERATOR 23 && (epoint, ecircle), 1.1431 + OPERATOR 24 && (epoint, ecluster), 1.1432 + OPERATOR 124 &&+ (epoint, ecluster), 1.1433 + OPERATOR 224 <@ (epoint, ecluster), 1.1434 + OPERATOR 31 <-> (epoint, epoint) FOR ORDER BY float_ops, 1.1435 + OPERATOR 32 <-> (epoint, ebox) FOR ORDER BY float_ops, 1.1436 + OPERATOR 33 <-> (epoint, ecircle) FOR ORDER BY float_ops, 1.1437 + OPERATOR 34 <-> (epoint, ecluster) FOR ORDER BY float_ops, 1.1438 + FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.1439 + FUNCTION 2 pgl_gist_union(internal, internal), 1.1440 + FUNCTION 3 pgl_gist_compress_epoint(internal), 1.1441 + FUNCTION 4 pgl_gist_decompress(internal), 1.1442 + FUNCTION 5 pgl_gist_penalty(internal, internal, internal), 1.1443 + FUNCTION 6 pgl_gist_picksplit(internal, internal), 1.1444 + FUNCTION 7 pgl_gist_same(internal, internal, internal), 1.1445 + FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid), 1.1446 + STORAGE ekey_point; 1.1447 + 1.1448 +CREATE OPERATOR CLASS ecircle_ops 1.1449 + DEFAULT FOR TYPE ecircle USING gist AS 1.1450 + OPERATOR 13 = , 1.1451 + OPERATOR 21 && (ecircle, epoint), 1.1452 + OPERATOR 22 && (ecircle, ebox), 1.1453 + OPERATOR 122 &&+ (ecircle, ebox), 1.1454 + OPERATOR 23 && (ecircle, ecircle), 1.1455 + OPERATOR 24 && (ecircle, ecluster), 1.1456 + OPERATOR 124 &&+ (ecircle, ecluster), 1.1457 + OPERATOR 31 <-> (ecircle, epoint) FOR ORDER BY float_ops, 1.1458 + OPERATOR 32 <-> (ecircle, ebox) FOR ORDER BY float_ops, 1.1459 + OPERATOR 33 <-> (ecircle, ecircle) FOR ORDER BY float_ops, 1.1460 + OPERATOR 34 <-> (ecircle, ecluster) FOR ORDER BY float_ops, 1.1461 + FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.1462 + FUNCTION 2 pgl_gist_union(internal, internal), 1.1463 + FUNCTION 3 pgl_gist_compress_ecircle(internal), 1.1464 + FUNCTION 4 pgl_gist_decompress(internal), 1.1465 + FUNCTION 5 pgl_gist_penalty(internal, internal, internal), 1.1466 + FUNCTION 6 pgl_gist_picksplit(internal, internal), 1.1467 + FUNCTION 7 pgl_gist_same(internal, internal, internal), 1.1468 + FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid), 1.1469 + STORAGE ekey_area; 1.1470 + 1.1471 +CREATE OPERATOR CLASS ecluster_ops 1.1472 + DEFAULT FOR TYPE ecluster USING gist AS 1.1473 + OPERATOR 21 && (ecluster, epoint), 1.1474 + OPERATOR 121 &&+ (ecluster, epoint), 1.1475 + OPERATOR 221 @> (ecluster, epoint), 1.1476 + OPERATOR 22 && (ecluster, ebox), 1.1477 + OPERATOR 122 &&+ (ecluster, ebox), 1.1478 + OPERATOR 222 @> (ecluster, ebox), 1.1479 + OPERATOR 322 <@ (ecluster, ebox), 1.1480 + OPERATOR 23 && (ecluster, ecircle), 1.1481 + OPERATOR 123 &&+ (ecluster, ecircle), 1.1482 + OPERATOR 24 && (ecluster, ecluster), 1.1483 + OPERATOR 124 &&+ (ecluster, ecluster), 1.1484 + OPERATOR 224 @> (ecluster, ecluster), 1.1485 + OPERATOR 324 <@ (ecluster, ecluster), 1.1486 + OPERATOR 31 <-> (ecluster, epoint) FOR ORDER BY float_ops, 1.1487 + OPERATOR 32 <-> (ecluster, ebox) FOR ORDER BY float_ops, 1.1488 + OPERATOR 33 <-> (ecluster, ecircle) FOR ORDER BY float_ops, 1.1489 + OPERATOR 34 <-> (ecluster, ecluster) FOR ORDER BY float_ops, 1.1490 + FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal), 1.1491 + FUNCTION 2 pgl_gist_union(internal, internal), 1.1492 + FUNCTION 3 pgl_gist_compress_ecluster(internal), 1.1493 + FUNCTION 4 pgl_gist_decompress(internal), 1.1494 + FUNCTION 5 pgl_gist_penalty(internal, internal, internal), 1.1495 + FUNCTION 6 pgl_gist_picksplit(internal, internal), 1.1496 + FUNCTION 7 pgl_gist_same(internal, internal, internal), 1.1497 + FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid), 1.1498 + STORAGE ekey_area; 1.1499 + 1.1500 + 1.1501 +--------------------- 1.1502 +-- alias functions -- 1.1503 +--------------------- 1.1504 + 1.1505 +CREATE FUNCTION distance(epoint, epoint) 1.1506 + RETURNS float8 1.1507 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2'; 1.1508 + 1.1509 +CREATE FUNCTION distance(ecluster, epoint) 1.1510 + RETURNS float8 1.1511 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2'; 1.1512 + 1.1513 +CREATE FUNCTION distance_within(epoint, epoint, float8) 1.1514 + RETURNS boolean 1.1515 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)'; 1.1516 + 1.1517 +CREATE FUNCTION distance_within(ecluster, epoint, float8) 1.1518 + RETURNS boolean 1.1519 + LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)'; 1.1520 + 1.1521 + 1.1522 +-------------------------------- 1.1523 +-- other data storage formats -- 1.1524 +-------------------------------- 1.1525 + 1.1526 +CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint_lonlat') 1.1527 + RETURNS epoint 1.1528 + LANGUAGE plpgsql IMMUTABLE STRICT AS $$ 1.1529 + DECLARE 1.1530 + "result" epoint; 1.1531 + BEGIN 1.1532 + IF $3 = 'epoint_lonlat' THEN 1.1533 + -- avoid dynamic command execution for better performance 1.1534 + RETURN epoint($2, $1); 1.1535 + END IF; 1.1536 + IF $3 = 'epoint' OR $3 = 'epoint_latlon' THEN 1.1537 + -- avoid dynamic command execution for better performance 1.1538 + RETURN epoint($1, $2); 1.1539 + END IF; 1.1540 + EXECUTE 'SELECT ' || $3 || '($1, $2)' INTO STRICT "result" USING $1, $2; 1.1541 + RETURN "result"; 1.1542 + END; 1.1543 + $$; 1.1544 + 1.1545 +CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat') 1.1546 + RETURNS epoint 1.1547 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.1548 + SELECT CASE 1.1549 + WHEN $1->>'type' = 'Point' THEN 1.1550 + coords_to_epoint( 1.1551 + ($1->'coordinates'->>1)::float8, 1.1552 + ($1->'coordinates'->>0)::float8, 1.1553 + $2 1.1554 + ) 1.1555 + WHEN $1->>'type' = 'Feature' THEN 1.1556 + GeoJSON_to_epoint($1->'geometry', $2) 1.1557 + ELSE 1.1558 + NULL 1.1559 + END 1.1560 + $$; 1.1561 + 1.1562 +CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat') 1.1563 + RETURNS ecluster 1.1564 + LANGUAGE sql IMMUTABLE STRICT AS $$ 1.1565 + SELECT CASE $1->>'type' 1.1566 + WHEN 'Point' THEN 1.1567 + coords_to_epoint( 1.1568 + ($1->'coordinates'->>1)::float8, 1.1569 + ($1->'coordinates'->>0)::float8, 1.1570 + $2 1.1571 + )::ecluster 1.1572 + WHEN 'MultiPoint' THEN 1.1573 + ( SELECT ecluster_create_multipoint(array_agg( 1.1574 + coords_to_epoint( 1.1575 + ("coord"->>1)::float8, 1.1576 + ("coord"->>0)::float8, 1.1577 + $2 1.1578 + ) 1.1579 + )) 1.1580 + FROM jsonb_array_elements($1->'coordinates') AS "coord" 1.1581 + ) 1.1582 + WHEN 'LineString' THEN 1.1583 + ( SELECT ecluster_create_path(array_agg( 1.1584 + coords_to_epoint( 1.1585 + ("coord"->>1)::float8, 1.1586 + ("coord"->>0)::float8, 1.1587 + $2 1.1588 + ) 1.1589 + )) 1.1590 + FROM jsonb_array_elements($1->'coordinates') AS "coord" 1.1591 + ) 1.1592 + WHEN 'MultiLineString' THEN 1.1593 + ( SELECT ecluster_concat(array_agg( 1.1594 + ( SELECT ecluster_create_path(array_agg( 1.1595 + coords_to_epoint( 1.1596 + ("coord"->>1)::float8, 1.1597 + ("coord"->>0)::float8, 1.1598 + $2 1.1599 + ) 1.1600 + )) 1.1601 + FROM jsonb_array_elements("coord_array") AS "coord" 1.1602 + ) 1.1603 + )) 1.1604 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array" 1.1605 + ) 1.1606 + WHEN 'Polygon' THEN 1.1607 + ( SELECT ecluster_concat(array_agg( 1.1608 + ( SELECT ecluster_create_polygon(array_agg( 1.1609 + coords_to_epoint( 1.1610 + ("coord"->>1)::float8, 1.1611 + ("coord"->>0)::float8, 1.1612 + $2 1.1613 + ) 1.1614 + )) 1.1615 + FROM jsonb_array_elements("coord_array") AS "coord" 1.1616 + ) 1.1617 + )) 1.1618 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array" 1.1619 + ) 1.1620 + WHEN 'MultiPolygon' THEN 1.1621 + ( SELECT ecluster_concat(array_agg( 1.1622 + ( SELECT ecluster_concat(array_agg( 1.1623 + ( SELECT ecluster_create_polygon(array_agg( 1.1624 + coords_to_epoint( 1.1625 + ("coord"->>1)::float8, 1.1626 + ("coord"->>0)::float8, 1.1627 + $2 1.1628 + ) 1.1629 + )) 1.1630 + FROM jsonb_array_elements("coord_array") AS "coord" 1.1631 + ) 1.1632 + )) 1.1633 + FROM jsonb_array_elements("coord_array_array") AS "coord_array" 1.1634 + ) 1.1635 + )) 1.1636 + FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array" 1.1637 + ) 1.1638 + WHEN 'Feature' THEN 1.1639 + GeoJSON_to_ecluster($1->'geometry', $2) 1.1640 + WHEN 'FeatureCollection' THEN 1.1641 + ( SELECT ecluster_concat(array_agg( 1.1642 + GeoJSON_to_ecluster("feature", $2) 1.1643 + )) 1.1644 + FROM jsonb_array_elements($1->'features') AS "feature" 1.1645 + ) 1.1646 + ELSE 1.1647 + NULL 1.1648 + END 1.1649 + $$; 1.1650 +