pgLatLon

annotate latlon--0.3.sql @ 10:684a78d2f9f0

Introduced lossy overlap operator (&&+) and fixed ecircle overlap searches on GiST-indexed ecluster columns
author jbe
date Fri Sep 02 14:08:01 2016 +0200 (2016-09-02)
parents dc8da756b761
children
rev   line source
jbe@0 1
jbe@0 2 ----------------------------------------
jbe@0 3 -- forward declarations (shell types) --
jbe@0 4 ----------------------------------------
jbe@0 5
jbe@0 6 CREATE TYPE epoint;
jbe@0 7 CREATE TYPE ebox;
jbe@0 8 CREATE TYPE ecircle;
jbe@0 9 CREATE TYPE ecluster;
jbe@0 10
jbe@0 11
jbe@0 12 ------------------------------------------------------------
jbe@0 13 -- dummy input/output functions for dummy index key types --
jbe@0 14 ------------------------------------------------------------
jbe@0 15
jbe@0 16 CREATE FUNCTION ekey_point_in_dummy(cstring)
jbe@0 17 RETURNS ekey_point
jbe@0 18 LANGUAGE C IMMUTABLE STRICT
jbe@9 19 AS '$libdir/latlon-v0003', 'pgl_notimpl';
jbe@0 20
jbe@0 21 CREATE FUNCTION ekey_point_out_dummy(ekey_point)
jbe@0 22 RETURNS cstring
jbe@0 23 LANGUAGE C IMMUTABLE STRICT
jbe@9 24 AS '$libdir/latlon-v0003', 'pgl_notimpl';
jbe@0 25
jbe@0 26 CREATE FUNCTION ekey_area_in_dummy(cstring)
jbe@0 27 RETURNS ekey_area
jbe@0 28 LANGUAGE C IMMUTABLE STRICT
jbe@9 29 AS '$libdir/latlon-v0003', 'pgl_notimpl';
jbe@0 30
jbe@0 31 CREATE FUNCTION ekey_area_out_dummy(ekey_area)
jbe@0 32 RETURNS cstring
jbe@0 33 LANGUAGE C IMMUTABLE STRICT
jbe@9 34 AS '$libdir/latlon-v0003', 'pgl_notimpl';
jbe@0 35
jbe@0 36
jbe@0 37 --------------------------
jbe@0 38 -- text input functions --
jbe@0 39 --------------------------
jbe@0 40
jbe@0 41 CREATE FUNCTION epoint_in(cstring)
jbe@0 42 RETURNS epoint
jbe@0 43 LANGUAGE C IMMUTABLE STRICT
jbe@9 44 AS '$libdir/latlon-v0003', 'pgl_epoint_in';
jbe@0 45
jbe@0 46 CREATE FUNCTION ebox_in(cstring)
jbe@0 47 RETURNS ebox
jbe@0 48 LANGUAGE C IMMUTABLE STRICT
jbe@9 49 AS '$libdir/latlon-v0003', 'pgl_ebox_in';
jbe@0 50
jbe@0 51 CREATE FUNCTION ecircle_in(cstring)
jbe@0 52 RETURNS ecircle
jbe@0 53 LANGUAGE C IMMUTABLE STRICT
jbe@9 54 AS '$libdir/latlon-v0003', 'pgl_ecircle_in';
jbe@0 55
jbe@0 56 CREATE FUNCTION ecluster_in(cstring)
jbe@0 57 RETURNS ecluster
jbe@0 58 LANGUAGE C IMMUTABLE STRICT
jbe@9 59 AS '$libdir/latlon-v0003', 'pgl_ecluster_in';
jbe@0 60
jbe@0 61
jbe@0 62 ---------------------------
jbe@0 63 -- text output functions --
jbe@0 64 ---------------------------
jbe@0 65
jbe@0 66 CREATE FUNCTION epoint_out(epoint)
jbe@0 67 RETURNS cstring
jbe@0 68 LANGUAGE C IMMUTABLE STRICT
jbe@9 69 AS '$libdir/latlon-v0003', 'pgl_epoint_out';
jbe@0 70
jbe@0 71 CREATE FUNCTION ebox_out(ebox)
jbe@0 72 RETURNS cstring
jbe@0 73 LANGUAGE C IMMUTABLE STRICT
jbe@9 74 AS '$libdir/latlon-v0003', 'pgl_ebox_out';
jbe@0 75
jbe@0 76 CREATE FUNCTION ecircle_out(ecircle)
jbe@0 77 RETURNS cstring
jbe@0 78 LANGUAGE C IMMUTABLE STRICT
jbe@9 79 AS '$libdir/latlon-v0003', 'pgl_ecircle_out';
jbe@0 80
jbe@0 81 CREATE FUNCTION ecluster_out(ecluster)
jbe@0 82 RETURNS cstring
jbe@0 83 LANGUAGE C IMMUTABLE STRICT
jbe@9 84 AS '$libdir/latlon-v0003', 'pgl_ecluster_out';
jbe@0 85
jbe@0 86
jbe@0 87 --------------------------
jbe@0 88 -- binary I/O functions --
jbe@0 89 --------------------------
jbe@0 90
jbe@0 91 CREATE FUNCTION epoint_recv(internal)
jbe@0 92 RETURNS epoint
jbe@0 93 LANGUAGE C IMMUTABLE STRICT
jbe@9 94 AS '$libdir/latlon-v0003', 'pgl_epoint_recv';
jbe@0 95
jbe@0 96 CREATE FUNCTION ebox_recv(internal)
jbe@0 97 RETURNS ebox
jbe@0 98 LANGUAGE C IMMUTABLE STRICT
jbe@9 99 AS '$libdir/latlon-v0003', 'pgl_ebox_recv';
jbe@0 100
jbe@0 101 CREATE FUNCTION ecircle_recv(internal)
jbe@0 102 RETURNS ecircle
jbe@0 103 LANGUAGE C IMMUTABLE STRICT
jbe@9 104 AS '$libdir/latlon-v0003', 'pgl_ecircle_recv';
jbe@0 105
jbe@0 106 CREATE FUNCTION epoint_send(epoint)
jbe@0 107 RETURNS bytea
jbe@0 108 LANGUAGE C IMMUTABLE STRICT
jbe@9 109 AS '$libdir/latlon-v0003', 'pgl_epoint_send';
jbe@0 110
jbe@0 111 CREATE FUNCTION ebox_send(ebox)
jbe@0 112 RETURNS bytea
jbe@0 113 LANGUAGE C IMMUTABLE STRICT
jbe@9 114 AS '$libdir/latlon-v0003', 'pgl_ebox_send';
jbe@0 115
jbe@0 116 CREATE FUNCTION ecircle_send(ecircle)
jbe@0 117 RETURNS bytea
jbe@0 118 LANGUAGE C IMMUTABLE STRICT
jbe@9 119 AS '$libdir/latlon-v0003', 'pgl_ecircle_send';
jbe@0 120
jbe@0 121
jbe@0 122 -----------------------------------------------
jbe@0 123 -- type definitions of dummy index key types --
jbe@0 124 -----------------------------------------------
jbe@0 125
jbe@0 126 CREATE TYPE ekey_point (
jbe@0 127 internallength = 8,
jbe@0 128 input = ekey_point_in_dummy,
jbe@0 129 output = ekey_point_out_dummy,
jbe@0 130 alignment = char );
jbe@0 131
jbe@0 132 CREATE TYPE ekey_area (
jbe@0 133 internallength = 9,
jbe@0 134 input = ekey_area_in_dummy,
jbe@0 135 output = ekey_area_out_dummy,
jbe@0 136 alignment = char );
jbe@0 137
jbe@0 138
jbe@0 139 ------------------------------------------
jbe@0 140 -- definitions of geographic data types --
jbe@0 141 ------------------------------------------
jbe@0 142
jbe@0 143 CREATE TYPE epoint (
jbe@0 144 internallength = 16,
jbe@0 145 input = epoint_in,
jbe@0 146 output = epoint_out,
jbe@0 147 receive = epoint_recv,
jbe@0 148 send = epoint_send,
jbe@0 149 alignment = double );
jbe@0 150
jbe@0 151 CREATE TYPE ebox (
jbe@0 152 internallength = 32,
jbe@0 153 input = ebox_in,
jbe@0 154 output = ebox_out,
jbe@0 155 receive = ebox_recv,
jbe@0 156 send = ebox_send,
jbe@0 157 alignment = double );
jbe@0 158
jbe@0 159 CREATE TYPE ecircle (
jbe@0 160 internallength = 24,
jbe@0 161 input = ecircle_in,
jbe@0 162 output = ecircle_out,
jbe@0 163 receive = ecircle_recv,
jbe@0 164 send = ecircle_send,
jbe@0 165 alignment = double );
jbe@0 166
jbe@0 167 CREATE TYPE ecluster (
jbe@0 168 internallength = VARIABLE,
jbe@0 169 input = ecluster_in,
jbe@0 170 output = ecluster_out,
jbe@0 171 alignment = double,
jbe@0 172 storage = external );
jbe@0 173
jbe@0 174
jbe@0 175 --------------------
jbe@0 176 -- B-tree support --
jbe@0 177 --------------------
jbe@0 178
jbe@0 179 -- begin of B-tree support for epoint
jbe@0 180
jbe@0 181 CREATE FUNCTION epoint_btree_lt(epoint, epoint)
jbe@0 182 RETURNS boolean
jbe@0 183 LANGUAGE C IMMUTABLE STRICT
jbe@9 184 AS '$libdir/latlon-v0003', 'pgl_btree_epoint_lt';
jbe@0 185
jbe@0 186 CREATE FUNCTION epoint_btree_le(epoint, epoint)
jbe@0 187 RETURNS boolean
jbe@0 188 LANGUAGE C IMMUTABLE STRICT
jbe@9 189 AS '$libdir/latlon-v0003', 'pgl_btree_epoint_le';
jbe@0 190
jbe@0 191 CREATE FUNCTION epoint_btree_eq(epoint, epoint)
jbe@0 192 RETURNS boolean
jbe@0 193 LANGUAGE C IMMUTABLE STRICT
jbe@9 194 AS '$libdir/latlon-v0003', 'pgl_btree_epoint_eq';
jbe@0 195
jbe@0 196 CREATE FUNCTION epoint_btree_ne(epoint, epoint)
jbe@0 197 RETURNS boolean
jbe@0 198 LANGUAGE C IMMUTABLE STRICT
jbe@9 199 AS '$libdir/latlon-v0003', 'pgl_btree_epoint_ne';
jbe@0 200
jbe@0 201 CREATE FUNCTION epoint_btree_ge(epoint, epoint)
jbe@0 202 RETURNS boolean
jbe@0 203 LANGUAGE C IMMUTABLE STRICT
jbe@9 204 AS '$libdir/latlon-v0003', 'pgl_btree_epoint_ge';
jbe@0 205
jbe@0 206 CREATE FUNCTION epoint_btree_gt(epoint, epoint)
jbe@0 207 RETURNS boolean
jbe@0 208 LANGUAGE C IMMUTABLE STRICT
jbe@9 209 AS '$libdir/latlon-v0003', 'pgl_btree_epoint_gt';
jbe@0 210
jbe@0 211 CREATE OPERATOR <<< (
jbe@0 212 leftarg = epoint,
jbe@0 213 rightarg = epoint,
jbe@0 214 procedure = epoint_btree_lt,
jbe@0 215 commutator = >>>,
jbe@0 216 negator = >>>=,
jbe@0 217 restrict = scalarltsel,
jbe@0 218 join = scalarltjoinsel
jbe@0 219 );
jbe@0 220
jbe@0 221 CREATE OPERATOR <<<= (
jbe@0 222 leftarg = epoint,
jbe@0 223 rightarg = epoint,
jbe@0 224 procedure = epoint_btree_le,
jbe@0 225 commutator = >>>=,
jbe@0 226 negator = >>>,
jbe@0 227 restrict = scalarltsel,
jbe@0 228 join = scalarltjoinsel
jbe@0 229 );
jbe@0 230
jbe@0 231 CREATE OPERATOR = (
jbe@0 232 leftarg = epoint,
jbe@0 233 rightarg = epoint,
jbe@0 234 procedure = epoint_btree_eq,
jbe@0 235 commutator = =,
jbe@0 236 negator = <>,
jbe@0 237 restrict = eqsel,
jbe@0 238 join = eqjoinsel,
jbe@0 239 merges
jbe@0 240 );
jbe@0 241
jbe@0 242 CREATE OPERATOR <> (
jbe@0 243 leftarg = epoint,
jbe@0 244 rightarg = epoint,
jbe@0 245 procedure = epoint_btree_eq,
jbe@0 246 commutator = <>,
jbe@0 247 negator = =,
jbe@0 248 restrict = neqsel,
jbe@0 249 join = neqjoinsel
jbe@0 250 );
jbe@0 251
jbe@0 252 CREATE OPERATOR >>>= (
jbe@0 253 leftarg = epoint,
jbe@0 254 rightarg = epoint,
jbe@0 255 procedure = epoint_btree_ge,
jbe@0 256 commutator = <<<=,
jbe@0 257 negator = <<<,
jbe@0 258 restrict = scalargtsel,
jbe@0 259 join = scalargtjoinsel
jbe@0 260 );
jbe@0 261
jbe@0 262 CREATE OPERATOR >>> (
jbe@0 263 leftarg = epoint,
jbe@0 264 rightarg = epoint,
jbe@0 265 procedure = epoint_btree_gt,
jbe@0 266 commutator = <<<,
jbe@0 267 negator = <<<=,
jbe@0 268 restrict = scalargtsel,
jbe@0 269 join = scalargtjoinsel
jbe@0 270 );
jbe@0 271
jbe@0 272 CREATE FUNCTION epoint_btree_cmp(epoint, epoint)
jbe@0 273 RETURNS int4
jbe@0 274 LANGUAGE C IMMUTABLE STRICT
jbe@9 275 AS '$libdir/latlon-v0003', 'pgl_btree_epoint_cmp';
jbe@0 276
jbe@0 277 CREATE OPERATOR CLASS epoint_btree_ops
jbe@0 278 DEFAULT FOR TYPE epoint USING btree AS
jbe@0 279 OPERATOR 1 <<< ,
jbe@0 280 OPERATOR 2 <<<= ,
jbe@0 281 OPERATOR 3 = ,
jbe@0 282 OPERATOR 4 >>>= ,
jbe@0 283 OPERATOR 5 >>> ,
jbe@0 284 FUNCTION 1 epoint_btree_cmp(epoint, epoint);
jbe@0 285
jbe@0 286 -- end of B-tree support for epoint
jbe@0 287
jbe@0 288 -- begin of B-tree support for ebox
jbe@0 289
jbe@0 290 CREATE FUNCTION ebox_btree_lt(ebox, ebox)
jbe@0 291 RETURNS boolean
jbe@0 292 LANGUAGE C IMMUTABLE STRICT
jbe@9 293 AS '$libdir/latlon-v0003', 'pgl_btree_ebox_lt';
jbe@0 294
jbe@0 295 CREATE FUNCTION ebox_btree_le(ebox, ebox)
jbe@0 296 RETURNS boolean
jbe@0 297 LANGUAGE C IMMUTABLE STRICT
jbe@9 298 AS '$libdir/latlon-v0003', 'pgl_btree_ebox_le';
jbe@0 299
jbe@0 300 CREATE FUNCTION ebox_btree_eq(ebox, ebox)
jbe@0 301 RETURNS boolean
jbe@0 302 LANGUAGE C IMMUTABLE STRICT
jbe@9 303 AS '$libdir/latlon-v0003', 'pgl_btree_ebox_eq';
jbe@0 304
jbe@0 305 CREATE FUNCTION ebox_btree_ne(ebox, ebox)
jbe@0 306 RETURNS boolean
jbe@0 307 LANGUAGE C IMMUTABLE STRICT
jbe@9 308 AS '$libdir/latlon-v0003', 'pgl_btree_ebox_ne';
jbe@0 309
jbe@0 310 CREATE FUNCTION ebox_btree_ge(ebox, ebox)
jbe@0 311 RETURNS boolean
jbe@0 312 LANGUAGE C IMMUTABLE STRICT
jbe@9 313 AS '$libdir/latlon-v0003', 'pgl_btree_ebox_ge';
jbe@0 314
jbe@0 315 CREATE FUNCTION ebox_btree_gt(ebox, ebox)
jbe@0 316 RETURNS boolean
jbe@0 317 LANGUAGE C IMMUTABLE STRICT
jbe@9 318 AS '$libdir/latlon-v0003', 'pgl_btree_ebox_gt';
jbe@0 319
jbe@0 320 CREATE OPERATOR <<< (
jbe@0 321 leftarg = ebox,
jbe@0 322 rightarg = ebox,
jbe@0 323 procedure = ebox_btree_lt,
jbe@0 324 commutator = >>>,
jbe@0 325 negator = >>>=,
jbe@0 326 restrict = scalarltsel,
jbe@0 327 join = scalarltjoinsel
jbe@0 328 );
jbe@0 329
jbe@0 330 CREATE OPERATOR <<<= (
jbe@0 331 leftarg = ebox,
jbe@0 332 rightarg = ebox,
jbe@0 333 procedure = ebox_btree_le,
jbe@0 334 commutator = >>>=,
jbe@0 335 negator = >>>,
jbe@0 336 restrict = scalarltsel,
jbe@0 337 join = scalarltjoinsel
jbe@0 338 );
jbe@0 339
jbe@0 340 CREATE OPERATOR = (
jbe@0 341 leftarg = ebox,
jbe@0 342 rightarg = ebox,
jbe@0 343 procedure = ebox_btree_eq,
jbe@0 344 commutator = =,
jbe@0 345 negator = <>,
jbe@0 346 restrict = eqsel,
jbe@0 347 join = eqjoinsel,
jbe@0 348 merges
jbe@0 349 );
jbe@0 350
jbe@0 351 CREATE OPERATOR <> (
jbe@0 352 leftarg = ebox,
jbe@0 353 rightarg = ebox,
jbe@0 354 procedure = ebox_btree_eq,
jbe@0 355 commutator = <>,
jbe@0 356 negator = =,
jbe@0 357 restrict = neqsel,
jbe@0 358 join = neqjoinsel
jbe@0 359 );
jbe@0 360
jbe@0 361 CREATE OPERATOR >>>= (
jbe@0 362 leftarg = ebox,
jbe@0 363 rightarg = ebox,
jbe@0 364 procedure = ebox_btree_ge,
jbe@0 365 commutator = <<<=,
jbe@0 366 negator = <<<,
jbe@0 367 restrict = scalargtsel,
jbe@0 368 join = scalargtjoinsel
jbe@0 369 );
jbe@0 370
jbe@0 371 CREATE OPERATOR >>> (
jbe@0 372 leftarg = ebox,
jbe@0 373 rightarg = ebox,
jbe@0 374 procedure = ebox_btree_gt,
jbe@0 375 commutator = <<<,
jbe@0 376 negator = <<<=,
jbe@0 377 restrict = scalargtsel,
jbe@0 378 join = scalargtjoinsel
jbe@0 379 );
jbe@0 380
jbe@0 381 CREATE FUNCTION ebox_btree_cmp(ebox, ebox)
jbe@0 382 RETURNS int4
jbe@0 383 LANGUAGE C IMMUTABLE STRICT
jbe@9 384 AS '$libdir/latlon-v0003', 'pgl_btree_ebox_cmp';
jbe@0 385
jbe@0 386 CREATE OPERATOR CLASS ebox_btree_ops
jbe@0 387 DEFAULT FOR TYPE ebox USING btree AS
jbe@0 388 OPERATOR 1 <<< ,
jbe@0 389 OPERATOR 2 <<<= ,
jbe@0 390 OPERATOR 3 = ,
jbe@0 391 OPERATOR 4 >>>= ,
jbe@0 392 OPERATOR 5 >>> ,
jbe@0 393 FUNCTION 1 ebox_btree_cmp(ebox, ebox);
jbe@0 394
jbe@0 395 -- end of B-tree support for ebox
jbe@0 396
jbe@0 397 -- begin of B-tree support for ecircle
jbe@0 398
jbe@0 399 CREATE FUNCTION ecircle_btree_lt(ecircle, ecircle)
jbe@0 400 RETURNS boolean
jbe@0 401 LANGUAGE C IMMUTABLE STRICT
jbe@9 402 AS '$libdir/latlon-v0003', 'pgl_btree_ecircle_lt';
jbe@0 403
jbe@0 404 CREATE FUNCTION ecircle_btree_le(ecircle, ecircle)
jbe@0 405 RETURNS boolean
jbe@0 406 LANGUAGE C IMMUTABLE STRICT
jbe@9 407 AS '$libdir/latlon-v0003', 'pgl_btree_ecircle_le';
jbe@0 408
jbe@0 409 CREATE FUNCTION ecircle_btree_eq(ecircle, ecircle)
jbe@0 410 RETURNS boolean
jbe@0 411 LANGUAGE C IMMUTABLE STRICT
jbe@9 412 AS '$libdir/latlon-v0003', 'pgl_btree_ecircle_eq';
jbe@0 413
jbe@0 414 CREATE FUNCTION ecircle_btree_ne(ecircle, ecircle)
jbe@0 415 RETURNS boolean
jbe@0 416 LANGUAGE C IMMUTABLE STRICT
jbe@9 417 AS '$libdir/latlon-v0003', 'pgl_btree_ecircle_ne';
jbe@0 418
jbe@0 419 CREATE FUNCTION ecircle_btree_ge(ecircle, ecircle)
jbe@0 420 RETURNS boolean
jbe@0 421 LANGUAGE C IMMUTABLE STRICT
jbe@9 422 AS '$libdir/latlon-v0003', 'pgl_btree_ecircle_ge';
jbe@0 423
jbe@0 424 CREATE FUNCTION ecircle_btree_gt(ecircle, ecircle)
jbe@0 425 RETURNS boolean
jbe@0 426 LANGUAGE C IMMUTABLE STRICT
jbe@9 427 AS '$libdir/latlon-v0003', 'pgl_btree_ecircle_gt';
jbe@0 428
jbe@0 429 CREATE OPERATOR <<< (
jbe@0 430 leftarg = ecircle,
jbe@0 431 rightarg = ecircle,
jbe@0 432 procedure = ecircle_btree_lt,
jbe@0 433 commutator = >>>,
jbe@0 434 negator = >>>=,
jbe@0 435 restrict = scalarltsel,
jbe@0 436 join = scalarltjoinsel
jbe@0 437 );
jbe@0 438
jbe@0 439 CREATE OPERATOR <<<= (
jbe@0 440 leftarg = ecircle,
jbe@0 441 rightarg = ecircle,
jbe@0 442 procedure = ecircle_btree_le,
jbe@0 443 commutator = >>>=,
jbe@0 444 negator = >>>,
jbe@0 445 restrict = scalarltsel,
jbe@0 446 join = scalarltjoinsel
jbe@0 447 );
jbe@0 448
jbe@0 449 CREATE OPERATOR = (
jbe@0 450 leftarg = ecircle,
jbe@0 451 rightarg = ecircle,
jbe@0 452 procedure = ecircle_btree_eq,
jbe@0 453 commutator = =,
jbe@0 454 negator = <>,
jbe@0 455 restrict = eqsel,
jbe@0 456 join = eqjoinsel,
jbe@0 457 merges
jbe@0 458 );
jbe@0 459
jbe@0 460 CREATE OPERATOR <> (
jbe@0 461 leftarg = ecircle,
jbe@0 462 rightarg = ecircle,
jbe@0 463 procedure = ecircle_btree_eq,
jbe@0 464 commutator = <>,
jbe@0 465 negator = =,
jbe@0 466 restrict = neqsel,
jbe@0 467 join = neqjoinsel
jbe@0 468 );
jbe@0 469
jbe@0 470 CREATE OPERATOR >>>= (
jbe@0 471 leftarg = ecircle,
jbe@0 472 rightarg = ecircle,
jbe@0 473 procedure = ecircle_btree_ge,
jbe@0 474 commutator = <<<=,
jbe@0 475 negator = <<<,
jbe@0 476 restrict = scalargtsel,
jbe@0 477 join = scalargtjoinsel
jbe@0 478 );
jbe@0 479
jbe@0 480 CREATE OPERATOR >>> (
jbe@0 481 leftarg = ecircle,
jbe@0 482 rightarg = ecircle,
jbe@0 483 procedure = ecircle_btree_gt,
jbe@0 484 commutator = <<<,
jbe@0 485 negator = <<<=,
jbe@0 486 restrict = scalargtsel,
jbe@0 487 join = scalargtjoinsel
jbe@0 488 );
jbe@0 489
jbe@0 490 CREATE FUNCTION ecircle_btree_cmp(ecircle, ecircle)
jbe@0 491 RETURNS int4
jbe@0 492 LANGUAGE C IMMUTABLE STRICT
jbe@9 493 AS '$libdir/latlon-v0003', 'pgl_btree_ecircle_cmp';
jbe@0 494
jbe@0 495 CREATE OPERATOR CLASS ecircle_btree_ops
jbe@0 496 DEFAULT FOR TYPE ecircle USING btree AS
jbe@0 497 OPERATOR 1 <<< ,
jbe@0 498 OPERATOR 2 <<<= ,
jbe@0 499 OPERATOR 3 = ,
jbe@0 500 OPERATOR 4 >>>= ,
jbe@0 501 OPERATOR 5 >>> ,
jbe@0 502 FUNCTION 1 ecircle_btree_cmp(ecircle, ecircle);
jbe@0 503
jbe@0 504 -- end of B-tree support for ecircle
jbe@0 505
jbe@0 506
jbe@0 507 ----------------
jbe@0 508 -- type casts --
jbe@0 509 ----------------
jbe@0 510
jbe@0 511 CREATE FUNCTION cast_epoint_to_ebox(epoint)
jbe@0 512 RETURNS ebox
jbe@0 513 LANGUAGE C IMMUTABLE STRICT
jbe@9 514 AS '$libdir/latlon-v0003', 'pgl_epoint_to_ebox';
jbe@0 515
jbe@0 516 CREATE CAST (epoint AS ebox) WITH FUNCTION cast_epoint_to_ebox(epoint);
jbe@0 517
jbe@0 518 CREATE FUNCTION cast_epoint_to_ecircle(epoint)
jbe@0 519 RETURNS ecircle
jbe@0 520 LANGUAGE C IMMUTABLE STRICT
jbe@9 521 AS '$libdir/latlon-v0003', 'pgl_epoint_to_ecircle';
jbe@0 522
jbe@0 523 CREATE CAST (epoint AS ecircle) WITH FUNCTION cast_epoint_to_ecircle(epoint);
jbe@0 524
jbe@0 525 CREATE FUNCTION cast_epoint_to_ecluster(epoint)
jbe@0 526 RETURNS ecluster
jbe@0 527 LANGUAGE C IMMUTABLE STRICT
jbe@9 528 AS '$libdir/latlon-v0003', 'pgl_epoint_to_ecluster';
jbe@0 529
jbe@0 530 CREATE CAST (epoint AS ecluster) WITH FUNCTION cast_epoint_to_ecluster(epoint);
jbe@0 531
jbe@0 532 CREATE FUNCTION cast_ebox_to_ecluster(ebox)
jbe@0 533 RETURNS ecluster
jbe@0 534 LANGUAGE C IMMUTABLE STRICT
jbe@9 535 AS '$libdir/latlon-v0003', 'pgl_ebox_to_ecluster';
jbe@0 536
jbe@0 537 CREATE CAST (ebox AS ecluster) WITH FUNCTION cast_ebox_to_ecluster(ebox);
jbe@0 538
jbe@0 539
jbe@0 540 ---------------------------
jbe@0 541 -- constructor functions --
jbe@0 542 ---------------------------
jbe@0 543
jbe@0 544 CREATE FUNCTION epoint(float8, float8)
jbe@0 545 RETURNS epoint
jbe@0 546 LANGUAGE C IMMUTABLE STRICT
jbe@9 547 AS '$libdir/latlon-v0003', 'pgl_create_epoint';
jbe@0 548
jbe@0 549 CREATE FUNCTION epoint_latlon(float8, float8)
jbe@0 550 RETURNS epoint
jbe@0 551 LANGUAGE SQL IMMUTABLE STRICT AS $$
jbe@0 552 SELECT epoint($1, $2)
jbe@0 553 $$;
jbe@0 554
jbe@0 555 CREATE FUNCTION epoint_lonlat(float8, float8)
jbe@0 556 RETURNS epoint
jbe@0 557 LANGUAGE SQL IMMUTABLE STRICT AS $$
jbe@0 558 SELECT epoint($2, $1)
jbe@0 559 $$;
jbe@0 560
jbe@0 561 CREATE FUNCTION empty_ebox()
jbe@0 562 RETURNS ebox
jbe@0 563 LANGUAGE C IMMUTABLE STRICT
jbe@9 564 AS '$libdir/latlon-v0003', 'pgl_create_empty_ebox';
jbe@0 565
jbe@0 566 CREATE FUNCTION ebox(float8, float8, float8, float8)
jbe@0 567 RETURNS ebox
jbe@0 568 LANGUAGE C IMMUTABLE STRICT
jbe@9 569 AS '$libdir/latlon-v0003', 'pgl_create_ebox';
jbe@0 570
jbe@0 571 CREATE FUNCTION ebox(epoint, epoint)
jbe@0 572 RETURNS ebox
jbe@0 573 LANGUAGE C IMMUTABLE STRICT
jbe@9 574 AS '$libdir/latlon-v0003', 'pgl_create_ebox_from_epoints';
jbe@0 575
jbe@0 576 CREATE FUNCTION ecircle(float8, float8, float8)
jbe@0 577 RETURNS ecircle
jbe@0 578 LANGUAGE C IMMUTABLE STRICT
jbe@9 579 AS '$libdir/latlon-v0003', 'pgl_create_ecircle';
jbe@0 580
jbe@0 581 CREATE FUNCTION ecircle(epoint, float8)
jbe@0 582 RETURNS ecircle
jbe@0 583 LANGUAGE C IMMUTABLE STRICT
jbe@9 584 AS '$libdir/latlon-v0003', 'pgl_create_ecircle_from_epoint';
jbe@0 585
jbe@0 586 CREATE FUNCTION ecluster_concat(ecluster[])
jbe@0 587 RETURNS ecluster
jbe@0 588 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 589 SELECT array_to_string($1, ' ')::ecluster
jbe@0 590 $$;
jbe@0 591
jbe@0 592 CREATE FUNCTION ecluster_concat(ecluster, ecluster)
jbe@0 593 RETURNS ecluster
jbe@0 594 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 595 SELECT ($1::text || ' ' || $2::text)::ecluster
jbe@0 596 $$;
jbe@0 597
jbe@0 598 CREATE FUNCTION ecluster_create_multipoint(epoint[])
jbe@0 599 RETURNS ecluster
jbe@0 600 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 601 SELECT
jbe@0 602 array_to_string(array_agg('point (' || unnest || ')'), ' ')::ecluster
jbe@0 603 FROM unnest($1)
jbe@0 604 $$;
jbe@0 605
jbe@0 606 CREATE FUNCTION ecluster_create_path(epoint[])
jbe@0 607 RETURNS ecluster
jbe@0 608 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 609 SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
jbe@0 610 ('path (' || array_to_string($1, ' ') || ')')::ecluster
jbe@0 611 END
jbe@0 612 FROM array_to_string($1, ' ') AS "str"
jbe@0 613 $$;
jbe@0 614
jbe@0 615 CREATE FUNCTION ecluster_create_outline(epoint[])
jbe@0 616 RETURNS ecluster
jbe@0 617 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 618 SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
jbe@0 619 ('outline (' || array_to_string($1, ' ') || ')')::ecluster
jbe@0 620 END
jbe@0 621 FROM array_to_string($1, ' ') AS "str"
jbe@0 622 $$;
jbe@0 623
jbe@0 624 CREATE FUNCTION ecluster_create_polygon(epoint[])
jbe@0 625 RETURNS ecluster
jbe@0 626 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 627 SELECT CASE WHEN "str" = '' THEN 'empty'::ecluster ELSE
jbe@0 628 ('polygon (' || array_to_string($1, ' ') || ')')::ecluster
jbe@0 629 END
jbe@0 630 FROM array_to_string($1, ' ') AS "str"
jbe@0 631 $$;
jbe@0 632
jbe@0 633
jbe@0 634 ----------------------
jbe@0 635 -- getter functions --
jbe@0 636 ----------------------
jbe@0 637
jbe@0 638 CREATE FUNCTION latitude(epoint)
jbe@0 639 RETURNS float8
jbe@0 640 LANGUAGE C IMMUTABLE STRICT
jbe@9 641 AS '$libdir/latlon-v0003', 'pgl_epoint_lat';
jbe@0 642
jbe@0 643 CREATE FUNCTION longitude(epoint)
jbe@0 644 RETURNS float8
jbe@0 645 LANGUAGE C IMMUTABLE STRICT
jbe@9 646 AS '$libdir/latlon-v0003', 'pgl_epoint_lon';
jbe@0 647
jbe@0 648 CREATE FUNCTION min_latitude(ebox)
jbe@0 649 RETURNS float8
jbe@0 650 LANGUAGE C IMMUTABLE STRICT
jbe@9 651 AS '$libdir/latlon-v0003', 'pgl_ebox_lat_min';
jbe@0 652
jbe@0 653 CREATE FUNCTION max_latitude(ebox)
jbe@0 654 RETURNS float8
jbe@0 655 LANGUAGE C IMMUTABLE STRICT
jbe@9 656 AS '$libdir/latlon-v0003', 'pgl_ebox_lat_max';
jbe@0 657
jbe@0 658 CREATE FUNCTION min_longitude(ebox)
jbe@0 659 RETURNS float8
jbe@0 660 LANGUAGE C IMMUTABLE STRICT
jbe@9 661 AS '$libdir/latlon-v0003', 'pgl_ebox_lon_min';
jbe@0 662
jbe@0 663 CREATE FUNCTION max_longitude(ebox)
jbe@0 664 RETURNS float8
jbe@0 665 LANGUAGE C IMMUTABLE STRICT
jbe@9 666 AS '$libdir/latlon-v0003', 'pgl_ebox_lon_max';
jbe@0 667
jbe@0 668 CREATE FUNCTION center(ecircle)
jbe@0 669 RETURNS epoint
jbe@0 670 LANGUAGE C IMMUTABLE STRICT
jbe@9 671 AS '$libdir/latlon-v0003', 'pgl_ecircle_center';
jbe@0 672
jbe@0 673 CREATE FUNCTION radius(ecircle)
jbe@0 674 RETURNS float8
jbe@0 675 LANGUAGE C IMMUTABLE STRICT
jbe@9 676 AS '$libdir/latlon-v0003', 'pgl_ecircle_radius';
jbe@0 677
jbe@0 678 CREATE FUNCTION ecluster_extract_points(ecluster)
jbe@0 679 RETURNS SETOF epoint
jbe@0 680 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 681 SELECT "match"[2]::epoint
jbe@0 682 FROM regexp_matches($1::text, e'(^| )point \\(([^)]+)\\)', 'g') AS "match"
jbe@0 683 $$;
jbe@0 684
jbe@0 685 CREATE FUNCTION ecluster_extract_paths(ecluster)
jbe@0 686 RETURNS SETOF epoint[]
jbe@0 687 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 688 SELECT (
jbe@0 689 SELECT array_agg("m2"[1]::epoint)
jbe@0 690 FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@0 691 )
jbe@0 692 FROM regexp_matches($1::text, e'(^| )path \\(([^)]+)\\)', 'g') AS "m1"
jbe@0 693 $$;
jbe@0 694
jbe@0 695 CREATE FUNCTION ecluster_extract_outlines(ecluster)
jbe@0 696 RETURNS SETOF epoint[]
jbe@0 697 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 698 SELECT (
jbe@0 699 SELECT array_agg("m2"[1]::epoint)
jbe@0 700 FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@0 701 )
jbe@0 702 FROM regexp_matches($1::text, e'(^| )outline \\(([^)]+)\\)', 'g') AS "m1"
jbe@0 703 $$;
jbe@0 704
jbe@0 705 CREATE FUNCTION ecluster_extract_polygons(ecluster)
jbe@0 706 RETURNS SETOF epoint[]
jbe@0 707 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 708 SELECT (
jbe@0 709 SELECT array_agg("m2"[1]::epoint)
jbe@0 710 FROM regexp_matches("m1"[2], e'[^ ]+ [^ ]+', 'g') AS "m2"
jbe@0 711 )
jbe@0 712 FROM regexp_matches($1::text, e'(^| )polygon \\(([^)]+)\\)', 'g') AS "m1"
jbe@0 713 $$;
jbe@0 714
jbe@0 715
jbe@0 716 ---------------
jbe@0 717 -- operators --
jbe@0 718 ---------------
jbe@0 719
jbe@0 720 CREATE FUNCTION epoint_ebox_overlap_proc(epoint, ebox)
jbe@0 721 RETURNS boolean
jbe@0 722 LANGUAGE C IMMUTABLE STRICT
jbe@9 723 AS '$libdir/latlon-v0003', 'pgl_epoint_ebox_overlap';
jbe@0 724
jbe@0 725 CREATE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle)
jbe@0 726 RETURNS boolean
jbe@0 727 LANGUAGE C IMMUTABLE STRICT
jbe@9 728 AS '$libdir/latlon-v0003', 'pgl_epoint_ecircle_overlap';
jbe@0 729
jbe@0 730 CREATE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster)
jbe@0 731 RETURNS boolean
jbe@0 732 LANGUAGE C IMMUTABLE STRICT
jbe@9 733 AS '$libdir/latlon-v0003', 'pgl_epoint_ecluster_overlap';
jbe@0 734
jbe@10 735 CREATE FUNCTION epoint_ecluster_may_overlap_proc(epoint, ecluster)
jbe@10 736 RETURNS boolean
jbe@10 737 LANGUAGE C IMMUTABLE STRICT
jbe@10 738 AS '$libdir/latlon-v0003', 'pgl_epoint_ecluster_may_overlap';
jbe@10 739
jbe@0 740 CREATE FUNCTION ebox_overlap_proc(ebox, ebox)
jbe@0 741 RETURNS boolean
jbe@0 742 LANGUAGE C IMMUTABLE STRICT
jbe@9 743 AS '$libdir/latlon-v0003', 'pgl_ebox_overlap';
jbe@0 744
jbe@10 745 CREATE FUNCTION ebox_ecircle_may_overlap_proc(ebox, ecircle)
jbe@10 746 RETURNS boolean
jbe@10 747 LANGUAGE C IMMUTABLE STRICT
jbe@10 748 AS '$libdir/latlon-v0003', 'pgl_ebox_ecircle_may_overlap';
jbe@10 749
jbe@10 750 CREATE FUNCTION ebox_ecluster_may_overlap_proc(ebox, ecluster)
jbe@10 751 RETURNS boolean
jbe@10 752 LANGUAGE C IMMUTABLE STRICT
jbe@10 753 AS '$libdir/latlon-v0003', 'pgl_ebox_ecluster_may_overlap';
jbe@10 754
jbe@0 755 CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
jbe@0 756 RETURNS boolean
jbe@0 757 LANGUAGE C IMMUTABLE STRICT
jbe@9 758 AS '$libdir/latlon-v0003', 'pgl_ecircle_overlap';
jbe@0 759
jbe@0 760 CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
jbe@0 761 RETURNS boolean
jbe@0 762 LANGUAGE C IMMUTABLE STRICT
jbe@9 763 AS '$libdir/latlon-v0003', 'pgl_ecircle_ecluster_overlap';
jbe@0 764
jbe@10 765 CREATE FUNCTION ecircle_ecluster_may_overlap_proc(ecircle, ecluster)
jbe@10 766 RETURNS boolean
jbe@10 767 LANGUAGE C IMMUTABLE STRICT
jbe@10 768 AS '$libdir/latlon-v0003', 'pgl_ecircle_ecluster_may_overlap';
jbe@10 769
jbe@10 770 CREATE FUNCTION ecluster_may_overlap_proc(ecluster, ecluster)
jbe@10 771 RETURNS boolean
jbe@10 772 LANGUAGE C IMMUTABLE STRICT
jbe@10 773 AS '$libdir/latlon-v0003', 'pgl_ecluster_may_overlap';
jbe@10 774
jbe@0 775 CREATE FUNCTION epoint_distance_proc(epoint, epoint)
jbe@0 776 RETURNS float8
jbe@0 777 LANGUAGE C IMMUTABLE STRICT
jbe@9 778 AS '$libdir/latlon-v0003', 'pgl_epoint_distance';
jbe@0 779
jbe@0 780 CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
jbe@0 781 RETURNS float8
jbe@0 782 LANGUAGE C IMMUTABLE STRICT
jbe@9 783 AS '$libdir/latlon-v0003', 'pgl_epoint_ecircle_distance';
jbe@0 784
jbe@0 785 CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
jbe@0 786 RETURNS float8
jbe@0 787 LANGUAGE C IMMUTABLE STRICT
jbe@9 788 AS '$libdir/latlon-v0003', 'pgl_epoint_ecluster_distance';
jbe@0 789
jbe@0 790 CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle)
jbe@0 791 RETURNS float8
jbe@0 792 LANGUAGE C IMMUTABLE STRICT
jbe@9 793 AS '$libdir/latlon-v0003', 'pgl_ecircle_distance';
jbe@0 794
jbe@0 795 CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
jbe@0 796 RETURNS float8
jbe@0 797 LANGUAGE C IMMUTABLE STRICT
jbe@9 798 AS '$libdir/latlon-v0003', 'pgl_ecircle_ecluster_distance';
jbe@0 799
jbe@0 800 CREATE OPERATOR && (
jbe@0 801 leftarg = epoint,
jbe@0 802 rightarg = ebox,
jbe@0 803 procedure = epoint_ebox_overlap_proc,
jbe@0 804 commutator = &&,
jbe@0 805 restrict = areasel,
jbe@0 806 join = areajoinsel
jbe@0 807 );
jbe@0 808
jbe@0 809 CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
jbe@0 810 RETURNS boolean
jbe@0 811 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 812
jbe@0 813 CREATE OPERATOR && (
jbe@0 814 leftarg = ebox,
jbe@0 815 rightarg = epoint,
jbe@0 816 procedure = epoint_ebox_overlap_commutator,
jbe@0 817 commutator = &&,
jbe@0 818 restrict = areasel,
jbe@0 819 join = areajoinsel
jbe@0 820 );
jbe@0 821
jbe@0 822 CREATE OPERATOR && (
jbe@0 823 leftarg = epoint,
jbe@0 824 rightarg = ecircle,
jbe@0 825 procedure = epoint_ecircle_overlap_proc,
jbe@0 826 commutator = &&,
jbe@0 827 restrict = areasel,
jbe@0 828 join = areajoinsel
jbe@0 829 );
jbe@0 830
jbe@0 831 CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
jbe@0 832 RETURNS boolean
jbe@0 833 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 834
jbe@0 835 CREATE OPERATOR && (
jbe@0 836 leftarg = ecircle,
jbe@0 837 rightarg = epoint,
jbe@0 838 procedure = epoint_ecircle_overlap_commutator,
jbe@0 839 commutator = &&,
jbe@0 840 restrict = areasel,
jbe@0 841 join = areajoinsel
jbe@0 842 );
jbe@0 843
jbe@0 844 CREATE OPERATOR && (
jbe@0 845 leftarg = epoint,
jbe@0 846 rightarg = ecluster,
jbe@0 847 procedure = epoint_ecluster_overlap_proc,
jbe@0 848 commutator = &&,
jbe@0 849 restrict = areasel,
jbe@0 850 join = areajoinsel
jbe@0 851 );
jbe@0 852
jbe@0 853 CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
jbe@0 854 RETURNS boolean
jbe@0 855 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 856
jbe@0 857 CREATE OPERATOR && (
jbe@0 858 leftarg = ecluster,
jbe@0 859 rightarg = epoint,
jbe@0 860 procedure = epoint_ecluster_overlap_commutator,
jbe@0 861 commutator = &&,
jbe@0 862 restrict = areasel,
jbe@0 863 join = areajoinsel
jbe@0 864 );
jbe@0 865
jbe@0 866 CREATE OPERATOR && (
jbe@0 867 leftarg = ebox,
jbe@0 868 rightarg = ebox,
jbe@0 869 procedure = ebox_overlap_proc,
jbe@0 870 commutator = &&,
jbe@0 871 restrict = areasel,
jbe@0 872 join = areajoinsel
jbe@0 873 );
jbe@0 874
jbe@0 875 CREATE OPERATOR && (
jbe@0 876 leftarg = ecircle,
jbe@0 877 rightarg = ecircle,
jbe@0 878 procedure = ecircle_overlap_proc,
jbe@0 879 commutator = &&,
jbe@0 880 restrict = areasel,
jbe@0 881 join = areajoinsel
jbe@0 882 );
jbe@0 883
jbe@0 884 CREATE OPERATOR && (
jbe@0 885 leftarg = ecircle,
jbe@0 886 rightarg = ecluster,
jbe@0 887 procedure = ecircle_ecluster_overlap_proc,
jbe@0 888 commutator = &&,
jbe@0 889 restrict = areasel,
jbe@0 890 join = areajoinsel
jbe@0 891 );
jbe@0 892
jbe@0 893 CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
jbe@0 894 RETURNS boolean
jbe@0 895 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 896
jbe@0 897 CREATE OPERATOR && (
jbe@0 898 leftarg = ecluster,
jbe@0 899 rightarg = ecircle,
jbe@0 900 procedure = ecircle_ecluster_overlap_commutator,
jbe@0 901 commutator = &&,
jbe@0 902 restrict = areasel,
jbe@0 903 join = areajoinsel
jbe@0 904 );
jbe@0 905
jbe@10 906 CREATE OPERATOR &&+ (
jbe@10 907 leftarg = epoint,
jbe@10 908 rightarg = ecluster,
jbe@10 909 procedure = epoint_ecluster_may_overlap_proc,
jbe@10 910 commutator = &&+,
jbe@10 911 restrict = areasel,
jbe@10 912 join = areajoinsel
jbe@10 913 );
jbe@10 914
jbe@10 915 CREATE FUNCTION epoint_ecluster_may_overlap_commutator(ecluster, epoint)
jbe@10 916 RETURNS boolean
jbe@10 917 LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
jbe@10 918
jbe@10 919 CREATE OPERATOR &&+ (
jbe@10 920 leftarg = ecluster,
jbe@10 921 rightarg = epoint,
jbe@10 922 procedure = epoint_ecluster_may_overlap_commutator,
jbe@10 923 commutator = &&+,
jbe@10 924 restrict = areasel,
jbe@10 925 join = areajoinsel
jbe@10 926 );
jbe@10 927
jbe@10 928 CREATE OPERATOR &&+ (
jbe@10 929 leftarg = ebox,
jbe@10 930 rightarg = ecircle,
jbe@10 931 procedure = ebox_ecircle_may_overlap_proc,
jbe@10 932 commutator = &&+,
jbe@10 933 restrict = areasel,
jbe@10 934 join = areajoinsel
jbe@10 935 );
jbe@10 936
jbe@10 937 CREATE FUNCTION ebox_ecircle_may_overlap_commutator(ecircle, ebox)
jbe@10 938 RETURNS boolean
jbe@10 939 LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
jbe@10 940
jbe@10 941 CREATE OPERATOR &&+ (
jbe@10 942 leftarg = ecircle,
jbe@10 943 rightarg = ebox,
jbe@10 944 procedure = ebox_ecircle_may_overlap_commutator,
jbe@10 945 commutator = &&+,
jbe@10 946 restrict = areasel,
jbe@10 947 join = areajoinsel
jbe@10 948 );
jbe@10 949
jbe@10 950 CREATE OPERATOR &&+ (
jbe@10 951 leftarg = ebox,
jbe@10 952 rightarg = ecluster,
jbe@10 953 procedure = ebox_ecluster_may_overlap_proc,
jbe@10 954 commutator = &&+,
jbe@10 955 restrict = areasel,
jbe@10 956 join = areajoinsel
jbe@10 957 );
jbe@10 958
jbe@10 959 CREATE FUNCTION ebox_ecluster_may_overlap_commutator(ecluster, ebox)
jbe@10 960 RETURNS boolean
jbe@10 961 LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
jbe@10 962
jbe@10 963 CREATE OPERATOR &&+ (
jbe@10 964 leftarg = ecluster,
jbe@10 965 rightarg = ebox,
jbe@10 966 procedure = ebox_ecluster_may_overlap_commutator,
jbe@10 967 commutator = &&+,
jbe@10 968 restrict = areasel,
jbe@10 969 join = areajoinsel
jbe@10 970 );
jbe@10 971
jbe@10 972 CREATE OPERATOR &&+ (
jbe@10 973 leftarg = ecircle,
jbe@10 974 rightarg = ecluster,
jbe@10 975 procedure = ecircle_ecluster_may_overlap_proc,
jbe@10 976 commutator = &&+,
jbe@10 977 restrict = areasel,
jbe@10 978 join = areajoinsel
jbe@10 979 );
jbe@10 980
jbe@10 981 CREATE FUNCTION ecircle_ecluster_may_overlap_commutator(ecluster, ecircle)
jbe@10 982 RETURNS boolean
jbe@10 983 LANGUAGE sql IMMUTABLE AS 'SELECT $2 &&+ $1';
jbe@10 984
jbe@10 985 CREATE OPERATOR &&+ (
jbe@10 986 leftarg = ecluster,
jbe@10 987 rightarg = ecircle,
jbe@10 988 procedure = ecircle_ecluster_may_overlap_commutator,
jbe@10 989 commutator = &&+,
jbe@10 990 restrict = areasel,
jbe@10 991 join = areajoinsel
jbe@10 992 );
jbe@10 993
jbe@10 994 CREATE OPERATOR &&+ (
jbe@10 995 leftarg = ecluster,
jbe@10 996 rightarg = ecluster,
jbe@10 997 procedure = ecluster_may_overlap_proc,
jbe@10 998 commutator = &&+,
jbe@10 999 restrict = areasel,
jbe@10 1000 join = areajoinsel
jbe@10 1001 );
jbe@10 1002
jbe@0 1003 CREATE OPERATOR <-> (
jbe@0 1004 leftarg = epoint,
jbe@0 1005 rightarg = epoint,
jbe@0 1006 procedure = epoint_distance_proc,
jbe@0 1007 commutator = <->
jbe@0 1008 );
jbe@0 1009
jbe@0 1010 CREATE OPERATOR <-> (
jbe@0 1011 leftarg = epoint,
jbe@0 1012 rightarg = ecircle,
jbe@0 1013 procedure = epoint_ecircle_distance_proc,
jbe@0 1014 commutator = <->
jbe@0 1015 );
jbe@0 1016
jbe@0 1017 CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
jbe@0 1018 RETURNS float8
jbe@0 1019 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 1020
jbe@0 1021 CREATE OPERATOR <-> (
jbe@0 1022 leftarg = ecircle,
jbe@0 1023 rightarg = epoint,
jbe@0 1024 procedure = epoint_ecircle_distance_commutator,
jbe@0 1025 commutator = <->
jbe@0 1026 );
jbe@0 1027
jbe@0 1028 CREATE OPERATOR <-> (
jbe@0 1029 leftarg = epoint,
jbe@0 1030 rightarg = ecluster,
jbe@0 1031 procedure = epoint_ecluster_distance_proc,
jbe@0 1032 commutator = <->
jbe@0 1033 );
jbe@0 1034
jbe@0 1035 CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
jbe@0 1036 RETURNS float8
jbe@0 1037 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 1038
jbe@0 1039 CREATE OPERATOR <-> (
jbe@0 1040 leftarg = ecluster,
jbe@0 1041 rightarg = epoint,
jbe@0 1042 procedure = epoint_ecluster_distance_commutator,
jbe@0 1043 commutator = <->
jbe@0 1044 );
jbe@0 1045
jbe@0 1046 CREATE OPERATOR <-> (
jbe@0 1047 leftarg = ecircle,
jbe@0 1048 rightarg = ecircle,
jbe@0 1049 procedure = ecircle_distance_proc,
jbe@0 1050 commutator = <->
jbe@0 1051 );
jbe@0 1052
jbe@0 1053 CREATE OPERATOR <-> (
jbe@0 1054 leftarg = ecircle,
jbe@0 1055 rightarg = ecluster,
jbe@0 1056 procedure = ecircle_ecluster_distance_proc,
jbe@0 1057 commutator = <->
jbe@0 1058 );
jbe@0 1059
jbe@0 1060 CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
jbe@0 1061 RETURNS float8
jbe@0 1062 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 1063
jbe@0 1064 CREATE OPERATOR <-> (
jbe@0 1065 leftarg = ecluster,
jbe@0 1066 rightarg = ecircle,
jbe@0 1067 procedure = ecircle_ecluster_distance_commutator,
jbe@0 1068 commutator = <->
jbe@0 1069 );
jbe@0 1070
jbe@0 1071
jbe@0 1072 ----------------
jbe@0 1073 -- GiST index --
jbe@0 1074 ----------------
jbe@0 1075
jbe@0 1076 CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
jbe@0 1077 RETURNS boolean
jbe@0 1078 LANGUAGE C STRICT
jbe@9 1079 AS '$libdir/latlon-v0003', 'pgl_gist_consistent';
jbe@0 1080
jbe@0 1081 CREATE FUNCTION pgl_gist_union(internal, internal)
jbe@0 1082 RETURNS internal
jbe@0 1083 LANGUAGE C STRICT
jbe@9 1084 AS '$libdir/latlon-v0003', 'pgl_gist_union';
jbe@0 1085
jbe@0 1086 CREATE FUNCTION pgl_gist_compress_epoint(internal)
jbe@0 1087 RETURNS internal
jbe@0 1088 LANGUAGE C STRICT
jbe@9 1089 AS '$libdir/latlon-v0003', 'pgl_gist_compress_epoint';
jbe@0 1090
jbe@0 1091 CREATE FUNCTION pgl_gist_compress_ecircle(internal)
jbe@0 1092 RETURNS internal
jbe@0 1093 LANGUAGE C STRICT
jbe@9 1094 AS '$libdir/latlon-v0003', 'pgl_gist_compress_ecircle';
jbe@0 1095
jbe@0 1096 CREATE FUNCTION pgl_gist_compress_ecluster(internal)
jbe@0 1097 RETURNS internal
jbe@0 1098 LANGUAGE C STRICT
jbe@9 1099 AS '$libdir/latlon-v0003', 'pgl_gist_compress_ecluster';
jbe@0 1100
jbe@0 1101 CREATE FUNCTION pgl_gist_decompress(internal)
jbe@0 1102 RETURNS internal
jbe@0 1103 LANGUAGE C STRICT
jbe@9 1104 AS '$libdir/latlon-v0003', 'pgl_gist_decompress';
jbe@0 1105
jbe@0 1106 CREATE FUNCTION pgl_gist_penalty(internal, internal, internal)
jbe@0 1107 RETURNS internal
jbe@0 1108 LANGUAGE C STRICT
jbe@9 1109 AS '$libdir/latlon-v0003', 'pgl_gist_penalty';
jbe@0 1110
jbe@0 1111 CREATE FUNCTION pgl_gist_picksplit(internal, internal)
jbe@0 1112 RETURNS internal
jbe@0 1113 LANGUAGE C STRICT
jbe@9 1114 AS '$libdir/latlon-v0003', 'pgl_gist_picksplit';
jbe@0 1115
jbe@0 1116 CREATE FUNCTION pgl_gist_same(internal, internal, internal)
jbe@0 1117 RETURNS internal
jbe@0 1118 LANGUAGE C STRICT
jbe@9 1119 AS '$libdir/latlon-v0003', 'pgl_gist_same';
jbe@0 1120
jbe@0 1121 CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
jbe@0 1122 RETURNS internal
jbe@0 1123 LANGUAGE C STRICT
jbe@9 1124 AS '$libdir/latlon-v0003', 'pgl_gist_distance';
jbe@0 1125
jbe@0 1126 CREATE OPERATOR CLASS epoint_ops
jbe@0 1127 DEFAULT FOR TYPE epoint USING gist AS
jbe@10 1128 OPERATOR 11 = ,
jbe@10 1129 OPERATOR 22 && (epoint, ebox),
jbe@10 1130 OPERATOR 23 && (epoint, ecircle),
jbe@10 1131 OPERATOR 24 && (epoint, ecluster),
jbe@10 1132 OPERATOR 124 &&+ (epoint, ecluster),
jbe@10 1133 OPERATOR 31 <-> (epoint, epoint) FOR ORDER BY float_ops,
jbe@10 1134 OPERATOR 33 <-> (epoint, ecircle) FOR ORDER BY float_ops,
jbe@10 1135 OPERATOR 34 <-> (epoint, ecluster) FOR ORDER BY float_ops,
jbe@0 1136 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1137 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1138 FUNCTION 3 pgl_gist_compress_epoint(internal),
jbe@0 1139 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1140 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1141 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1142 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1143 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1144 STORAGE ekey_point;
jbe@0 1145
jbe@0 1146 CREATE OPERATOR CLASS ecircle_ops
jbe@0 1147 DEFAULT FOR TYPE ecircle USING gist AS
jbe@10 1148 OPERATOR 13 = ,
jbe@10 1149 OPERATOR 21 && (ecircle, epoint),
jbe@10 1150 OPERATOR 122 &&+ (ecircle, ebox),
jbe@10 1151 OPERATOR 23 && (ecircle, ecircle),
jbe@10 1152 OPERATOR 24 && (ecircle, ecluster),
jbe@10 1153 OPERATOR 124 &&+ (ecircle, ecluster),
jbe@10 1154 OPERATOR 31 <-> (ecircle, epoint) FOR ORDER BY float_ops,
jbe@10 1155 OPERATOR 33 <-> (ecircle, ecircle) FOR ORDER BY float_ops,
jbe@10 1156 OPERATOR 34 <-> (ecircle, ecluster) FOR ORDER BY float_ops,
jbe@0 1157 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1158 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1159 FUNCTION 3 pgl_gist_compress_ecircle(internal),
jbe@0 1160 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1161 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1162 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1163 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1164 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1165 STORAGE ekey_area;
jbe@0 1166
jbe@0 1167 CREATE OPERATOR CLASS ecluster_ops
jbe@0 1168 DEFAULT FOR TYPE ecluster USING gist AS
jbe@10 1169 OPERATOR 21 && (ecluster, epoint),
jbe@10 1170 OPERATOR 121 &&+ (ecluster, epoint),
jbe@10 1171 OPERATOR 122 &&+ (ecluster, ebox),
jbe@10 1172 OPERATOR 23 && (ecluster, ecircle),
jbe@10 1173 OPERATOR 123 &&+ (ecluster, ecircle),
jbe@10 1174 OPERATOR 124 &&+ (ecluster, ecluster),
jbe@0 1175 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1176 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1177 FUNCTION 3 pgl_gist_compress_ecluster(internal),
jbe@0 1178 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1179 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1180 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1181 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1182 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1183 STORAGE ekey_area;
jbe@0 1184
jbe@0 1185
jbe@0 1186 ---------------------
jbe@0 1187 -- alias functions --
jbe@0 1188 ---------------------
jbe@0 1189
jbe@0 1190 CREATE FUNCTION distance(epoint, epoint)
jbe@0 1191 RETURNS float8
jbe@0 1192 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
jbe@0 1193
jbe@0 1194 CREATE FUNCTION distance(ecluster, epoint)
jbe@0 1195 RETURNS float8
jbe@0 1196 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
jbe@0 1197
jbe@0 1198 CREATE FUNCTION distance_within(epoint, epoint, float8)
jbe@0 1199 RETURNS boolean
jbe@0 1200 LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
jbe@0 1201
jbe@0 1202 CREATE FUNCTION distance_within(ecluster, epoint, float8)
jbe@0 1203 RETURNS boolean
jbe@0 1204 LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
jbe@0 1205
jbe@0 1206
jbe@0 1207 --------------------------------
jbe@0 1208 -- other data storage formats --
jbe@0 1209 --------------------------------
jbe@0 1210
jbe@0 1211 CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint_lonlat')
jbe@0 1212 RETURNS epoint
jbe@0 1213 LANGUAGE plpgsql IMMUTABLE STRICT AS $$
jbe@0 1214 DECLARE
jbe@0 1215 "result" epoint;
jbe@0 1216 BEGIN
jbe@0 1217 IF $3 = 'epoint_lonlat' THEN
jbe@0 1218 -- avoid dynamic command execution for better performance
jbe@0 1219 RETURN epoint($2, $1);
jbe@0 1220 END IF;
jbe@0 1221 IF $3 = 'epoint' OR $3 = 'epoint_latlon' THEN
jbe@0 1222 -- avoid dynamic command execution for better performance
jbe@0 1223 RETURN epoint($1, $2);
jbe@0 1224 END IF;
jbe@0 1225 EXECUTE 'SELECT ' || $3 || '($1, $2)' INTO STRICT "result" USING $1, $2;
jbe@0 1226 RETURN "result";
jbe@0 1227 END;
jbe@0 1228 $$;
jbe@0 1229
jbe@0 1230 CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
jbe@0 1231 RETURNS epoint
jbe@0 1232 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 1233 SELECT CASE
jbe@0 1234 WHEN $1->>'type' = 'Point' THEN
jbe@0 1235 coords_to_epoint(
jbe@0 1236 ($1->'coordinates'->>1)::float8,
jbe@0 1237 ($1->'coordinates'->>0)::float8,
jbe@0 1238 $2
jbe@0 1239 )
jbe@0 1240 WHEN $1->>'type' = 'Feature' THEN
jbe@0 1241 GeoJSON_to_epoint($1->'geometry', $2)
jbe@0 1242 ELSE
jbe@0 1243 NULL
jbe@0 1244 END
jbe@0 1245 $$;
jbe@0 1246
jbe@0 1247 CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
jbe@0 1248 RETURNS ecluster
jbe@0 1249 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 1250 SELECT CASE $1->>'type'
jbe@0 1251 WHEN 'Point' THEN
jbe@0 1252 coords_to_epoint(
jbe@0 1253 ($1->'coordinates'->>1)::float8,
jbe@0 1254 ($1->'coordinates'->>0)::float8,
jbe@0 1255 $2
jbe@0 1256 )::ecluster
jbe@0 1257 WHEN 'MultiPoint' THEN
jbe@0 1258 ( SELECT ecluster_create_multipoint(array_agg(
jbe@0 1259 coords_to_epoint(
jbe@0 1260 ("coord"->>1)::float8,
jbe@0 1261 ("coord"->>0)::float8,
jbe@0 1262 $2
jbe@0 1263 )
jbe@0 1264 ))
jbe@0 1265 FROM jsonb_array_elements($1->'coordinates') AS "coord"
jbe@0 1266 )
jbe@0 1267 WHEN 'LineString' THEN
jbe@0 1268 ( SELECT ecluster_create_path(array_agg(
jbe@0 1269 coords_to_epoint(
jbe@0 1270 ("coord"->>1)::float8,
jbe@0 1271 ("coord"->>0)::float8,
jbe@0 1272 $2
jbe@0 1273 )
jbe@0 1274 ))
jbe@0 1275 FROM jsonb_array_elements($1->'coordinates') AS "coord"
jbe@0 1276 )
jbe@0 1277 WHEN 'MultiLineString' THEN
jbe@0 1278 ( SELECT ecluster_concat(array_agg(
jbe@0 1279 ( SELECT ecluster_create_path(array_agg(
jbe@0 1280 coords_to_epoint(
jbe@0 1281 ("coord"->>1)::float8,
jbe@0 1282 ("coord"->>0)::float8,
jbe@0 1283 $2
jbe@0 1284 )
jbe@0 1285 ))
jbe@0 1286 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1287 )
jbe@0 1288 ))
jbe@0 1289 FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
jbe@0 1290 )
jbe@0 1291 WHEN 'Polygon' THEN
jbe@0 1292 ( SELECT ecluster_concat(array_agg(
jbe@0 1293 ( SELECT ecluster_create_polygon(array_agg(
jbe@0 1294 coords_to_epoint(
jbe@0 1295 ("coord"->>1)::float8,
jbe@0 1296 ("coord"->>0)::float8,
jbe@0 1297 $2
jbe@0 1298 )
jbe@0 1299 ))
jbe@0 1300 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1301 )
jbe@0 1302 ))
jbe@0 1303 FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
jbe@0 1304 )
jbe@0 1305 WHEN 'MultiPolygon' THEN
jbe@0 1306 ( SELECT ecluster_concat(array_agg(
jbe@0 1307 ( SELECT ecluster_concat(array_agg(
jbe@0 1308 ( SELECT ecluster_create_polygon(array_agg(
jbe@0 1309 coords_to_epoint(
jbe@0 1310 ("coord"->>1)::float8,
jbe@0 1311 ("coord"->>0)::float8,
jbe@0 1312 $2
jbe@0 1313 )
jbe@0 1314 ))
jbe@0 1315 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1316 )
jbe@0 1317 ))
jbe@0 1318 FROM jsonb_array_elements("coord_array_array") AS "coord_array"
jbe@0 1319 )
jbe@0 1320 ))
jbe@0 1321 FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array"
jbe@0 1322 )
jbe@0 1323 WHEN 'Feature' THEN
jbe@0 1324 GeoJSON_to_ecluster($1->'geometry', $2)
jbe@0 1325 WHEN 'FeatureCollection' THEN
jbe@0 1326 ( SELECT ecluster_concat(array_agg(
jbe@0 1327 GeoJSON_to_ecluster("feature", $2)
jbe@0 1328 ))
jbe@0 1329 FROM jsonb_array_elements($1->'features') AS "feature"
jbe@0 1330 )
jbe@0 1331 ELSE
jbe@0 1332 NULL
jbe@0 1333 END
jbe@0 1334 $$;
jbe@0 1335

Impressum / About Us