pgLatLon

changeset 38:9cd46e55d576

Added files for next version 0.8
author jbe
date Thu Oct 20 21:44:17 2016 +0200 (2016-10-20)
parents 9dfb5391a9c5
children 2890e859c8a8
files GNUmakefile latlon--0.7--0.8.sql latlon--0.8.sql
line diff
     1.1 --- a/GNUmakefile	Mon Sep 26 10:01:51 2016 +0200
     1.2 +++ b/GNUmakefile	Thu Oct 20 21:44:17 2016 +0200
     1.3 @@ -1,5 +1,5 @@
     1.4  EXTENSION = latlon
     1.5 -DATA = latlon--0.6--0.7.sql latlon--0.7.sql
     1.6 +DATA = latlon--0.6--0.7.sql latlon--0.7.sql latlon--0.7--0.8.sql latlon--0.8.sql
     1.7  MODULES = latlon-v0007
     1.8  
     1.9  PG_CONFIG = pg_config
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/latlon--0.8.sql	Thu Oct 20 21:44:17 2016 +0200
     3.3 @@ -0,0 +1,1647 @@
     3.4 +
     3.5 +----------------------------------------
     3.6 +-- forward declarations (shell types) --
     3.7 +----------------------------------------
     3.8 +
     3.9 +CREATE TYPE epoint;
    3.10 +CREATE TYPE ebox;
    3.11 +CREATE TYPE ecircle;
    3.12 +CREATE TYPE ecluster;
    3.13 +
    3.14 +
    3.15 +------------------------------------------------------------
    3.16 +-- dummy input/output functions for dummy index key types --
    3.17 +------------------------------------------------------------
    3.18 +
    3.19 +CREATE FUNCTION ekey_point_in_dummy(cstring)
    3.20 +  RETURNS ekey_point
    3.21 +  LANGUAGE C IMMUTABLE STRICT
    3.22 +  AS '$libdir/latlon-v0007', 'pgl_notimpl';
    3.23 +
    3.24 +CREATE FUNCTION ekey_point_out_dummy(ekey_point)
    3.25 +  RETURNS cstring
    3.26 +  LANGUAGE C IMMUTABLE STRICT
    3.27 +  AS '$libdir/latlon-v0007', 'pgl_notimpl';
    3.28 +
    3.29 +CREATE FUNCTION ekey_area_in_dummy(cstring)
    3.30 +  RETURNS ekey_area
    3.31 +  LANGUAGE C IMMUTABLE STRICT
    3.32 +  AS '$libdir/latlon-v0007', 'pgl_notimpl';
    3.33 +
    3.34 +CREATE FUNCTION ekey_area_out_dummy(ekey_area)
    3.35 +  RETURNS cstring
    3.36 +  LANGUAGE C IMMUTABLE STRICT
    3.37 +  AS '$libdir/latlon-v0007', 'pgl_notimpl';
    3.38 +
    3.39 +
    3.40 +--------------------------
    3.41 +-- text input functions --
    3.42 +--------------------------
    3.43 +
    3.44 +CREATE FUNCTION epoint_in(cstring)
    3.45 +  RETURNS epoint
    3.46 +  LANGUAGE C IMMUTABLE STRICT
    3.47 +  AS '$libdir/latlon-v0007', 'pgl_epoint_in';
    3.48 +
    3.49 +CREATE FUNCTION ebox_in(cstring)
    3.50 +  RETURNS ebox
    3.51 +  LANGUAGE C IMMUTABLE STRICT
    3.52 +  AS '$libdir/latlon-v0007', 'pgl_ebox_in';
    3.53 +
    3.54 +CREATE FUNCTION ecircle_in(cstring)
    3.55 +  RETURNS ecircle
    3.56 +  LANGUAGE C IMMUTABLE STRICT
    3.57 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_in';
    3.58 +
    3.59 +CREATE FUNCTION ecluster_in(cstring)
    3.60 +  RETURNS ecluster
    3.61 +  LANGUAGE C IMMUTABLE STRICT
    3.62 +  AS '$libdir/latlon-v0007', 'pgl_ecluster_in';
    3.63 +
    3.64 +
    3.65 +---------------------------
    3.66 +-- text output functions --
    3.67 +---------------------------
    3.68 +
    3.69 +CREATE FUNCTION epoint_out(epoint)
    3.70 +  RETURNS cstring
    3.71 +  LANGUAGE C IMMUTABLE STRICT
    3.72 +  AS '$libdir/latlon-v0007', 'pgl_epoint_out';
    3.73 +
    3.74 +CREATE FUNCTION ebox_out(ebox)
    3.75 +  RETURNS cstring
    3.76 +  LANGUAGE C IMMUTABLE STRICT
    3.77 +  AS '$libdir/latlon-v0007', 'pgl_ebox_out';
    3.78 +
    3.79 +CREATE FUNCTION ecircle_out(ecircle)
    3.80 +  RETURNS cstring
    3.81 +  LANGUAGE C IMMUTABLE STRICT
    3.82 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_out';
    3.83 +
    3.84 +CREATE FUNCTION ecluster_out(ecluster)
    3.85 +  RETURNS cstring
    3.86 +  LANGUAGE C IMMUTABLE STRICT
    3.87 +  AS '$libdir/latlon-v0007', 'pgl_ecluster_out';
    3.88 +
    3.89 +
    3.90 +--------------------------
    3.91 +-- binary I/O functions --
    3.92 +--------------------------
    3.93 +
    3.94 +CREATE FUNCTION epoint_recv(internal)
    3.95 +  RETURNS epoint
    3.96 +  LANGUAGE C IMMUTABLE STRICT
    3.97 +  AS '$libdir/latlon-v0007', 'pgl_epoint_recv';
    3.98 +
    3.99 +CREATE FUNCTION ebox_recv(internal)
   3.100 +  RETURNS ebox
   3.101 +  LANGUAGE C IMMUTABLE STRICT
   3.102 +  AS '$libdir/latlon-v0007', 'pgl_ebox_recv';
   3.103 +
   3.104 +CREATE FUNCTION ecircle_recv(internal)
   3.105 +  RETURNS ecircle
   3.106 +  LANGUAGE C IMMUTABLE STRICT
   3.107 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_recv';
   3.108 +
   3.109 +CREATE FUNCTION epoint_send(epoint)
   3.110 +  RETURNS bytea
   3.111 +  LANGUAGE C IMMUTABLE STRICT
   3.112 +  AS '$libdir/latlon-v0007', 'pgl_epoint_send';
   3.113 +
   3.114 +CREATE FUNCTION ebox_send(ebox)
   3.115 +  RETURNS bytea
   3.116 +  LANGUAGE C IMMUTABLE STRICT
   3.117 +  AS '$libdir/latlon-v0007', 'pgl_ebox_send';
   3.118 +
   3.119 +CREATE FUNCTION ecircle_send(ecircle)
   3.120 +  RETURNS bytea
   3.121 +  LANGUAGE C IMMUTABLE STRICT
   3.122 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_send';
   3.123 +
   3.124 +
   3.125 +-----------------------------------------------
   3.126 +-- type definitions of dummy index key types --
   3.127 +-----------------------------------------------
   3.128 +
   3.129 +CREATE TYPE ekey_point (
   3.130 +  internallength = 8,
   3.131 +  input = ekey_point_in_dummy,
   3.132 +  output = ekey_point_out_dummy,
   3.133 +  alignment = char );
   3.134 +
   3.135 +CREATE TYPE ekey_area (
   3.136 +  internallength = 9,
   3.137 +  input = ekey_area_in_dummy,
   3.138 +  output = ekey_area_out_dummy,
   3.139 +  alignment = char );
   3.140 +
   3.141 +
   3.142 +------------------------------------------
   3.143 +-- definitions of geographic data types --
   3.144 +------------------------------------------
   3.145 +
   3.146 +CREATE TYPE epoint (
   3.147 +  internallength = 16,
   3.148 +  input = epoint_in,
   3.149 +  output = epoint_out,
   3.150 +  receive = epoint_recv,
   3.151 +  send = epoint_send,
   3.152 +  alignment = double );
   3.153 +
   3.154 +CREATE TYPE ebox (
   3.155 +  internallength = 32,
   3.156 +  input = ebox_in,
   3.157 +  output = ebox_out,
   3.158 +  receive = ebox_recv,
   3.159 +  send = ebox_send,
   3.160 +  alignment = double );
   3.161 +
   3.162 +CREATE TYPE ecircle (
   3.163 +  internallength = 24,
   3.164 +  input = ecircle_in,
   3.165 +  output = ecircle_out,
   3.166 +  receive = ecircle_recv,
   3.167 +  send = ecircle_send,
   3.168 +  alignment = double );
   3.169 +
   3.170 +CREATE TYPE ecluster (
   3.171 +  internallength = VARIABLE,
   3.172 +  input = ecluster_in,
   3.173 +  output = ecluster_out,
   3.174 +  alignment = double,
   3.175 +  storage = external );
   3.176 +
   3.177 +
   3.178 +--------------------
   3.179 +-- B-tree support --
   3.180 +--------------------
   3.181 +
   3.182 +-- begin of B-tree support for epoint
   3.183 +
   3.184 +CREATE FUNCTION epoint_btree_lt(epoint, epoint)
   3.185 +  RETURNS boolean
   3.186 +  LANGUAGE C IMMUTABLE STRICT
   3.187 +  AS '$libdir/latlon-v0007', 'pgl_btree_epoint_lt';
   3.188 +
   3.189 +CREATE FUNCTION epoint_btree_le(epoint, epoint)
   3.190 +  RETURNS boolean
   3.191 +  LANGUAGE C IMMUTABLE STRICT
   3.192 +  AS '$libdir/latlon-v0007', 'pgl_btree_epoint_le';
   3.193 +
   3.194 +CREATE FUNCTION epoint_btree_eq(epoint, epoint)
   3.195 +  RETURNS boolean
   3.196 +  LANGUAGE C IMMUTABLE STRICT
   3.197 +  AS '$libdir/latlon-v0007', 'pgl_btree_epoint_eq';
   3.198 +
   3.199 +CREATE FUNCTION epoint_btree_ne(epoint, epoint)
   3.200 +  RETURNS boolean
   3.201 +  LANGUAGE C IMMUTABLE STRICT
   3.202 +  AS '$libdir/latlon-v0007', 'pgl_btree_epoint_ne';
   3.203 +
   3.204 +CREATE FUNCTION epoint_btree_ge(epoint, epoint)
   3.205 +  RETURNS boolean
   3.206 +  LANGUAGE C IMMUTABLE STRICT
   3.207 +  AS '$libdir/latlon-v0007', 'pgl_btree_epoint_ge';
   3.208 +
   3.209 +CREATE FUNCTION epoint_btree_gt(epoint, epoint)
   3.210 +  RETURNS boolean
   3.211 +  LANGUAGE C IMMUTABLE STRICT
   3.212 +  AS '$libdir/latlon-v0007', 'pgl_btree_epoint_gt';
   3.213 +
   3.214 +CREATE OPERATOR <<< (
   3.215 +  leftarg = epoint,
   3.216 +  rightarg = epoint,
   3.217 +  procedure = epoint_btree_lt,
   3.218 +  commutator = >>>,
   3.219 +  negator = >>>=,
   3.220 +  restrict = scalarltsel,
   3.221 +  join = scalarltjoinsel
   3.222 +);
   3.223 +
   3.224 +CREATE OPERATOR <<<= (
   3.225 +  leftarg = epoint,
   3.226 +  rightarg = epoint,
   3.227 +  procedure = epoint_btree_le,
   3.228 +  commutator = >>>=,
   3.229 +  negator = >>>,
   3.230 +  restrict = scalarltsel,
   3.231 +  join = scalarltjoinsel
   3.232 +);
   3.233 +
   3.234 +CREATE OPERATOR = (
   3.235 +  leftarg = epoint,
   3.236 +  rightarg = epoint,
   3.237 +  procedure = epoint_btree_eq,
   3.238 +  commutator = =,
   3.239 +  negator = <>,
   3.240 +  restrict = eqsel,
   3.241 +  join = eqjoinsel,
   3.242 +  merges
   3.243 +);
   3.244 +
   3.245 +CREATE OPERATOR <> (
   3.246 +  leftarg = epoint,
   3.247 +  rightarg = epoint,
   3.248 +  procedure = epoint_btree_eq,
   3.249 +  commutator = <>,
   3.250 +  negator = =,
   3.251 +  restrict = neqsel,
   3.252 +  join = neqjoinsel
   3.253 +);
   3.254 +
   3.255 +CREATE OPERATOR >>>= (
   3.256 +  leftarg = epoint,
   3.257 +  rightarg = epoint,
   3.258 +  procedure = epoint_btree_ge,
   3.259 +  commutator = <<<=,
   3.260 +  negator = <<<,
   3.261 +  restrict = scalargtsel,
   3.262 +  join = scalargtjoinsel
   3.263 +);
   3.264 +
   3.265 +CREATE OPERATOR >>> (
   3.266 +  leftarg = epoint,
   3.267 +  rightarg = epoint,
   3.268 +  procedure = epoint_btree_gt,
   3.269 +  commutator = <<<,
   3.270 +  negator = <<<=,
   3.271 +  restrict = scalargtsel,
   3.272 +  join = scalargtjoinsel
   3.273 +);
   3.274 +
   3.275 +CREATE FUNCTION epoint_btree_cmp(epoint, epoint)
   3.276 +  RETURNS int4
   3.277 +  LANGUAGE C IMMUTABLE STRICT
   3.278 +  AS '$libdir/latlon-v0007', 'pgl_btree_epoint_cmp';
   3.279 +
   3.280 +CREATE OPERATOR CLASS epoint_btree_ops
   3.281 +  DEFAULT FOR TYPE epoint USING btree AS
   3.282 +  OPERATOR 1 <<< ,
   3.283 +  OPERATOR 2 <<<= ,
   3.284 +  OPERATOR 3 = ,
   3.285 +  OPERATOR 4 >>>= ,
   3.286 +  OPERATOR 5 >>> ,
   3.287 +  FUNCTION 1 epoint_btree_cmp(epoint, epoint);
   3.288 +
   3.289 +-- end of B-tree support for epoint
   3.290 +
   3.291 +-- begin of B-tree support for ebox
   3.292 +
   3.293 +CREATE FUNCTION ebox_btree_lt(ebox, ebox)
   3.294 +  RETURNS boolean
   3.295 +  LANGUAGE C IMMUTABLE STRICT
   3.296 +  AS '$libdir/latlon-v0007', 'pgl_btree_ebox_lt';
   3.297 +
   3.298 +CREATE FUNCTION ebox_btree_le(ebox, ebox)
   3.299 +  RETURNS boolean
   3.300 +  LANGUAGE C IMMUTABLE STRICT
   3.301 +  AS '$libdir/latlon-v0007', 'pgl_btree_ebox_le';
   3.302 +
   3.303 +CREATE FUNCTION ebox_btree_eq(ebox, ebox)
   3.304 +  RETURNS boolean
   3.305 +  LANGUAGE C IMMUTABLE STRICT
   3.306 +  AS '$libdir/latlon-v0007', 'pgl_btree_ebox_eq';
   3.307 +
   3.308 +CREATE FUNCTION ebox_btree_ne(ebox, ebox)
   3.309 +  RETURNS boolean
   3.310 +  LANGUAGE C IMMUTABLE STRICT
   3.311 +  AS '$libdir/latlon-v0007', 'pgl_btree_ebox_ne';
   3.312 +
   3.313 +CREATE FUNCTION ebox_btree_ge(ebox, ebox)
   3.314 +  RETURNS boolean
   3.315 +  LANGUAGE C IMMUTABLE STRICT
   3.316 +  AS '$libdir/latlon-v0007', 'pgl_btree_ebox_ge';
   3.317 +
   3.318 +CREATE FUNCTION ebox_btree_gt(ebox, ebox)
   3.319 +  RETURNS boolean
   3.320 +  LANGUAGE C IMMUTABLE STRICT
   3.321 +  AS '$libdir/latlon-v0007', 'pgl_btree_ebox_gt';
   3.322 +
   3.323 +CREATE OPERATOR <<< (
   3.324 +  leftarg = ebox,
   3.325 +  rightarg = ebox,
   3.326 +  procedure = ebox_btree_lt,
   3.327 +  commutator = >>>,
   3.328 +  negator = >>>=,
   3.329 +  restrict = scalarltsel,
   3.330 +  join = scalarltjoinsel
   3.331 +);
   3.332 +
   3.333 +CREATE OPERATOR <<<= (
   3.334 +  leftarg = ebox,
   3.335 +  rightarg = ebox,
   3.336 +  procedure = ebox_btree_le,
   3.337 +  commutator = >>>=,
   3.338 +  negator = >>>,
   3.339 +  restrict = scalarltsel,
   3.340 +  join = scalarltjoinsel
   3.341 +);
   3.342 +
   3.343 +CREATE OPERATOR = (
   3.344 +  leftarg = ebox,
   3.345 +  rightarg = ebox,
   3.346 +  procedure = ebox_btree_eq,
   3.347 +  commutator = =,
   3.348 +  negator = <>,
   3.349 +  restrict = eqsel,
   3.350 +  join = eqjoinsel,
   3.351 +  merges
   3.352 +);
   3.353 +
   3.354 +CREATE OPERATOR <> (
   3.355 +  leftarg = ebox,
   3.356 +  rightarg = ebox,
   3.357 +  procedure = ebox_btree_eq,
   3.358 +  commutator = <>,
   3.359 +  negator = =,
   3.360 +  restrict = neqsel,
   3.361 +  join = neqjoinsel
   3.362 +);
   3.363 +
   3.364 +CREATE OPERATOR >>>= (
   3.365 +  leftarg = ebox,
   3.366 +  rightarg = ebox,
   3.367 +  procedure = ebox_btree_ge,
   3.368 +  commutator = <<<=,
   3.369 +  negator = <<<,
   3.370 +  restrict = scalargtsel,
   3.371 +  join = scalargtjoinsel
   3.372 +);
   3.373 +
   3.374 +CREATE OPERATOR >>> (
   3.375 +  leftarg = ebox,
   3.376 +  rightarg = ebox,
   3.377 +  procedure = ebox_btree_gt,
   3.378 +  commutator = <<<,
   3.379 +  negator = <<<=,
   3.380 +  restrict = scalargtsel,
   3.381 +  join = scalargtjoinsel
   3.382 +);
   3.383 +
   3.384 +CREATE FUNCTION ebox_btree_cmp(ebox, ebox)
   3.385 +  RETURNS int4
   3.386 +  LANGUAGE C IMMUTABLE STRICT
   3.387 +  AS '$libdir/latlon-v0007', 'pgl_btree_ebox_cmp';
   3.388 +
   3.389 +CREATE OPERATOR CLASS ebox_btree_ops
   3.390 +  DEFAULT FOR TYPE ebox USING btree AS
   3.391 +  OPERATOR 1 <<< ,
   3.392 +  OPERATOR 2 <<<= ,
   3.393 +  OPERATOR 3 = ,
   3.394 +  OPERATOR 4 >>>= ,
   3.395 +  OPERATOR 5 >>> ,
   3.396 +  FUNCTION 1 ebox_btree_cmp(ebox, ebox);
   3.397 +
   3.398 +-- end of B-tree support for ebox
   3.399 +
   3.400 +-- begin of B-tree support for ecircle
   3.401 +
   3.402 +CREATE FUNCTION ecircle_btree_lt(ecircle, ecircle)
   3.403 +  RETURNS boolean
   3.404 +  LANGUAGE C IMMUTABLE STRICT
   3.405 +  AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_lt';
   3.406 +
   3.407 +CREATE FUNCTION ecircle_btree_le(ecircle, ecircle)
   3.408 +  RETURNS boolean
   3.409 +  LANGUAGE C IMMUTABLE STRICT
   3.410 +  AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_le';
   3.411 +
   3.412 +CREATE FUNCTION ecircle_btree_eq(ecircle, ecircle)
   3.413 +  RETURNS boolean
   3.414 +  LANGUAGE C IMMUTABLE STRICT
   3.415 +  AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_eq';
   3.416 +
   3.417 +CREATE FUNCTION ecircle_btree_ne(ecircle, ecircle)
   3.418 +  RETURNS boolean
   3.419 +  LANGUAGE C IMMUTABLE STRICT
   3.420 +  AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_ne';
   3.421 +
   3.422 +CREATE FUNCTION ecircle_btree_ge(ecircle, ecircle)
   3.423 +  RETURNS boolean
   3.424 +  LANGUAGE C IMMUTABLE STRICT
   3.425 +  AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_ge';
   3.426 +
   3.427 +CREATE FUNCTION ecircle_btree_gt(ecircle, ecircle)
   3.428 +  RETURNS boolean
   3.429 +  LANGUAGE C IMMUTABLE STRICT
   3.430 +  AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_gt';
   3.431 +
   3.432 +CREATE OPERATOR <<< (
   3.433 +  leftarg = ecircle,
   3.434 +  rightarg = ecircle,
   3.435 +  procedure = ecircle_btree_lt,
   3.436 +  commutator = >>>,
   3.437 +  negator = >>>=,
   3.438 +  restrict = scalarltsel,
   3.439 +  join = scalarltjoinsel
   3.440 +);
   3.441 +
   3.442 +CREATE OPERATOR <<<= (
   3.443 +  leftarg = ecircle,
   3.444 +  rightarg = ecircle,
   3.445 +  procedure = ecircle_btree_le,
   3.446 +  commutator = >>>=,
   3.447 +  negator = >>>,
   3.448 +  restrict = scalarltsel,
   3.449 +  join = scalarltjoinsel
   3.450 +);
   3.451 +
   3.452 +CREATE OPERATOR = (
   3.453 +  leftarg = ecircle,
   3.454 +  rightarg = ecircle,
   3.455 +  procedure = ecircle_btree_eq,
   3.456 +  commutator = =,
   3.457 +  negator = <>,
   3.458 +  restrict = eqsel,
   3.459 +  join = eqjoinsel,
   3.460 +  merges
   3.461 +);
   3.462 +
   3.463 +CREATE OPERATOR <> (
   3.464 +  leftarg = ecircle,
   3.465 +  rightarg = ecircle,
   3.466 +  procedure = ecircle_btree_eq,
   3.467 +  commutator = <>,
   3.468 +  negator = =,
   3.469 +  restrict = neqsel,
   3.470 +  join = neqjoinsel
   3.471 +);
   3.472 +
   3.473 +CREATE OPERATOR >>>= (
   3.474 +  leftarg = ecircle,
   3.475 +  rightarg = ecircle,
   3.476 +  procedure = ecircle_btree_ge,
   3.477 +  commutator = <<<=,
   3.478 +  negator = <<<,
   3.479 +  restrict = scalargtsel,
   3.480 +  join = scalargtjoinsel
   3.481 +);
   3.482 +
   3.483 +CREATE OPERATOR >>> (
   3.484 +  leftarg = ecircle,
   3.485 +  rightarg = ecircle,
   3.486 +  procedure = ecircle_btree_gt,
   3.487 +  commutator = <<<,
   3.488 +  negator = <<<=,
   3.489 +  restrict = scalargtsel,
   3.490 +  join = scalargtjoinsel
   3.491 +);
   3.492 +
   3.493 +CREATE FUNCTION ecircle_btree_cmp(ecircle, ecircle)
   3.494 +  RETURNS int4
   3.495 +  LANGUAGE C IMMUTABLE STRICT
   3.496 +  AS '$libdir/latlon-v0007', 'pgl_btree_ecircle_cmp';
   3.497 +
   3.498 +CREATE OPERATOR CLASS ecircle_btree_ops
   3.499 +  DEFAULT FOR TYPE ecircle USING btree AS
   3.500 +  OPERATOR 1 <<< ,
   3.501 +  OPERATOR 2 <<<= ,
   3.502 +  OPERATOR 3 = ,
   3.503 +  OPERATOR 4 >>>= ,
   3.504 +  OPERATOR 5 >>> ,
   3.505 +  FUNCTION 1 ecircle_btree_cmp(ecircle, ecircle);
   3.506 +
   3.507 +-- end of B-tree support for ecircle
   3.508 +
   3.509 +
   3.510 +----------------
   3.511 +-- type casts --
   3.512 +----------------
   3.513 +
   3.514 +CREATE FUNCTION cast_epoint_to_ebox(epoint)
   3.515 +  RETURNS ebox
   3.516 +  LANGUAGE C IMMUTABLE STRICT
   3.517 +  AS '$libdir/latlon-v0007', 'pgl_epoint_to_ebox';
   3.518 +
   3.519 +CREATE CAST (epoint AS ebox) WITH FUNCTION cast_epoint_to_ebox(epoint);
   3.520 +
   3.521 +CREATE FUNCTION cast_epoint_to_ecircle(epoint)
   3.522 +  RETURNS ecircle
   3.523 +  LANGUAGE C IMMUTABLE STRICT
   3.524 +  AS '$libdir/latlon-v0007', 'pgl_epoint_to_ecircle';
   3.525 +
   3.526 +CREATE CAST (epoint AS ecircle) WITH FUNCTION cast_epoint_to_ecircle(epoint);
   3.527 +
   3.528 +CREATE FUNCTION cast_epoint_to_ecluster(epoint)
   3.529 +  RETURNS ecluster
   3.530 +  LANGUAGE C IMMUTABLE STRICT
   3.531 +  AS '$libdir/latlon-v0007', 'pgl_epoint_to_ecluster';
   3.532 +
   3.533 +CREATE CAST (epoint AS ecluster) WITH FUNCTION cast_epoint_to_ecluster(epoint);
   3.534 +
   3.535 +CREATE FUNCTION cast_ebox_to_ecluster(ebox)
   3.536 +  RETURNS ecluster
   3.537 +  LANGUAGE C IMMUTABLE STRICT
   3.538 +  AS '$libdir/latlon-v0007', 'pgl_ebox_to_ecluster';
   3.539 +
   3.540 +CREATE CAST (ebox AS ecluster) WITH FUNCTION cast_ebox_to_ecluster(ebox);
   3.541 +
   3.542 +
   3.543 +---------------------------
   3.544 +-- constructor functions --
   3.545 +---------------------------
   3.546 +
   3.547 +CREATE FUNCTION epoint(float8, float8)
   3.548 +  RETURNS epoint
   3.549 +  LANGUAGE C IMMUTABLE STRICT
   3.550 +  AS '$libdir/latlon-v0007', 'pgl_create_epoint';
   3.551 +
   3.552 +CREATE FUNCTION epoint_latlon(float8, float8)
   3.553 +  RETURNS epoint
   3.554 +  LANGUAGE SQL IMMUTABLE STRICT AS $$
   3.555 +    SELECT epoint($1, $2)
   3.556 +  $$;
   3.557 +
   3.558 +CREATE FUNCTION epoint_lonlat(float8, float8)
   3.559 +  RETURNS epoint
   3.560 +  LANGUAGE SQL IMMUTABLE STRICT AS $$
   3.561 +    SELECT epoint($2, $1)
   3.562 +  $$;
   3.563 +
   3.564 +CREATE FUNCTION empty_ebox()
   3.565 +  RETURNS ebox
   3.566 +  LANGUAGE C IMMUTABLE STRICT
   3.567 +  AS '$libdir/latlon-v0007', 'pgl_create_empty_ebox';
   3.568 +
   3.569 +CREATE FUNCTION ebox(float8, float8, float8, float8)
   3.570 +  RETURNS ebox
   3.571 +  LANGUAGE C IMMUTABLE STRICT
   3.572 +  AS '$libdir/latlon-v0007', 'pgl_create_ebox';
   3.573 +
   3.574 +CREATE FUNCTION ebox(epoint, epoint)
   3.575 +  RETURNS ebox
   3.576 +  LANGUAGE C IMMUTABLE STRICT
   3.577 +  AS '$libdir/latlon-v0007', 'pgl_create_ebox_from_epoints';
   3.578 +
   3.579 +CREATE FUNCTION ecircle(float8, float8, float8)
   3.580 +  RETURNS ecircle
   3.581 +  LANGUAGE C IMMUTABLE STRICT
   3.582 +  AS '$libdir/latlon-v0007', 'pgl_create_ecircle';
   3.583 +
   3.584 +CREATE FUNCTION ecircle(epoint, float8)
   3.585 +  RETURNS ecircle
   3.586 +  LANGUAGE C IMMUTABLE STRICT
   3.587 +  AS '$libdir/latlon-v0007', 'pgl_create_ecircle_from_epoint';
   3.588 +
   3.589 +CREATE FUNCTION ecluster_concat(ecluster[])
   3.590 +  RETURNS ecluster
   3.591 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.592 +    SELECT array_to_string($1, ' ')::ecluster
   3.593 +  $$;
   3.594 +
   3.595 +CREATE FUNCTION ecluster_concat(ecluster, ecluster)
   3.596 +  RETURNS ecluster
   3.597 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.598 +    SELECT ($1::text || ' ' || $2::text)::ecluster
   3.599 +  $$;
   3.600 +
   3.601 +CREATE FUNCTION ecluster_create_multipoint(epoint[])
   3.602 +  RETURNS ecluster
   3.603 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.604 +    SELECT
   3.605 +      array_to_string(array_agg('point (' || unnest || ')'), ' ')::ecluster
   3.606 +    FROM unnest($1)
   3.607 +  $$;
   3.608 +
   3.609 +CREATE FUNCTION ecluster_create_path(epoint[])
   3.610 +  RETURNS ecluster
   3.611 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.612 +    SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
   3.613 +      ('path (' || array_to_string($1, ' ') || ')')::ecluster
   3.614 +    END
   3.615 +    FROM array_to_string($1, ' ') AS "str"
   3.616 +  $$;
   3.617 +
   3.618 +CREATE FUNCTION ecluster_create_outline(epoint[])
   3.619 +  RETURNS ecluster
   3.620 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.621 +    SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
   3.622 +      ('outline (' || array_to_string($1, ' ') || ')')::ecluster
   3.623 +    END
   3.624 +    FROM array_to_string($1, ' ') AS "str"
   3.625 +  $$;
   3.626 +
   3.627 +CREATE FUNCTION ecluster_create_polygon(epoint[])
   3.628 +  RETURNS ecluster
   3.629 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.630 +    SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
   3.631 +      ('polygon (' || array_to_string($1, ' ') || ')')::ecluster
   3.632 +    END
   3.633 +    FROM array_to_string($1, ' ') AS "str"
   3.634 +  $$;
   3.635 +
   3.636 +
   3.637 +----------------------
   3.638 +-- getter functions --
   3.639 +----------------------
   3.640 +
   3.641 +CREATE FUNCTION latitude(epoint)
   3.642 +  RETURNS float8
   3.643 +  LANGUAGE C IMMUTABLE STRICT
   3.644 +  AS '$libdir/latlon-v0007', 'pgl_epoint_lat';
   3.645 +
   3.646 +CREATE FUNCTION longitude(epoint)
   3.647 +  RETURNS float8
   3.648 +  LANGUAGE C IMMUTABLE STRICT
   3.649 +  AS '$libdir/latlon-v0007', 'pgl_epoint_lon';
   3.650 +
   3.651 +CREATE FUNCTION min_latitude(ebox)
   3.652 +  RETURNS float8
   3.653 +  LANGUAGE C IMMUTABLE STRICT
   3.654 +  AS '$libdir/latlon-v0007', 'pgl_ebox_lat_min';
   3.655 +
   3.656 +CREATE FUNCTION max_latitude(ebox)
   3.657 +  RETURNS float8
   3.658 +  LANGUAGE C IMMUTABLE STRICT
   3.659 +  AS '$libdir/latlon-v0007', 'pgl_ebox_lat_max';
   3.660 +
   3.661 +CREATE FUNCTION min_longitude(ebox)
   3.662 +  RETURNS float8
   3.663 +  LANGUAGE C IMMUTABLE STRICT
   3.664 +  AS '$libdir/latlon-v0007', 'pgl_ebox_lon_min';
   3.665 +
   3.666 +CREATE FUNCTION max_longitude(ebox)
   3.667 +  RETURNS float8
   3.668 +  LANGUAGE C IMMUTABLE STRICT
   3.669 +  AS '$libdir/latlon-v0007', 'pgl_ebox_lon_max';
   3.670 +
   3.671 +CREATE FUNCTION center(ecircle)
   3.672 +  RETURNS epoint
   3.673 +  LANGUAGE C IMMUTABLE STRICT
   3.674 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_center';
   3.675 +
   3.676 +CREATE FUNCTION radius(ecircle)
   3.677 +  RETURNS float8
   3.678 +  LANGUAGE C IMMUTABLE STRICT
   3.679 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_radius';
   3.680 +
   3.681 +CREATE FUNCTION ecluster_extract_points(ecluster)
   3.682 +  RETURNS SETOF epoint
   3.683 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.684 +    SELECT "match"[2]::epoint
   3.685 +    FROM regexp_matches($1::text, e'(^| )point \\(([^)]+)\\)', 'g') AS "match"
   3.686 +  $$;
   3.687 +
   3.688 +CREATE FUNCTION ecluster_extract_paths(ecluster)
   3.689 +  RETURNS SETOF epoint[]
   3.690 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.691 +    SELECT (
   3.692 +      SELECT array_agg("m2"[1]::epoint)
   3.693 +      FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   3.694 +    )
   3.695 +    FROM regexp_matches($1::text, e'(^| )path \\(([^)]+)\\)', 'g') AS "m1"
   3.696 +  $$;
   3.697 +
   3.698 +CREATE FUNCTION ecluster_extract_outlines(ecluster)
   3.699 +  RETURNS SETOF epoint[]
   3.700 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.701 +    SELECT (
   3.702 +      SELECT array_agg("m2"[1]::epoint)
   3.703 +      FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   3.704 +    )
   3.705 +    FROM regexp_matches($1::text, e'(^| )outline \\(([^)]+)\\)', 'g') AS "m1"
   3.706 +  $$;
   3.707 +
   3.708 +CREATE FUNCTION ecluster_extract_polygons(ecluster)
   3.709 +  RETURNS SETOF epoint[]
   3.710 +  LANGUAGE sql IMMUTABLE STRICT AS $$
   3.711 +    SELECT (
   3.712 +      SELECT array_agg("m2"[1]::epoint)
   3.713 +      FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
   3.714 +    )
   3.715 +    FROM regexp_matches($1::text, e'(^| )polygon \\(([^)]+)\\)', 'g') AS "m1"
   3.716 +  $$;
   3.717 +
   3.718 +
   3.719 +---------------
   3.720 +-- operators --
   3.721 +---------------
   3.722 +
   3.723 +CREATE FUNCTION epoint_ebox_overlap_proc(epoint, ebox)
   3.724 +  RETURNS boolean
   3.725 +  LANGUAGE C IMMUTABLE STRICT
   3.726 +  AS '$libdir/latlon-v0007', 'pgl_epoint_ebox_overlap';
   3.727 +
   3.728 +CREATE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle)
   3.729 +  RETURNS boolean
   3.730 +  LANGUAGE C IMMUTABLE STRICT
   3.731 +  AS '$libdir/latlon-v0007', 'pgl_epoint_ecircle_overlap';
   3.732 +
   3.733 +CREATE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster)
   3.734 +  RETURNS boolean
   3.735 +  LANGUAGE C IMMUTABLE STRICT
   3.736 +  AS '$libdir/latlon-v0007', 'pgl_epoint_ecluster_overlap';
   3.737 +
   3.738 +CREATE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster)
   3.739 +  RETURNS boolean
   3.740 +  LANGUAGE C IMMUTABLE STRICT
   3.741 +  AS '$libdir/latlon-v0007', 'pgl_epoint_ecluster_may_overlap';
   3.742 +
   3.743 +CREATE FUNCTION ebox_overlap_proc(ebox, ebox)
   3.744 +  RETURNS boolean
   3.745 +  LANGUAGE C IMMUTABLE STRICT
   3.746 +  AS '$libdir/latlon-v0007', 'pgl_ebox_overlap';
   3.747 +
   3.748 +CREATE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle)
   3.749 +  RETURNS boolean
   3.750 +  LANGUAGE C IMMUTABLE STRICT
   3.751 +  AS '$libdir/latlon-v0007', 'pgl_ebox_ecircle_may_overlap';
   3.752 +
   3.753 +CREATE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster)
   3.754 +  RETURNS boolean
   3.755 +  LANGUAGE C IMMUTABLE STRICT
   3.756 +  AS '$libdir/latlon-v0007', 'pgl_ebox_ecluster_may_overlap';
   3.757 +
   3.758 +CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
   3.759 +  RETURNS boolean
   3.760 +  LANGUAGE C IMMUTABLE STRICT
   3.761 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_overlap';
   3.762 +
   3.763 +CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
   3.764 +  RETURNS boolean
   3.765 +  LANGUAGE C IMMUTABLE STRICT
   3.766 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_ecluster_overlap';
   3.767 +
   3.768 +CREATE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster)
   3.769 +  RETURNS boolean
   3.770 +  LANGUAGE C IMMUTABLE STRICT
   3.771 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_ecluster_may_overlap';
   3.772 +
   3.773 +CREATE FUNCTION ecluster_overlap_proc(ecluster, ecluster)
   3.774 +  RETURNS boolean
   3.775 +  LANGUAGE C IMMUTABLE STRICT
   3.776 +  AS '$libdir/latlon-v0007', 'pgl_ecluster_overlap';
   3.777 +
   3.778 +CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster)
   3.779 +  RETURNS boolean
   3.780 +  LANGUAGE C IMMUTABLE STRICT
   3.781 +  AS '$libdir/latlon-v0007', 'pgl_ecluster_may_overlap';
   3.782 +
   3.783 +CREATE FUNCTION ecluster_contains_proc(ecluster, ecluster)
   3.784 +  RETURNS boolean
   3.785 +  LANGUAGE C IMMUTABLE STRICT
   3.786 +  AS '$libdir/latlon-v0007', 'pgl_ecluster_contains';
   3.787 +
   3.788 +CREATE FUNCTION epoint_distance_proc(epoint, epoint)
   3.789 +  RETURNS float8
   3.790 +  LANGUAGE C IMMUTABLE STRICT
   3.791 +  AS '$libdir/latlon-v0007', 'pgl_epoint_distance';
   3.792 +
   3.793 +CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
   3.794 +  RETURNS float8
   3.795 +  LANGUAGE C IMMUTABLE STRICT
   3.796 +  AS '$libdir/latlon-v0007', 'pgl_epoint_ecircle_distance';
   3.797 +
   3.798 +CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
   3.799 +  RETURNS float8
   3.800 +  LANGUAGE C IMMUTABLE STRICT
   3.801 +  AS '$libdir/latlon-v0007', 'pgl_epoint_ecluster_distance';
   3.802 +
   3.803 +CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle)
   3.804 +  RETURNS float8
   3.805 +  LANGUAGE C IMMUTABLE STRICT
   3.806 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_distance';
   3.807 +
   3.808 +CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
   3.809 +  RETURNS float8
   3.810 +  LANGUAGE C IMMUTABLE STRICT
   3.811 +  AS '$libdir/latlon-v0007', 'pgl_ecircle_ecluster_distance';
   3.812 +
   3.813 +CREATE FUNCTION ecluster_distance_proc(ecluster, ecluster)
   3.814 +  RETURNS float8
   3.815 +  LANGUAGE C IMMUTABLE STRICT
   3.816 +  AS '$libdir/latlon-v0007', 'pgl_ecluster_distance';
   3.817 +
   3.818 +CREATE OPERATOR && (
   3.819 +  leftarg = epoint,
   3.820 +  rightarg = ebox,
   3.821 +  procedure = epoint_ebox_overlap_proc,
   3.822 +  commutator = &&,
   3.823 +  restrict = areasel,
   3.824 +  join = areajoinsel
   3.825 +);
   3.826 +
   3.827 +CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
   3.828 +  RETURNS boolean
   3.829 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
   3.830 +
   3.831 +CREATE OPERATOR && (
   3.832 +  leftarg = ebox,
   3.833 +  rightarg = epoint,
   3.834 +  procedure = epoint_ebox_overlap_commutator,
   3.835 +  commutator = &&,
   3.836 +  restrict = areasel,
   3.837 +  join = areajoinsel
   3.838 +);
   3.839 +
   3.840 +CREATE OPERATOR && (
   3.841 +  leftarg = epoint,
   3.842 +  rightarg = ecircle,
   3.843 +  procedure = epoint_ecircle_overlap_proc,
   3.844 +  commutator = &&,
   3.845 +  restrict = areasel,
   3.846 +  join = areajoinsel
   3.847 +);
   3.848 +
   3.849 +CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
   3.850 +  RETURNS boolean
   3.851 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
   3.852 +
   3.853 +CREATE OPERATOR && (
   3.854 +  leftarg = ecircle,
   3.855 +  rightarg = epoint,
   3.856 +  procedure = epoint_ecircle_overlap_commutator,
   3.857 +  commutator = &&,
   3.858 +  restrict = areasel,
   3.859 +  join = areajoinsel
   3.860 +);
   3.861 +
   3.862 +CREATE OPERATOR && (
   3.863 +  leftarg = epoint,
   3.864 +  rightarg = ecluster,
   3.865 +  procedure = epoint_ecluster_overlap_proc,
   3.866 +  commutator = &&,
   3.867 +  restrict = areasel,
   3.868 +  join = areajoinsel
   3.869 +);
   3.870 +
   3.871 +CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
   3.872 +  RETURNS boolean
   3.873 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
   3.874 +
   3.875 +CREATE OPERATOR && (
   3.876 +  leftarg = ecluster,
   3.877 +  rightarg = epoint,
   3.878 +  procedure = epoint_ecluster_overlap_commutator,
   3.879 +  commutator = &&,
   3.880 +  restrict = areasel,
   3.881 +  join = areajoinsel
   3.882 +);
   3.883 +
   3.884 +CREATE OPERATOR && (
   3.885 +  leftarg = ebox,
   3.886 +  rightarg = ebox,
   3.887 +  procedure = ebox_overlap_proc,
   3.888 +  commutator = &&,
   3.889 +  restrict = areasel,
   3.890 +  join = areajoinsel
   3.891 +);
   3.892 +
   3.893 +CREATE OPERATOR && (
   3.894 +  leftarg = ecircle,
   3.895 +  rightarg = ecircle,
   3.896 +  procedure = ecircle_overlap_proc,
   3.897 +  commutator = &&,
   3.898 +  restrict = areasel,
   3.899 +  join = areajoinsel
   3.900 +);
   3.901 +
   3.902 +CREATE OPERATOR && (
   3.903 +  leftarg = ecircle,
   3.904 +  rightarg = ecluster,
   3.905 +  procedure = ecircle_ecluster_overlap_proc,
   3.906 +  commutator = &&,
   3.907 +  restrict = areasel,
   3.908 +  join = areajoinsel
   3.909 +);
   3.910 +
   3.911 +CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
   3.912 +  RETURNS boolean
   3.913 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
   3.914 +
   3.915 +CREATE OPERATOR && (
   3.916 +  leftarg = ecluster,
   3.917 +  rightarg = ecircle,
   3.918 +  procedure = ecircle_ecluster_overlap_commutator,
   3.919 +  commutator = &&,
   3.920 +  restrict = areasel,
   3.921 +  join = areajoinsel
   3.922 +);
   3.923 +
   3.924 +CREATE OPERATOR && (
   3.925 +  leftarg = ecluster,
   3.926 +  rightarg = ecluster,
   3.927 +  procedure = ecluster_overlap_proc,
   3.928 +  commutator = &&,
   3.929 +  restrict = areasel,
   3.930 +  join = areajoinsel
   3.931 +);
   3.932 +
   3.933 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ebox, ecircle)
   3.934 +  RETURNS boolean
   3.935 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2';
   3.936 +
   3.937 +CREATE OPERATOR && (
   3.938 +  leftarg = ebox,
   3.939 +  rightarg = ecircle,
   3.940 +  procedure = ebox_ecircle_overlap_castwrap,
   3.941 +  commutator = &&,
   3.942 +  restrict = areasel,
   3.943 +  join = areajoinsel
   3.944 +);
   3.945 +
   3.946 +CREATE FUNCTION ebox_ecircle_overlap_castwrap(ecircle, ebox)
   3.947 +  RETURNS boolean
   3.948 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster';
   3.949 +
   3.950 +CREATE OPERATOR && (
   3.951 +  leftarg = ecircle,
   3.952 +  rightarg = ebox,
   3.953 +  procedure = ebox_ecircle_overlap_castwrap,
   3.954 +  commutator = &&,
   3.955 +  restrict = areasel,
   3.956 +  join = areajoinsel
   3.957 +);
   3.958 +
   3.959 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ebox, ecluster)
   3.960 +  RETURNS boolean
   3.961 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster && $2';
   3.962 +
   3.963 +CREATE OPERATOR && (
   3.964 +  leftarg = ebox,
   3.965 +  rightarg = ecluster,
   3.966 +  procedure = ebox_ecluster_overlap_castwrap,
   3.967 +  commutator = &&,
   3.968 +  restrict = areasel,
   3.969 +  join = areajoinsel
   3.970 +);
   3.971 +
   3.972 +CREATE FUNCTION ebox_ecluster_overlap_castwrap(ecluster, ebox)
   3.973 +  RETURNS boolean
   3.974 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 && $2::ecluster';
   3.975 +
   3.976 +CREATE OPERATOR && (
   3.977 +  leftarg = ecluster,
   3.978 +  rightarg = ebox,
   3.979 +  procedure = ebox_ecluster_overlap_castwrap,
   3.980 +  commutator = &&,
   3.981 +  restrict = areasel,
   3.982 +  join = areajoinsel
   3.983 +);
   3.984 +
   3.985 +CREATE OPERATOR &&+ (
   3.986 +  leftarg = epoint,
   3.987 +  rightarg = ecluster,
   3.988 +  procedure = epoint_ecluster_may_overlap_proc,
   3.989 +  commutator = &&+,
   3.990 +  restrict = areasel,
   3.991 +  join = areajoinsel
   3.992 +);
   3.993 +
   3.994 +CREATE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint)
   3.995 +  RETURNS boolean
   3.996 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
   3.997 +
   3.998 +CREATE OPERATOR &&+ (
   3.999 +  leftarg = ecluster,
  3.1000 +  rightarg = epoint,
  3.1001 +  procedure = epoint_ecluster_may_overlap_commutator,
  3.1002 +  commutator = &&+,
  3.1003 +  restrict = areasel,
  3.1004 +  join = areajoinsel
  3.1005 +);
  3.1006 +
  3.1007 +CREATE OPERATOR &&+ (
  3.1008 +  leftarg = ebox,
  3.1009 +  rightarg = ecircle,
  3.1010 +  procedure = ebox_ecircle_may_overlap_proc,
  3.1011 +  commutator = &&+,
  3.1012 +  restrict = areasel,
  3.1013 +  join = areajoinsel
  3.1014 +);
  3.1015 +
  3.1016 +CREATE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox)
  3.1017 +  RETURNS boolean
  3.1018 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
  3.1019 +
  3.1020 +CREATE OPERATOR &&+ (
  3.1021 +  leftarg = ecircle,
  3.1022 +  rightarg = ebox,
  3.1023 +  procedure = ebox_ecircle_may_overlap_commutator,
  3.1024 +  commutator = &&+,
  3.1025 +  restrict = areasel,
  3.1026 +  join = areajoinsel
  3.1027 +);
  3.1028 +
  3.1029 +CREATE OPERATOR &&+ (
  3.1030 +  leftarg = ebox,
  3.1031 +  rightarg = ecluster,
  3.1032 +  procedure = ebox_ecluster_may_overlap_proc,
  3.1033 +  commutator = &&+,
  3.1034 +  restrict = areasel,
  3.1035 +  join = areajoinsel
  3.1036 +);
  3.1037 +
  3.1038 +CREATE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox)
  3.1039 +  RETURNS boolean
  3.1040 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
  3.1041 +
  3.1042 +CREATE OPERATOR &&+ (
  3.1043 +  leftarg = ecluster,
  3.1044 +  rightarg = ebox,
  3.1045 +  procedure = ebox_ecluster_may_overlap_commutator,
  3.1046 +  commutator = &&+,
  3.1047 +  restrict = areasel,
  3.1048 +  join = areajoinsel
  3.1049 +);
  3.1050 +
  3.1051 +CREATE OPERATOR &&+ (
  3.1052 +  leftarg = ecircle,
  3.1053 +  rightarg = ecluster,
  3.1054 +  procedure = ecircle_ecluster_may_overlap_proc,
  3.1055 +  commutator = &&+,
  3.1056 +  restrict = areasel,
  3.1057 +  join = areajoinsel
  3.1058 +);
  3.1059 +
  3.1060 +CREATE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle)
  3.1061 +  RETURNS boolean
  3.1062 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
  3.1063 +
  3.1064 +CREATE OPERATOR &&+ (
  3.1065 +  leftarg = ecluster,
  3.1066 +  rightarg = ecircle,
  3.1067 +  procedure = ecircle_ecluster_may_overlap_commutator,
  3.1068 +  commutator = &&+,
  3.1069 +  restrict = areasel,
  3.1070 +  join = areajoinsel
  3.1071 +);
  3.1072 +
  3.1073 +CREATE OPERATOR &&+ (
  3.1074 +  leftarg = ecluster,
  3.1075 +  rightarg = ecluster,
  3.1076 +  procedure = ecluster_may_overlap_proc,
  3.1077 +  commutator = &&+,
  3.1078 +  restrict = areasel,
  3.1079 +  join = areajoinsel
  3.1080 +);
  3.1081 +
  3.1082 +CREATE OPERATOR @> (
  3.1083 +  leftarg = ebox,
  3.1084 +  rightarg = epoint,
  3.1085 +  procedure = epoint_ebox_overlap_commutator,
  3.1086 +  commutator = <@,
  3.1087 +  restrict = areasel,
  3.1088 +  join = areajoinsel
  3.1089 +);
  3.1090 +
  3.1091 +CREATE OPERATOR <@ (
  3.1092 +  leftarg = epoint,
  3.1093 +  rightarg = ebox,
  3.1094 +  procedure = epoint_ebox_overlap_proc,
  3.1095 +  commutator = @>,
  3.1096 +  restrict = areasel,
  3.1097 +  join = areajoinsel
  3.1098 +);
  3.1099 +
  3.1100 +CREATE OPERATOR @> (
  3.1101 +  leftarg = ecluster,
  3.1102 +  rightarg = epoint,
  3.1103 +  procedure = epoint_ecluster_overlap_commutator,
  3.1104 +  commutator = <@,
  3.1105 +  restrict = areasel,
  3.1106 +  join = areajoinsel
  3.1107 +);
  3.1108 +
  3.1109 +CREATE OPERATOR <@ (
  3.1110 +  leftarg = epoint,
  3.1111 +  rightarg = ecluster,
  3.1112 +  procedure = epoint_ecluster_overlap_proc,
  3.1113 +  commutator = <@,
  3.1114 +  restrict = areasel,
  3.1115 +  join = areajoinsel
  3.1116 +);
  3.1117 +
  3.1118 +CREATE OPERATOR @> (
  3.1119 +  leftarg = ecluster,
  3.1120 +  rightarg = ecluster,
  3.1121 +  procedure = ecluster_contains_proc,
  3.1122 +  commutator = <@,
  3.1123 +  restrict = areasel,
  3.1124 +  join = areajoinsel
  3.1125 +);
  3.1126 +
  3.1127 +CREATE FUNCTION ecluster_contains_commutator(ecluster, ecluster)
  3.1128 +  RETURNS boolean
  3.1129 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1';
  3.1130 +
  3.1131 +CREATE OPERATOR <@ (
  3.1132 +  leftarg = ecluster,
  3.1133 +  rightarg = ecluster,
  3.1134 +  procedure = ecluster_contains_commutator,
  3.1135 +  commutator = @>,
  3.1136 +  restrict = areasel,
  3.1137 +  join = areajoinsel
  3.1138 +);
  3.1139 +
  3.1140 +CREATE FUNCTION ebox_contains_castwrap(ebox, ebox)
  3.1141 +  RETURNS boolean
  3.1142 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2::ecluster';
  3.1143 +
  3.1144 +CREATE OPERATOR @> (
  3.1145 +  leftarg = ebox,
  3.1146 +  rightarg = ebox,
  3.1147 +  procedure = ebox_contains_castwrap,
  3.1148 +  commutator = <@,
  3.1149 +  restrict = areasel,
  3.1150 +  join = areajoinsel
  3.1151 +);
  3.1152 +
  3.1153 +CREATE FUNCTION ebox_contains_swapped_castwrap(ebox, ebox)
  3.1154 +  RETURNS boolean
  3.1155 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1::ecluster';
  3.1156 +
  3.1157 +CREATE OPERATOR <@ (
  3.1158 +  leftarg = ebox,
  3.1159 +  rightarg = ebox,
  3.1160 +  procedure = ebox_contains_swapped_castwrap,
  3.1161 +  commutator = @>,
  3.1162 +  restrict = areasel,
  3.1163 +  join = areajoinsel
  3.1164 +);
  3.1165 +
  3.1166 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ebox, ecluster)
  3.1167 +  RETURNS boolean
  3.1168 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster @> $2';
  3.1169 +
  3.1170 +CREATE OPERATOR @> (
  3.1171 +  leftarg = ebox,
  3.1172 +  rightarg = ecluster,
  3.1173 +  procedure = ebox_ecluster_contains_castwrap,
  3.1174 +  commutator = <@,
  3.1175 +  restrict = areasel,
  3.1176 +  join = areajoinsel
  3.1177 +);
  3.1178 +
  3.1179 +CREATE FUNCTION ebox_ecluster_contains_castwrap(ecluster, ebox)
  3.1180 +  RETURNS boolean
  3.1181 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2::ecluster @> $1';
  3.1182 +
  3.1183 +CREATE OPERATOR <@ (
  3.1184 +  leftarg = ecluster,
  3.1185 +  rightarg = ebox,
  3.1186 +  procedure = ebox_ecluster_contains_castwrap,
  3.1187 +  commutator = @>,
  3.1188 +  restrict = areasel,
  3.1189 +  join = areajoinsel
  3.1190 +);
  3.1191 +
  3.1192 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ecluster, ebox)
  3.1193 +  RETURNS boolean
  3.1194 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 @> $2::ecluster';
  3.1195 +
  3.1196 +CREATE OPERATOR @> (
  3.1197 +  leftarg = ecluster,
  3.1198 +  rightarg = ebox,
  3.1199 +  procedure = ecluster_ebox_contains_castwrap,
  3.1200 +  commutator = <@,
  3.1201 +  restrict = areasel,
  3.1202 +  join = areajoinsel
  3.1203 +);
  3.1204 +
  3.1205 +CREATE FUNCTION ecluster_ebox_contains_castwrap(ebox, ecluster)
  3.1206 +  RETURNS boolean
  3.1207 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 @> $1::ecluster';
  3.1208 +
  3.1209 +CREATE OPERATOR <@ (
  3.1210 +  leftarg = ebox,
  3.1211 +  rightarg = ecluster,
  3.1212 +  procedure = ecluster_ebox_contains_castwrap,
  3.1213 +  commutator = @>,
  3.1214 +  restrict = areasel,
  3.1215 +  join = areajoinsel
  3.1216 +);
  3.1217 +
  3.1218 +CREATE OPERATOR <-> (
  3.1219 +  leftarg = epoint,
  3.1220 +  rightarg = epoint,
  3.1221 +  procedure = epoint_distance_proc,
  3.1222 +  commutator = <->
  3.1223 +);
  3.1224 +
  3.1225 +CREATE OPERATOR <-> (
  3.1226 +  leftarg = epoint,
  3.1227 +  rightarg = ecircle,
  3.1228 +  procedure = epoint_ecircle_distance_proc,
  3.1229 +  commutator = <->
  3.1230 +);
  3.1231 +
  3.1232 +CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
  3.1233 +  RETURNS float8
  3.1234 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
  3.1235 +
  3.1236 +CREATE OPERATOR <-> (
  3.1237 +  leftarg = ecircle,
  3.1238 +  rightarg = epoint,
  3.1239 +  procedure = epoint_ecircle_distance_commutator,
  3.1240 +  commutator = <->
  3.1241 +);
  3.1242 +
  3.1243 +CREATE OPERATOR <-> (
  3.1244 +  leftarg = epoint,
  3.1245 +  rightarg = ecluster,
  3.1246 +  procedure = epoint_ecluster_distance_proc,
  3.1247 +  commutator = <->
  3.1248 +);
  3.1249 +
  3.1250 +CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
  3.1251 +  RETURNS float8
  3.1252 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
  3.1253 +
  3.1254 +CREATE OPERATOR <-> (
  3.1255 +  leftarg = ecluster,
  3.1256 +  rightarg = epoint,
  3.1257 +  procedure = epoint_ecluster_distance_commutator,
  3.1258 +  commutator = <->
  3.1259 +);
  3.1260 +
  3.1261 +CREATE OPERATOR <-> (
  3.1262 +  leftarg = ecircle,
  3.1263 +  rightarg = ecircle,
  3.1264 +  procedure = ecircle_distance_proc,
  3.1265 +  commutator = <->
  3.1266 +);
  3.1267 +
  3.1268 +CREATE OPERATOR <-> (
  3.1269 +  leftarg = ecircle,
  3.1270 +  rightarg = ecluster,
  3.1271 +  procedure = ecircle_ecluster_distance_proc,
  3.1272 +  commutator = <->
  3.1273 +);
  3.1274 +
  3.1275 +CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
  3.1276 +  RETURNS float8
  3.1277 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
  3.1278 +
  3.1279 +CREATE OPERATOR <-> (
  3.1280 +  leftarg = ecluster,
  3.1281 +  rightarg = ecircle,
  3.1282 +  procedure = ecircle_ecluster_distance_commutator,
  3.1283 +  commutator = <->
  3.1284 +);
  3.1285 +
  3.1286 +CREATE OPERATOR <-> (
  3.1287 +  leftarg = ecluster,
  3.1288 +  rightarg = ecluster,
  3.1289 +  procedure = ecluster_distance_proc,
  3.1290 +  commutator = <->
  3.1291 +);
  3.1292 +
  3.1293 +CREATE FUNCTION epoint_ebox_distance_castwrap(epoint, ebox)
  3.1294 +  RETURNS float8
  3.1295 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
  3.1296 +
  3.1297 +CREATE OPERATOR <-> (
  3.1298 +  leftarg = epoint,
  3.1299 +  rightarg = ebox,
  3.1300 +  procedure = epoint_ebox_distance_castwrap,
  3.1301 +  commutator = <->
  3.1302 +);
  3.1303 +
  3.1304 +CREATE FUNCTION epoint_ebox_distance_castwrap(ebox, epoint)
  3.1305 +  RETURNS float8
  3.1306 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
  3.1307 +
  3.1308 +CREATE OPERATOR <-> (
  3.1309 +  leftarg = ebox,
  3.1310 +  rightarg = epoint,
  3.1311 +  procedure = epoint_ebox_distance_castwrap,
  3.1312 +  commutator = <->
  3.1313 +);
  3.1314 +
  3.1315 +CREATE FUNCTION ebox_distance_castwrap(ebox, ebox)
  3.1316 +  RETURNS float8
  3.1317 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2::ecluster';
  3.1318 +
  3.1319 +CREATE OPERATOR <-> (
  3.1320 +  leftarg = ebox,
  3.1321 +  rightarg = ebox,
  3.1322 +  procedure = ebox_distance_castwrap,
  3.1323 +  commutator = <->
  3.1324 +);
  3.1325 +
  3.1326 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ebox, ecircle)
  3.1327 +  RETURNS float8
  3.1328 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
  3.1329 +
  3.1330 +CREATE OPERATOR <-> (
  3.1331 +  leftarg = ebox,
  3.1332 +  rightarg = ecircle,
  3.1333 +  procedure = ebox_ecircle_distance_castwrap,
  3.1334 +  commutator = <->
  3.1335 +);
  3.1336 +
  3.1337 +CREATE FUNCTION ebox_ecircle_distance_castwrap(ecircle, ebox)
  3.1338 +  RETURNS float8
  3.1339 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
  3.1340 +
  3.1341 +CREATE OPERATOR <-> (
  3.1342 +  leftarg = ecircle,
  3.1343 +  rightarg = ebox,
  3.1344 +  procedure = ebox_ecircle_distance_castwrap,
  3.1345 +  commutator = <->
  3.1346 +);
  3.1347 +
  3.1348 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ebox, ecluster)
  3.1349 +  RETURNS float8
  3.1350 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1::ecluster <-> $2';
  3.1351 +
  3.1352 +CREATE OPERATOR <-> (
  3.1353 +  leftarg = ebox,
  3.1354 +  rightarg = ecluster,
  3.1355 +  procedure = ebox_ecluster_distance_castwrap,
  3.1356 +  commutator = <->
  3.1357 +);
  3.1358 +
  3.1359 +CREATE FUNCTION ebox_ecluster_distance_castwrap(ecluster, ebox)
  3.1360 +  RETURNS float8
  3.1361 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2::ecluster';
  3.1362 +
  3.1363 +CREATE OPERATOR <-> (
  3.1364 +  leftarg = ecluster,
  3.1365 +  rightarg = ebox,
  3.1366 +  procedure = ebox_ecluster_distance_castwrap,
  3.1367 +  commutator = <->
  3.1368 +);
  3.1369 +
  3.1370 +
  3.1371 +----------------
  3.1372 +-- GiST index --
  3.1373 +----------------
  3.1374 +
  3.1375 +CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
  3.1376 +  RETURNS boolean
  3.1377 +  LANGUAGE C STRICT
  3.1378 +  AS '$libdir/latlon-v0007', 'pgl_gist_consistent';
  3.1379 +
  3.1380 +CREATE FUNCTION pgl_gist_union(internal, internal)
  3.1381 +  RETURNS internal
  3.1382 +  LANGUAGE C STRICT
  3.1383 +  AS '$libdir/latlon-v0007', 'pgl_gist_union';
  3.1384 +
  3.1385 +CREATE FUNCTION pgl_gist_compress_epoint(internal)
  3.1386 +  RETURNS internal
  3.1387 +  LANGUAGE C STRICT
  3.1388 +  AS '$libdir/latlon-v0007', 'pgl_gist_compress_epoint';
  3.1389 +
  3.1390 +CREATE FUNCTION pgl_gist_compress_ecircle(internal)
  3.1391 +  RETURNS internal
  3.1392 +  LANGUAGE C STRICT
  3.1393 +  AS '$libdir/latlon-v0007', 'pgl_gist_compress_ecircle';
  3.1394 +
  3.1395 +CREATE FUNCTION pgl_gist_compress_ecluster(internal)
  3.1396 +  RETURNS internal
  3.1397 +  LANGUAGE C STRICT
  3.1398 +  AS '$libdir/latlon-v0007', 'pgl_gist_compress_ecluster';
  3.1399 +
  3.1400 +CREATE FUNCTION pgl_gist_decompress(internal)
  3.1401 +  RETURNS internal
  3.1402 +  LANGUAGE C STRICT
  3.1403 +  AS '$libdir/latlon-v0007', 'pgl_gist_decompress';
  3.1404 +
  3.1405 +CREATE FUNCTION pgl_gist_penalty(internal, internal, internal)
  3.1406 +  RETURNS internal
  3.1407 +  LANGUAGE C STRICT
  3.1408 +  AS '$libdir/latlon-v0007', 'pgl_gist_penalty';
  3.1409 +
  3.1410 +CREATE FUNCTION pgl_gist_picksplit(internal, internal)
  3.1411 +  RETURNS internal
  3.1412 +  LANGUAGE C STRICT
  3.1413 +  AS '$libdir/latlon-v0007', 'pgl_gist_picksplit';
  3.1414 +
  3.1415 +CREATE FUNCTION pgl_gist_same(internal, internal, internal)
  3.1416 +  RETURNS internal
  3.1417 +  LANGUAGE C STRICT
  3.1418 +  AS '$libdir/latlon-v0007', 'pgl_gist_same';
  3.1419 +
  3.1420 +CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
  3.1421 +  RETURNS internal
  3.1422 +  LANGUAGE C STRICT
  3.1423 +  AS '$libdir/latlon-v0007', 'pgl_gist_distance';
  3.1424 +
  3.1425 +CREATE OPERATOR CLASS epoint_ops
  3.1426 +  DEFAULT FOR TYPE epoint USING gist AS
  3.1427 +  OPERATOR  11 = ,
  3.1428 +  OPERATOR  22 &&  (epoint, ebox),
  3.1429 +  OPERATOR 222 <@  (epoint, ebox),
  3.1430 +  OPERATOR  23 &&  (epoint, ecircle),
  3.1431 +  OPERATOR  24 &&  (epoint, ecluster),
  3.1432 +  OPERATOR 124 &&+ (epoint, ecluster),
  3.1433 +  OPERATOR 224 <@  (epoint, ecluster),
  3.1434 +  OPERATOR  31 <-> (epoint, epoint) FOR ORDER BY float_ops,
  3.1435 +  OPERATOR  32 <-> (epoint, ebox) FOR ORDER BY float_ops,
  3.1436 +  OPERATOR  33 <-> (epoint, ecircle) FOR ORDER BY float_ops,
  3.1437 +  OPERATOR  34 <-> (epoint, ecluster) FOR ORDER BY float_ops,
  3.1438 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  3.1439 +  FUNCTION 2 pgl_gist_union(internal, internal),
  3.1440 +  FUNCTION 3 pgl_gist_compress_epoint(internal),
  3.1441 +  FUNCTION 4 pgl_gist_decompress(internal),
  3.1442 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  3.1443 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  3.1444 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  3.1445 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  3.1446 +  STORAGE ekey_point;
  3.1447 +
  3.1448 +CREATE OPERATOR CLASS ecircle_ops
  3.1449 +  DEFAULT FOR TYPE ecircle USING gist AS
  3.1450 +  OPERATOR  13 = ,
  3.1451 +  OPERATOR  21 &&  (ecircle, epoint),
  3.1452 +  OPERATOR  22 &&  (ecircle, ebox),
  3.1453 +  OPERATOR 122 &&+ (ecircle, ebox),
  3.1454 +  OPERATOR  23 &&  (ecircle, ecircle),
  3.1455 +  OPERATOR  24 &&  (ecircle, ecluster),
  3.1456 +  OPERATOR 124 &&+ (ecircle, ecluster),
  3.1457 +  OPERATOR  31 <-> (ecircle, epoint) FOR ORDER BY float_ops,
  3.1458 +  OPERATOR  32 <-> (ecircle, ebox) FOR ORDER BY float_ops,
  3.1459 +  OPERATOR  33 <-> (ecircle, ecircle) FOR ORDER BY float_ops,
  3.1460 +  OPERATOR  34 <-> (ecircle, ecluster) FOR ORDER BY float_ops,
  3.1461 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  3.1462 +  FUNCTION 2 pgl_gist_union(internal, internal),
  3.1463 +  FUNCTION 3 pgl_gist_compress_ecircle(internal),
  3.1464 +  FUNCTION 4 pgl_gist_decompress(internal),
  3.1465 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  3.1466 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  3.1467 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  3.1468 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  3.1469 +  STORAGE ekey_area;
  3.1470 +
  3.1471 +CREATE OPERATOR CLASS ecluster_ops
  3.1472 +  DEFAULT FOR TYPE ecluster USING gist AS
  3.1473 +  OPERATOR  21 &&  (ecluster, epoint),
  3.1474 +  OPERATOR 121 &&+ (ecluster, epoint),
  3.1475 +  OPERATOR 221 @>  (ecluster, epoint),
  3.1476 +  OPERATOR  22 &&  (ecluster, ebox),
  3.1477 +  OPERATOR 122 &&+ (ecluster, ebox),
  3.1478 +  OPERATOR 222 @>  (ecluster, ebox),
  3.1479 +  OPERATOR 322 <@  (ecluster, ebox),
  3.1480 +  OPERATOR  23 &&  (ecluster, ecircle),
  3.1481 +  OPERATOR 123 &&+ (ecluster, ecircle),
  3.1482 +  OPERATOR  24 &&  (ecluster, ecluster),
  3.1483 +  OPERATOR 124 &&+ (ecluster, ecluster),
  3.1484 +  OPERATOR 224 @>  (ecluster, ecluster),
  3.1485 +  OPERATOR 324 <@  (ecluster, ecluster),
  3.1486 +  OPERATOR  31 <-> (ecluster, epoint) FOR ORDER BY float_ops,
  3.1487 +  OPERATOR  32 <-> (ecluster, ebox) FOR ORDER BY float_ops,
  3.1488 +  OPERATOR  33 <-> (ecluster, ecircle) FOR ORDER BY float_ops,
  3.1489 +  OPERATOR  34 <-> (ecluster, ecluster) FOR ORDER BY float_ops,
  3.1490 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  3.1491 +  FUNCTION 2 pgl_gist_union(internal, internal),
  3.1492 +  FUNCTION 3 pgl_gist_compress_ecluster(internal),
  3.1493 +  FUNCTION 4 pgl_gist_decompress(internal),
  3.1494 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  3.1495 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  3.1496 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  3.1497 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  3.1498 +  STORAGE ekey_area;
  3.1499 +
  3.1500 +
  3.1501 +---------------------
  3.1502 +-- alias functions --
  3.1503 +---------------------
  3.1504 +
  3.1505 +CREATE FUNCTION distance(epoint, epoint)
  3.1506 +  RETURNS float8
  3.1507 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
  3.1508 +
  3.1509 +CREATE FUNCTION distance(ecluster, epoint)
  3.1510 +  RETURNS float8
  3.1511 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
  3.1512 +
  3.1513 +CREATE FUNCTION distance_within(epoint, epoint, float8)
  3.1514 +  RETURNS boolean
  3.1515 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
  3.1516 +
  3.1517 +CREATE FUNCTION distance_within(ecluster, epoint, float8)
  3.1518 +  RETURNS boolean
  3.1519 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
  3.1520 +
  3.1521 +
  3.1522 +--------------------------------
  3.1523 +-- other data storage formats --
  3.1524 +--------------------------------
  3.1525 +
  3.1526 +CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint_lonlat')
  3.1527 +  RETURNS epoint
  3.1528 +  LANGUAGE plpgsql IMMUTABLE STRICT AS $$
  3.1529 +    DECLARE
  3.1530 +      "result" epoint;
  3.1531 +    BEGIN
  3.1532 +      IF $3 = 'epoint_lonlat' THEN
  3.1533 +        -- avoid dynamic command execution for better performance
  3.1534 +        RETURN epoint($2, $1);
  3.1535 +      END IF;
  3.1536 +      IF $3 = 'epoint' OR $3 = 'epoint_latlon' THEN
  3.1537 +        -- avoid dynamic command execution for better performance
  3.1538 +        RETURN epoint($1, $2);
  3.1539 +      END IF;
  3.1540 +      EXECUTE 'SELECT ' || $3 || '($1, $2)' INTO STRICT "result" USING $1, $2;
  3.1541 +      RETURN "result";
  3.1542 +    END;
  3.1543 +  $$;
  3.1544 +
  3.1545 +CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
  3.1546 +  RETURNS epoint
  3.1547 +  LANGUAGE sql IMMUTABLE STRICT AS $$
  3.1548 +    SELECT CASE
  3.1549 +    WHEN $1->>'type' = 'Point' THEN
  3.1550 +      coords_to_epoint(
  3.1551 +        ($1->'coordinates'->>1)::float8,
  3.1552 +        ($1->'coordinates'->>0)::float8,
  3.1553 +        $2
  3.1554 +      )
  3.1555 +    WHEN $1->>'type' = 'Feature' THEN
  3.1556 +      GeoJSON_to_epoint($1->'geometry', $2)
  3.1557 +    ELSE
  3.1558 +      NULL
  3.1559 +    END
  3.1560 +  $$;
  3.1561 +
  3.1562 +CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
  3.1563 +  RETURNS ecluster
  3.1564 +  LANGUAGE sql IMMUTABLE STRICT AS $$
  3.1565 +    SELECT CASE $1->>'type'
  3.1566 +    WHEN 'Point' THEN
  3.1567 +      coords_to_epoint(
  3.1568 +        ($1->'coordinates'->>1)::float8,
  3.1569 +        ($1->'coordinates'->>0)::float8,
  3.1570 +        $2
  3.1571 +      )::ecluster
  3.1572 +    WHEN 'MultiPoint' THEN
  3.1573 +      ( SELECT ecluster_create_multipoint(array_agg(
  3.1574 +          coords_to_epoint(
  3.1575 +            ("coord"->>1)::float8,
  3.1576 +            ("coord"->>0)::float8,
  3.1577 +            $2
  3.1578 +          )
  3.1579 +        ))
  3.1580 +        FROM jsonb_array_elements($1->'coordinates') AS "coord"
  3.1581 +      )
  3.1582 +    WHEN 'LineString' THEN
  3.1583 +      ( SELECT ecluster_create_path(array_agg(
  3.1584 +          coords_to_epoint(
  3.1585 +            ("coord"->>1)::float8,
  3.1586 +            ("coord"->>0)::float8,
  3.1587 +            $2
  3.1588 +          )
  3.1589 +        ))
  3.1590 +        FROM jsonb_array_elements($1->'coordinates') AS "coord"
  3.1591 +      )
  3.1592 +    WHEN 'MultiLineString' THEN
  3.1593 +      ( SELECT ecluster_concat(array_agg(
  3.1594 +          ( SELECT ecluster_create_path(array_agg(
  3.1595 +              coords_to_epoint(
  3.1596 +                ("coord"->>1)::float8,
  3.1597 +                ("coord"->>0)::float8,
  3.1598 +                $2
  3.1599 +              )
  3.1600 +            ))
  3.1601 +            FROM jsonb_array_elements("coord_array") AS "coord"
  3.1602 +          )
  3.1603 +        ))
  3.1604 +        FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
  3.1605 +      )
  3.1606 +    WHEN 'Polygon' THEN
  3.1607 +      ( SELECT ecluster_concat(array_agg(
  3.1608 +          ( SELECT ecluster_create_polygon(array_agg(
  3.1609 +              coords_to_epoint(
  3.1610 +                ("coord"->>1)::float8,
  3.1611 +                ("coord"->>0)::float8,
  3.1612 +                $2
  3.1613 +              )
  3.1614 +            ))
  3.1615 +            FROM jsonb_array_elements("coord_array") AS "coord"
  3.1616 +          )
  3.1617 +        ))
  3.1618 +        FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
  3.1619 +      )
  3.1620 +    WHEN 'MultiPolygon' THEN
  3.1621 +      ( SELECT ecluster_concat(array_agg(
  3.1622 +          ( SELECT ecluster_concat(array_agg(
  3.1623 +              ( SELECT ecluster_create_polygon(array_agg(
  3.1624 +                  coords_to_epoint(
  3.1625 +                    ("coord"->>1)::float8,
  3.1626 +                    ("coord"->>0)::float8,
  3.1627 +                    $2
  3.1628 +                  )
  3.1629 +                ))
  3.1630 +                FROM jsonb_array_elements("coord_array") AS "coord"
  3.1631 +              )
  3.1632 +            ))
  3.1633 +            FROM jsonb_array_elements("coord_array_array") AS "coord_array"
  3.1634 +          )
  3.1635 +        ))
  3.1636 +        FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array"
  3.1637 +      )
  3.1638 +    WHEN 'Feature' THEN
  3.1639 +      GeoJSON_to_ecluster($1->'geometry', $2)
  3.1640 +    WHEN 'FeatureCollection' THEN
  3.1641 +      ( SELECT ecluster_concat(array_agg(
  3.1642 +          GeoJSON_to_ecluster("feature", $2)
  3.1643 +        ))
  3.1644 +        FROM jsonb_array_elements($1->'features') AS "feature"
  3.1645 +      )
  3.1646 +    ELSE
  3.1647 +      NULL
  3.1648 +    END
  3.1649 +  $$;
  3.1650 +

Impressum / About Us