pgLatLon

annotate latlon--0.1.sql @ 0:3b70e93cc07d

Version 0.1 (initial commit)
author jbe
date Sun Aug 21 17:43:48 2016 +0200 (2016-08-21)
parents
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@0 19 AS '$libdir/latlon-v0001', '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@0 24 AS '$libdir/latlon-v0001', '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@0 29 AS '$libdir/latlon-v0001', '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@0 34 AS '$libdir/latlon-v0001', '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@0 44 AS '$libdir/latlon-v0001', '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@0 49 AS '$libdir/latlon-v0001', '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@0 54 AS '$libdir/latlon-v0001', '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@0 59 AS '$libdir/latlon-v0001', '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@0 69 AS '$libdir/latlon-v0001', '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@0 74 AS '$libdir/latlon-v0001', '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@0 79 AS '$libdir/latlon-v0001', '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@0 84 AS '$libdir/latlon-v0001', '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@0 94 AS '$libdir/latlon-v0001', '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@0 99 AS '$libdir/latlon-v0001', '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@0 104 AS '$libdir/latlon-v0001', '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@0 109 AS '$libdir/latlon-v0001', '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@0 114 AS '$libdir/latlon-v0001', '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@0 119 AS '$libdir/latlon-v0001', '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@0 184 AS '$libdir/latlon-v0001', '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@0 189 AS '$libdir/latlon-v0001', '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@0 194 AS '$libdir/latlon-v0001', '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@0 199 AS '$libdir/latlon-v0001', '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@0 204 AS '$libdir/latlon-v0001', '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@0 209 AS '$libdir/latlon-v0001', '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@0 275 AS '$libdir/latlon-v0001', '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@0 293 AS '$libdir/latlon-v0001', '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@0 298 AS '$libdir/latlon-v0001', '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@0 303 AS '$libdir/latlon-v0001', '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@0 308 AS '$libdir/latlon-v0001', '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@0 313 AS '$libdir/latlon-v0001', '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@0 318 AS '$libdir/latlon-v0001', '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@0 384 AS '$libdir/latlon-v0001', '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@0 402 AS '$libdir/latlon-v0001', '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@0 407 AS '$libdir/latlon-v0001', '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@0 412 AS '$libdir/latlon-v0001', '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@0 417 AS '$libdir/latlon-v0001', '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@0 422 AS '$libdir/latlon-v0001', '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@0 427 AS '$libdir/latlon-v0001', '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@0 493 AS '$libdir/latlon-v0001', '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@0 514 AS '$libdir/latlon-v0001', '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@0 521 AS '$libdir/latlon-v0001', '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@0 528 AS '$libdir/latlon-v0001', '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@0 535 AS '$libdir/latlon-v0001', '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@0 547 AS '$libdir/latlon-v0001', '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@0 564 AS '$libdir/latlon-v0001', '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@0 569 AS '$libdir/latlon-v0001', '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@0 574 AS '$libdir/latlon-v0001', '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@0 579 AS '$libdir/latlon-v0001', '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@0 584 AS '$libdir/latlon-v0001', '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@0 641 AS '$libdir/latlon-v0001', '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@0 646 AS '$libdir/latlon-v0001', '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@0 651 AS '$libdir/latlon-v0001', '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@0 656 AS '$libdir/latlon-v0001', '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@0 661 AS '$libdir/latlon-v0001', '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@0 666 AS '$libdir/latlon-v0001', '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@0 671 AS '$libdir/latlon-v0001', '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@0 676 AS '$libdir/latlon-v0001', '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@0 723 AS '$libdir/latlon-v0001', '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@0 728 AS '$libdir/latlon-v0001', '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@0 733 AS '$libdir/latlon-v0001', 'pgl_epoint_ecluster_overlap';
jbe@0 734
jbe@0 735 CREATE FUNCTION ebox_overlap_proc(ebox, ebox)
jbe@0 736 RETURNS boolean
jbe@0 737 LANGUAGE C IMMUTABLE STRICT
jbe@0 738 AS '$libdir/latlon-v0001', 'pgl_ebox_overlap';
jbe@0 739
jbe@0 740 CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
jbe@0 741 RETURNS boolean
jbe@0 742 LANGUAGE C IMMUTABLE STRICT
jbe@0 743 AS '$libdir/latlon-v0001', 'pgl_ecircle_overlap';
jbe@0 744
jbe@0 745 CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
jbe@0 746 RETURNS boolean
jbe@0 747 LANGUAGE C IMMUTABLE STRICT
jbe@0 748 AS '$libdir/latlon-v0001', 'pgl_ecircle_ecluster_overlap';
jbe@0 749
jbe@0 750 CREATE FUNCTION epoint_distance_proc(epoint, epoint)
jbe@0 751 RETURNS float8
jbe@0 752 LANGUAGE C IMMUTABLE STRICT
jbe@0 753 AS '$libdir/latlon-v0001', 'pgl_epoint_distance';
jbe@0 754
jbe@0 755 CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
jbe@0 756 RETURNS float8
jbe@0 757 LANGUAGE C IMMUTABLE STRICT
jbe@0 758 AS '$libdir/latlon-v0001', 'pgl_epoint_ecircle_distance';
jbe@0 759
jbe@0 760 CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
jbe@0 761 RETURNS float8
jbe@0 762 LANGUAGE C IMMUTABLE STRICT
jbe@0 763 AS '$libdir/latlon-v0001', 'pgl_epoint_ecluster_distance';
jbe@0 764
jbe@0 765 CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle)
jbe@0 766 RETURNS float8
jbe@0 767 LANGUAGE C IMMUTABLE STRICT
jbe@0 768 AS '$libdir/latlon-v0001', 'pgl_ecircle_distance';
jbe@0 769
jbe@0 770 CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
jbe@0 771 RETURNS float8
jbe@0 772 LANGUAGE C IMMUTABLE STRICT
jbe@0 773 AS '$libdir/latlon-v0001', 'pgl_ecircle_ecluster_distance';
jbe@0 774
jbe@0 775 CREATE OPERATOR && (
jbe@0 776 leftarg = epoint,
jbe@0 777 rightarg = ebox,
jbe@0 778 procedure = epoint_ebox_overlap_proc,
jbe@0 779 commutator = &&,
jbe@0 780 restrict = areasel,
jbe@0 781 join = areajoinsel
jbe@0 782 );
jbe@0 783
jbe@0 784 CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
jbe@0 785 RETURNS boolean
jbe@0 786 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 787
jbe@0 788 CREATE OPERATOR && (
jbe@0 789 leftarg = ebox,
jbe@0 790 rightarg = epoint,
jbe@0 791 procedure = epoint_ebox_overlap_commutator,
jbe@0 792 commutator = &&,
jbe@0 793 restrict = areasel,
jbe@0 794 join = areajoinsel
jbe@0 795 );
jbe@0 796
jbe@0 797 CREATE OPERATOR && (
jbe@0 798 leftarg = epoint,
jbe@0 799 rightarg = ecircle,
jbe@0 800 procedure = epoint_ecircle_overlap_proc,
jbe@0 801 commutator = &&,
jbe@0 802 restrict = areasel,
jbe@0 803 join = areajoinsel
jbe@0 804 );
jbe@0 805
jbe@0 806 CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
jbe@0 807 RETURNS boolean
jbe@0 808 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 809
jbe@0 810 CREATE OPERATOR && (
jbe@0 811 leftarg = ecircle,
jbe@0 812 rightarg = epoint,
jbe@0 813 procedure = epoint_ecircle_overlap_commutator,
jbe@0 814 commutator = &&,
jbe@0 815 restrict = areasel,
jbe@0 816 join = areajoinsel
jbe@0 817 );
jbe@0 818
jbe@0 819 CREATE OPERATOR && (
jbe@0 820 leftarg = epoint,
jbe@0 821 rightarg = ecluster,
jbe@0 822 procedure = epoint_ecluster_overlap_proc,
jbe@0 823 commutator = &&,
jbe@0 824 restrict = areasel,
jbe@0 825 join = areajoinsel
jbe@0 826 );
jbe@0 827
jbe@0 828 CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
jbe@0 829 RETURNS boolean
jbe@0 830 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 831
jbe@0 832 CREATE OPERATOR && (
jbe@0 833 leftarg = ecluster,
jbe@0 834 rightarg = epoint,
jbe@0 835 procedure = epoint_ecluster_overlap_commutator,
jbe@0 836 commutator = &&,
jbe@0 837 restrict = areasel,
jbe@0 838 join = areajoinsel
jbe@0 839 );
jbe@0 840
jbe@0 841 CREATE OPERATOR && (
jbe@0 842 leftarg = ebox,
jbe@0 843 rightarg = ebox,
jbe@0 844 procedure = ebox_overlap_proc,
jbe@0 845 commutator = &&,
jbe@0 846 restrict = areasel,
jbe@0 847 join = areajoinsel
jbe@0 848 );
jbe@0 849
jbe@0 850 CREATE OPERATOR && (
jbe@0 851 leftarg = ecircle,
jbe@0 852 rightarg = ecircle,
jbe@0 853 procedure = ecircle_overlap_proc,
jbe@0 854 commutator = &&,
jbe@0 855 restrict = areasel,
jbe@0 856 join = areajoinsel
jbe@0 857 );
jbe@0 858
jbe@0 859 CREATE OPERATOR && (
jbe@0 860 leftarg = ecircle,
jbe@0 861 rightarg = ecluster,
jbe@0 862 procedure = ecircle_ecluster_overlap_proc,
jbe@0 863 commutator = &&,
jbe@0 864 restrict = areasel,
jbe@0 865 join = areajoinsel
jbe@0 866 );
jbe@0 867
jbe@0 868 CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
jbe@0 869 RETURNS boolean
jbe@0 870 LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
jbe@0 871
jbe@0 872 CREATE OPERATOR && (
jbe@0 873 leftarg = ecluster,
jbe@0 874 rightarg = ecircle,
jbe@0 875 procedure = ecircle_ecluster_overlap_commutator,
jbe@0 876 commutator = &&,
jbe@0 877 restrict = areasel,
jbe@0 878 join = areajoinsel
jbe@0 879 );
jbe@0 880
jbe@0 881 CREATE OPERATOR <-> (
jbe@0 882 leftarg = epoint,
jbe@0 883 rightarg = epoint,
jbe@0 884 procedure = epoint_distance_proc,
jbe@0 885 commutator = <->
jbe@0 886 );
jbe@0 887
jbe@0 888 CREATE OPERATOR <-> (
jbe@0 889 leftarg = epoint,
jbe@0 890 rightarg = ecircle,
jbe@0 891 procedure = epoint_ecircle_distance_proc,
jbe@0 892 commutator = <->
jbe@0 893 );
jbe@0 894
jbe@0 895 CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
jbe@0 896 RETURNS float8
jbe@0 897 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 898
jbe@0 899 CREATE OPERATOR <-> (
jbe@0 900 leftarg = ecircle,
jbe@0 901 rightarg = epoint,
jbe@0 902 procedure = epoint_ecircle_distance_commutator,
jbe@0 903 commutator = <->
jbe@0 904 );
jbe@0 905
jbe@0 906 CREATE OPERATOR <-> (
jbe@0 907 leftarg = epoint,
jbe@0 908 rightarg = ecluster,
jbe@0 909 procedure = epoint_ecluster_distance_proc,
jbe@0 910 commutator = <->
jbe@0 911 );
jbe@0 912
jbe@0 913 CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
jbe@0 914 RETURNS float8
jbe@0 915 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 916
jbe@0 917 CREATE OPERATOR <-> (
jbe@0 918 leftarg = ecluster,
jbe@0 919 rightarg = epoint,
jbe@0 920 procedure = epoint_ecluster_distance_commutator,
jbe@0 921 commutator = <->
jbe@0 922 );
jbe@0 923
jbe@0 924 CREATE OPERATOR <-> (
jbe@0 925 leftarg = ecircle,
jbe@0 926 rightarg = ecircle,
jbe@0 927 procedure = ecircle_distance_proc,
jbe@0 928 commutator = <->
jbe@0 929 );
jbe@0 930
jbe@0 931 CREATE OPERATOR <-> (
jbe@0 932 leftarg = ecircle,
jbe@0 933 rightarg = ecluster,
jbe@0 934 procedure = ecircle_ecluster_distance_proc,
jbe@0 935 commutator = <->
jbe@0 936 );
jbe@0 937
jbe@0 938 CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
jbe@0 939 RETURNS float8
jbe@0 940 LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
jbe@0 941
jbe@0 942 CREATE OPERATOR <-> (
jbe@0 943 leftarg = ecluster,
jbe@0 944 rightarg = ecircle,
jbe@0 945 procedure = ecircle_ecluster_distance_commutator,
jbe@0 946 commutator = <->
jbe@0 947 );
jbe@0 948
jbe@0 949
jbe@0 950 ----------------
jbe@0 951 -- GiST index --
jbe@0 952 ----------------
jbe@0 953
jbe@0 954 CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
jbe@0 955 RETURNS boolean
jbe@0 956 LANGUAGE C STRICT
jbe@0 957 AS '$libdir/latlon-v0001', 'pgl_gist_consistent';
jbe@0 958
jbe@0 959 CREATE FUNCTION pgl_gist_union(internal, internal)
jbe@0 960 RETURNS internal
jbe@0 961 LANGUAGE C STRICT
jbe@0 962 AS '$libdir/latlon-v0001', 'pgl_gist_union';
jbe@0 963
jbe@0 964 CREATE FUNCTION pgl_gist_compress_epoint(internal)
jbe@0 965 RETURNS internal
jbe@0 966 LANGUAGE C STRICT
jbe@0 967 AS '$libdir/latlon-v0001', 'pgl_gist_compress_epoint';
jbe@0 968
jbe@0 969 CREATE FUNCTION pgl_gist_compress_ecircle(internal)
jbe@0 970 RETURNS internal
jbe@0 971 LANGUAGE C STRICT
jbe@0 972 AS '$libdir/latlon-v0001', 'pgl_gist_compress_ecircle';
jbe@0 973
jbe@0 974 CREATE FUNCTION pgl_gist_compress_ecluster(internal)
jbe@0 975 RETURNS internal
jbe@0 976 LANGUAGE C STRICT
jbe@0 977 AS '$libdir/latlon-v0001', 'pgl_gist_compress_ecluster';
jbe@0 978
jbe@0 979 CREATE FUNCTION pgl_gist_decompress(internal)
jbe@0 980 RETURNS internal
jbe@0 981 LANGUAGE C STRICT
jbe@0 982 AS '$libdir/latlon-v0001', 'pgl_gist_decompress';
jbe@0 983
jbe@0 984 CREATE FUNCTION pgl_gist_penalty(internal, internal, internal)
jbe@0 985 RETURNS internal
jbe@0 986 LANGUAGE C STRICT
jbe@0 987 AS '$libdir/latlon-v0001', 'pgl_gist_penalty';
jbe@0 988
jbe@0 989 CREATE FUNCTION pgl_gist_picksplit(internal, internal)
jbe@0 990 RETURNS internal
jbe@0 991 LANGUAGE C STRICT
jbe@0 992 AS '$libdir/latlon-v0001', 'pgl_gist_picksplit';
jbe@0 993
jbe@0 994 CREATE FUNCTION pgl_gist_same(internal, internal, internal)
jbe@0 995 RETURNS internal
jbe@0 996 LANGUAGE C STRICT
jbe@0 997 AS '$libdir/latlon-v0001', 'pgl_gist_same';
jbe@0 998
jbe@0 999 CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
jbe@0 1000 RETURNS internal
jbe@0 1001 LANGUAGE C STRICT
jbe@0 1002 AS '$libdir/latlon-v0001', 'pgl_gist_distance';
jbe@0 1003
jbe@0 1004 CREATE OPERATOR CLASS epoint_ops
jbe@0 1005 DEFAULT FOR TYPE epoint USING gist AS
jbe@0 1006 OPERATOR 11 = ,
jbe@0 1007 OPERATOR 22 && (epoint, ebox),
jbe@0 1008 OPERATOR 23 && (epoint, ecircle),
jbe@0 1009 OPERATOR 24 && (epoint, ecluster),
jbe@0 1010 OPERATOR 31 <-> (epoint, epoint) FOR ORDER BY float_ops,
jbe@0 1011 OPERATOR 33 <-> (epoint, ecircle) FOR ORDER BY float_ops,
jbe@0 1012 OPERATOR 34 <-> (epoint, ecluster) FOR ORDER BY float_ops,
jbe@0 1013 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1014 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1015 FUNCTION 3 pgl_gist_compress_epoint(internal),
jbe@0 1016 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1017 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1018 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1019 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1020 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1021 STORAGE ekey_point;
jbe@0 1022
jbe@0 1023 CREATE OPERATOR CLASS ecircle_ops
jbe@0 1024 DEFAULT FOR TYPE ecircle USING gist AS
jbe@0 1025 OPERATOR 13 = ,
jbe@0 1026 OPERATOR 21 && (ecircle, epoint),
jbe@0 1027 OPERATOR 23 && (ecircle, ecircle),
jbe@0 1028 OPERATOR 24 && (ecircle, ecluster),
jbe@0 1029 OPERATOR 31 <-> (ecircle, epoint) FOR ORDER BY float_ops,
jbe@0 1030 OPERATOR 33 <-> (ecircle, ecircle) FOR ORDER BY float_ops,
jbe@0 1031 OPERATOR 34 <-> (ecircle, ecluster) FOR ORDER BY float_ops,
jbe@0 1032 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1033 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1034 FUNCTION 3 pgl_gist_compress_ecircle(internal),
jbe@0 1035 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1036 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1037 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1038 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1039 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1040 STORAGE ekey_area;
jbe@0 1041
jbe@0 1042 CREATE OPERATOR CLASS ecluster_ops
jbe@0 1043 DEFAULT FOR TYPE ecluster USING gist AS
jbe@0 1044 OPERATOR 21 && (ecluster, epoint),
jbe@0 1045 FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
jbe@0 1046 FUNCTION 2 pgl_gist_union(internal, internal),
jbe@0 1047 FUNCTION 3 pgl_gist_compress_ecluster(internal),
jbe@0 1048 FUNCTION 4 pgl_gist_decompress(internal),
jbe@0 1049 FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
jbe@0 1050 FUNCTION 6 pgl_gist_picksplit(internal, internal),
jbe@0 1051 FUNCTION 7 pgl_gist_same(internal, internal, internal),
jbe@0 1052 FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
jbe@0 1053 STORAGE ekey_area;
jbe@0 1054
jbe@0 1055
jbe@0 1056 ---------------------
jbe@0 1057 -- alias functions --
jbe@0 1058 ---------------------
jbe@0 1059
jbe@0 1060 CREATE FUNCTION distance(epoint, epoint)
jbe@0 1061 RETURNS float8
jbe@0 1062 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
jbe@0 1063
jbe@0 1064 CREATE FUNCTION distance(ecluster, epoint)
jbe@0 1065 RETURNS float8
jbe@0 1066 LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
jbe@0 1067
jbe@0 1068 CREATE FUNCTION distance_within(epoint, epoint, float8)
jbe@0 1069 RETURNS boolean
jbe@0 1070 LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
jbe@0 1071
jbe@0 1072 CREATE FUNCTION distance_within(ecluster, epoint, float8)
jbe@0 1073 RETURNS boolean
jbe@0 1074 LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
jbe@0 1075
jbe@0 1076
jbe@0 1077 --------------------------------
jbe@0 1078 -- other data storage formats --
jbe@0 1079 --------------------------------
jbe@0 1080
jbe@0 1081 CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint_lonlat')
jbe@0 1082 RETURNS epoint
jbe@0 1083 LANGUAGE plpgsql IMMUTABLE STRICT AS $$
jbe@0 1084 DECLARE
jbe@0 1085 "result" epoint;
jbe@0 1086 BEGIN
jbe@0 1087 IF $3 = 'epoint_lonlat' THEN
jbe@0 1088 -- avoid dynamic command execution for better performance
jbe@0 1089 RETURN epoint($2, $1);
jbe@0 1090 END IF;
jbe@0 1091 IF $3 = 'epoint' OR $3 = 'epoint_latlon' THEN
jbe@0 1092 -- avoid dynamic command execution for better performance
jbe@0 1093 RETURN epoint($1, $2);
jbe@0 1094 END IF;
jbe@0 1095 EXECUTE 'SELECT ' || $3 || '($1, $2)' INTO STRICT "result" USING $1, $2;
jbe@0 1096 RETURN "result";
jbe@0 1097 END;
jbe@0 1098 $$;
jbe@0 1099
jbe@0 1100 CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
jbe@0 1101 RETURNS epoint
jbe@0 1102 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 1103 SELECT CASE
jbe@0 1104 WHEN $1->>'type' = 'Point' THEN
jbe@0 1105 coords_to_epoint(
jbe@0 1106 ($1->'coordinates'->>1)::float8,
jbe@0 1107 ($1->'coordinates'->>0)::float8,
jbe@0 1108 $2
jbe@0 1109 )
jbe@0 1110 WHEN $1->>'type' = 'Feature' THEN
jbe@0 1111 GeoJSON_to_epoint($1->'geometry', $2)
jbe@0 1112 ELSE
jbe@0 1113 NULL
jbe@0 1114 END
jbe@0 1115 $$;
jbe@0 1116
jbe@0 1117 CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
jbe@0 1118 RETURNS ecluster
jbe@0 1119 LANGUAGE sql IMMUTABLE STRICT AS $$
jbe@0 1120 SELECT CASE $1->>'type'
jbe@0 1121 WHEN 'Point' THEN
jbe@0 1122 coords_to_epoint(
jbe@0 1123 ($1->'coordinates'->>1)::float8,
jbe@0 1124 ($1->'coordinates'->>0)::float8,
jbe@0 1125 $2
jbe@0 1126 )::ecluster
jbe@0 1127 WHEN 'MultiPoint' THEN
jbe@0 1128 ( SELECT ecluster_create_multipoint(array_agg(
jbe@0 1129 coords_to_epoint(
jbe@0 1130 ("coord"->>1)::float8,
jbe@0 1131 ("coord"->>0)::float8,
jbe@0 1132 $2
jbe@0 1133 )
jbe@0 1134 ))
jbe@0 1135 FROM jsonb_array_elements($1->'coordinates') AS "coord"
jbe@0 1136 )
jbe@0 1137 WHEN 'LineString' THEN
jbe@0 1138 ( SELECT ecluster_create_path(array_agg(
jbe@0 1139 coords_to_epoint(
jbe@0 1140 ("coord"->>1)::float8,
jbe@0 1141 ("coord"->>0)::float8,
jbe@0 1142 $2
jbe@0 1143 )
jbe@0 1144 ))
jbe@0 1145 FROM jsonb_array_elements($1->'coordinates') AS "coord"
jbe@0 1146 )
jbe@0 1147 WHEN 'MultiLineString' THEN
jbe@0 1148 ( SELECT ecluster_concat(array_agg(
jbe@0 1149 ( SELECT ecluster_create_path(array_agg(
jbe@0 1150 coords_to_epoint(
jbe@0 1151 ("coord"->>1)::float8,
jbe@0 1152 ("coord"->>0)::float8,
jbe@0 1153 $2
jbe@0 1154 )
jbe@0 1155 ))
jbe@0 1156 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1157 )
jbe@0 1158 ))
jbe@0 1159 FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
jbe@0 1160 )
jbe@0 1161 WHEN 'Polygon' THEN
jbe@0 1162 ( SELECT ecluster_concat(array_agg(
jbe@0 1163 ( SELECT ecluster_create_polygon(array_agg(
jbe@0 1164 coords_to_epoint(
jbe@0 1165 ("coord"->>1)::float8,
jbe@0 1166 ("coord"->>0)::float8,
jbe@0 1167 $2
jbe@0 1168 )
jbe@0 1169 ))
jbe@0 1170 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1171 )
jbe@0 1172 ))
jbe@0 1173 FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
jbe@0 1174 )
jbe@0 1175 WHEN 'MultiPolygon' THEN
jbe@0 1176 ( SELECT ecluster_concat(array_agg(
jbe@0 1177 ( SELECT ecluster_concat(array_agg(
jbe@0 1178 ( SELECT ecluster_create_polygon(array_agg(
jbe@0 1179 coords_to_epoint(
jbe@0 1180 ("coord"->>1)::float8,
jbe@0 1181 ("coord"->>0)::float8,
jbe@0 1182 $2
jbe@0 1183 )
jbe@0 1184 ))
jbe@0 1185 FROM jsonb_array_elements("coord_array") AS "coord"
jbe@0 1186 )
jbe@0 1187 ))
jbe@0 1188 FROM jsonb_array_elements("coord_array_array") AS "coord_array"
jbe@0 1189 )
jbe@0 1190 ))
jbe@0 1191 FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array"
jbe@0 1192 )
jbe@0 1193 WHEN 'Feature' THEN
jbe@0 1194 GeoJSON_to_ecluster($1->'geometry', $2)
jbe@0 1195 WHEN 'FeatureCollection' THEN
jbe@0 1196 ( SELECT ecluster_concat(array_agg(
jbe@0 1197 GeoJSON_to_ecluster("feature", $2)
jbe@0 1198 ))
jbe@0 1199 FROM jsonb_array_elements($1->'features') AS "feature"
jbe@0 1200 )
jbe@0 1201 ELSE
jbe@0 1202 NULL
jbe@0 1203 END
jbe@0 1204 $$;
jbe@0 1205

Impressum / About Us