pgLatLon

changeset 4:8f79d4a1cdc1

New version 0.2 and update script from version 0.1
author jbe
date Mon Aug 22 21:51:33 2016 +0200 (2016-08-22)
parents bccc1e155ad8
children 13d26f330e20
files GNUmakefile latlon--0.1--0.2.sql latlon--0.2.sql latlon.control
line diff
     1.1 --- a/GNUmakefile	Mon Aug 22 21:35:25 2016 +0200
     1.2 +++ b/GNUmakefile	Mon Aug 22 21:51:33 2016 +0200
     1.3 @@ -1,6 +1,6 @@
     1.4  EXTENSION = latlon
     1.5 -DATA = latlon--0.1.sql
     1.6 -MODULES = latlon-v0001
     1.7 +DATA = latlon--0.1.sql latlon--0.1--0.2.sql latlon--0.2.sql
     1.8 +MODULES = latlon-v0001 latlon-v0002
     1.9  
    1.10  PG_CONFIG = pg_config
    1.11  PGXS := $(shell $(PG_CONFIG) --pgxs)
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/latlon--0.1--0.2.sql	Mon Aug 22 21:51:33 2016 +0200
     2.3 @@ -0,0 +1,391 @@
     2.4 +
     2.5 +CREATE OR REPLACE FUNCTION ekey_point_in_dummy(cstring)
     2.6 +  RETURNS ekey_point
     2.7 +  LANGUAGE C IMMUTABLE STRICT
     2.8 +  AS '$libdir/latlon-v0002', 'pgl_notimpl';
     2.9 +
    2.10 +CREATE OR REPLACE FUNCTION ekey_point_out_dummy(ekey_point)
    2.11 +  RETURNS cstring
    2.12 +  LANGUAGE C IMMUTABLE STRICT
    2.13 +  AS '$libdir/latlon-v0002', 'pgl_notimpl';
    2.14 +
    2.15 +CREATE OR REPLACE FUNCTION ekey_area_in_dummy(cstring)
    2.16 +  RETURNS ekey_area
    2.17 +  LANGUAGE C IMMUTABLE STRICT
    2.18 +  AS '$libdir/latlon-v0002', 'pgl_notimpl';
    2.19 +
    2.20 +CREATE OR REPLACE FUNCTION ekey_area_out_dummy(ekey_area)
    2.21 +  RETURNS cstring
    2.22 +  LANGUAGE C IMMUTABLE STRICT
    2.23 +  AS '$libdir/latlon-v0002', 'pgl_notimpl';
    2.24 +
    2.25 +CREATE OR REPLACE FUNCTION epoint_in(cstring)
    2.26 +  RETURNS epoint
    2.27 +  LANGUAGE C IMMUTABLE STRICT
    2.28 +  AS '$libdir/latlon-v0002', 'pgl_epoint_in';
    2.29 +
    2.30 +CREATE OR REPLACE FUNCTION ebox_in(cstring)
    2.31 +  RETURNS ebox
    2.32 +  LANGUAGE C IMMUTABLE STRICT
    2.33 +  AS '$libdir/latlon-v0002', 'pgl_ebox_in';
    2.34 +
    2.35 +CREATE OR REPLACE FUNCTION ecircle_in(cstring)
    2.36 +  RETURNS ecircle
    2.37 +  LANGUAGE C IMMUTABLE STRICT
    2.38 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_in';
    2.39 +
    2.40 +CREATE OR REPLACE FUNCTION ecluster_in(cstring)
    2.41 +  RETURNS ecluster
    2.42 +  LANGUAGE C IMMUTABLE STRICT
    2.43 +  AS '$libdir/latlon-v0002', 'pgl_ecluster_in';
    2.44 +
    2.45 +CREATE OR REPLACE FUNCTION epoint_out(epoint)
    2.46 +  RETURNS cstring
    2.47 +  LANGUAGE C IMMUTABLE STRICT
    2.48 +  AS '$libdir/latlon-v0002', 'pgl_epoint_out';
    2.49 +
    2.50 +CREATE OR REPLACE FUNCTION ebox_out(ebox)
    2.51 +  RETURNS cstring
    2.52 +  LANGUAGE C IMMUTABLE STRICT
    2.53 +  AS '$libdir/latlon-v0002', 'pgl_ebox_out';
    2.54 +
    2.55 +CREATE OR REPLACE FUNCTION ecircle_out(ecircle)
    2.56 +  RETURNS cstring
    2.57 +  LANGUAGE C IMMUTABLE STRICT
    2.58 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_out';
    2.59 +
    2.60 +CREATE OR REPLACE FUNCTION ecluster_out(ecluster)
    2.61 +  RETURNS cstring
    2.62 +  LANGUAGE C IMMUTABLE STRICT
    2.63 +  AS '$libdir/latlon-v0002', 'pgl_ecluster_out';
    2.64 +
    2.65 +CREATE OR REPLACE FUNCTION epoint_recv(internal)
    2.66 +  RETURNS epoint
    2.67 +  LANGUAGE C IMMUTABLE STRICT
    2.68 +  AS '$libdir/latlon-v0002', 'pgl_epoint_recv';
    2.69 +
    2.70 +CREATE OR REPLACE FUNCTION ebox_recv(internal)
    2.71 +  RETURNS ebox
    2.72 +  LANGUAGE C IMMUTABLE STRICT
    2.73 +  AS '$libdir/latlon-v0002', 'pgl_ebox_recv';
    2.74 +
    2.75 +CREATE OR REPLACE FUNCTION ecircle_recv(internal)
    2.76 +  RETURNS ecircle
    2.77 +  LANGUAGE C IMMUTABLE STRICT
    2.78 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_recv';
    2.79 +
    2.80 +CREATE OR REPLACE FUNCTION epoint_send(epoint)
    2.81 +  RETURNS bytea
    2.82 +  LANGUAGE C IMMUTABLE STRICT
    2.83 +  AS '$libdir/latlon-v0002', 'pgl_epoint_send';
    2.84 +
    2.85 +CREATE OR REPLACE FUNCTION ebox_send(ebox)
    2.86 +  RETURNS bytea
    2.87 +  LANGUAGE C IMMUTABLE STRICT
    2.88 +  AS '$libdir/latlon-v0002', 'pgl_ebox_send';
    2.89 +
    2.90 +CREATE OR REPLACE FUNCTION ecircle_send(ecircle)
    2.91 +  RETURNS bytea
    2.92 +  LANGUAGE C IMMUTABLE STRICT
    2.93 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_send';
    2.94 +
    2.95 +CREATE OR REPLACE FUNCTION epoint_btree_lt(epoint, epoint)
    2.96 +  RETURNS boolean
    2.97 +  LANGUAGE C IMMUTABLE STRICT
    2.98 +  AS '$libdir/latlon-v0002', 'pgl_btree_epoint_lt';
    2.99 +
   2.100 +CREATE OR REPLACE FUNCTION epoint_btree_le(epoint, epoint)
   2.101 +  RETURNS boolean
   2.102 +  LANGUAGE C IMMUTABLE STRICT
   2.103 +  AS '$libdir/latlon-v0002', 'pgl_btree_epoint_le';
   2.104 +
   2.105 +CREATE OR REPLACE FUNCTION epoint_btree_eq(epoint, epoint)
   2.106 +  RETURNS boolean
   2.107 +  LANGUAGE C IMMUTABLE STRICT
   2.108 +  AS '$libdir/latlon-v0002', 'pgl_btree_epoint_eq';
   2.109 +
   2.110 +CREATE OR REPLACE FUNCTION epoint_btree_ne(epoint, epoint)
   2.111 +  RETURNS boolean
   2.112 +  LANGUAGE C IMMUTABLE STRICT
   2.113 +  AS '$libdir/latlon-v0002', 'pgl_btree_epoint_ne';
   2.114 +
   2.115 +CREATE OR REPLACE FUNCTION epoint_btree_ge(epoint, epoint)
   2.116 +  RETURNS boolean
   2.117 +  LANGUAGE C IMMUTABLE STRICT
   2.118 +  AS '$libdir/latlon-v0002', 'pgl_btree_epoint_ge';
   2.119 +
   2.120 +CREATE OR REPLACE FUNCTION epoint_btree_gt(epoint, epoint)
   2.121 +  RETURNS boolean
   2.122 +  LANGUAGE C IMMUTABLE STRICT
   2.123 +  AS '$libdir/latlon-v0002', 'pgl_btree_epoint_gt';
   2.124 +
   2.125 +CREATE OR REPLACE FUNCTION epoint_btree_cmp(epoint, epoint)
   2.126 +  RETURNS int4
   2.127 +  LANGUAGE C IMMUTABLE STRICT
   2.128 +  AS '$libdir/latlon-v0002', 'pgl_btree_epoint_cmp';
   2.129 +
   2.130 +CREATE OR REPLACE FUNCTION ebox_btree_lt(ebox, ebox)
   2.131 +  RETURNS boolean
   2.132 +  LANGUAGE C IMMUTABLE STRICT
   2.133 +  AS '$libdir/latlon-v0002', 'pgl_btree_ebox_lt';
   2.134 +
   2.135 +CREATE OR REPLACE FUNCTION ebox_btree_le(ebox, ebox)
   2.136 +  RETURNS boolean
   2.137 +  LANGUAGE C IMMUTABLE STRICT
   2.138 +  AS '$libdir/latlon-v0002', 'pgl_btree_ebox_le';
   2.139 +
   2.140 +CREATE OR REPLACE FUNCTION ebox_btree_eq(ebox, ebox)
   2.141 +  RETURNS boolean
   2.142 +  LANGUAGE C IMMUTABLE STRICT
   2.143 +  AS '$libdir/latlon-v0002', 'pgl_btree_ebox_eq';
   2.144 +
   2.145 +CREATE OR REPLACE FUNCTION ebox_btree_ne(ebox, ebox)
   2.146 +  RETURNS boolean
   2.147 +  LANGUAGE C IMMUTABLE STRICT
   2.148 +  AS '$libdir/latlon-v0002', 'pgl_btree_ebox_ne';
   2.149 +
   2.150 +CREATE OR REPLACE FUNCTION ebox_btree_ge(ebox, ebox)
   2.151 +  RETURNS boolean
   2.152 +  LANGUAGE C IMMUTABLE STRICT
   2.153 +  AS '$libdir/latlon-v0002', 'pgl_btree_ebox_ge';
   2.154 +
   2.155 +CREATE OR REPLACE FUNCTION ebox_btree_gt(ebox, ebox)
   2.156 +  RETURNS boolean
   2.157 +  LANGUAGE C IMMUTABLE STRICT
   2.158 +  AS '$libdir/latlon-v0002', 'pgl_btree_ebox_gt';
   2.159 +
   2.160 +CREATE OR REPLACE FUNCTION ebox_btree_cmp(ebox, ebox)
   2.161 +  RETURNS int4
   2.162 +  LANGUAGE C IMMUTABLE STRICT
   2.163 +  AS '$libdir/latlon-v0002', 'pgl_btree_ebox_cmp';
   2.164 +
   2.165 +CREATE OR REPLACE FUNCTION ecircle_btree_lt(ecircle, ecircle)
   2.166 +  RETURNS boolean
   2.167 +  LANGUAGE C IMMUTABLE STRICT
   2.168 +  AS '$libdir/latlon-v0002', 'pgl_btree_ecircle_lt';
   2.169 +
   2.170 +CREATE OR REPLACE FUNCTION ecircle_btree_le(ecircle, ecircle)
   2.171 +  RETURNS boolean
   2.172 +  LANGUAGE C IMMUTABLE STRICT
   2.173 +  AS '$libdir/latlon-v0002', 'pgl_btree_ecircle_le';
   2.174 +
   2.175 +CREATE OR REPLACE FUNCTION ecircle_btree_eq(ecircle, ecircle)
   2.176 +  RETURNS boolean
   2.177 +  LANGUAGE C IMMUTABLE STRICT
   2.178 +  AS '$libdir/latlon-v0002', 'pgl_btree_ecircle_eq';
   2.179 +
   2.180 +CREATE OR REPLACE FUNCTION ecircle_btree_ne(ecircle, ecircle)
   2.181 +  RETURNS boolean
   2.182 +  LANGUAGE C IMMUTABLE STRICT
   2.183 +  AS '$libdir/latlon-v0002', 'pgl_btree_ecircle_ne';
   2.184 +
   2.185 +CREATE OR REPLACE FUNCTION ecircle_btree_ge(ecircle, ecircle)
   2.186 +  RETURNS boolean
   2.187 +  LANGUAGE C IMMUTABLE STRICT
   2.188 +  AS '$libdir/latlon-v0002', 'pgl_btree_ecircle_ge';
   2.189 +
   2.190 +CREATE OR REPLACE FUNCTION ecircle_btree_gt(ecircle, ecircle)
   2.191 +  RETURNS boolean
   2.192 +  LANGUAGE C IMMUTABLE STRICT
   2.193 +  AS '$libdir/latlon-v0002', 'pgl_btree_ecircle_gt';
   2.194 +
   2.195 +CREATE OR REPLACE FUNCTION ecircle_btree_cmp(ecircle, ecircle)
   2.196 +  RETURNS int4
   2.197 +  LANGUAGE C IMMUTABLE STRICT
   2.198 +  AS '$libdir/latlon-v0002', 'pgl_btree_ecircle_cmp';
   2.199 +
   2.200 +CREATE OR REPLACE FUNCTION cast_epoint_to_ebox(epoint)
   2.201 +  RETURNS ebox
   2.202 +  LANGUAGE C IMMUTABLE STRICT
   2.203 +  AS '$libdir/latlon-v0002', 'pgl_epoint_to_ebox';
   2.204 +
   2.205 +CREATE OR REPLACE FUNCTION cast_epoint_to_ecircle(epoint)
   2.206 +  RETURNS ecircle
   2.207 +  LANGUAGE C IMMUTABLE STRICT
   2.208 +  AS '$libdir/latlon-v0002', 'pgl_epoint_to_ecircle';
   2.209 +
   2.210 +CREATE OR REPLACE FUNCTION cast_epoint_to_ecluster(epoint)
   2.211 +  RETURNS ecluster
   2.212 +  LANGUAGE C IMMUTABLE STRICT
   2.213 +  AS '$libdir/latlon-v0002', 'pgl_epoint_to_ecluster';
   2.214 +
   2.215 +CREATE OR REPLACE FUNCTION cast_ebox_to_ecluster(ebox)
   2.216 +  RETURNS ecluster
   2.217 +  LANGUAGE C IMMUTABLE STRICT
   2.218 +  AS '$libdir/latlon-v0002', 'pgl_ebox_to_ecluster';
   2.219 +
   2.220 +CREATE OR REPLACE FUNCTION epoint(float8, float8)
   2.221 +  RETURNS epoint
   2.222 +  LANGUAGE C IMMUTABLE STRICT
   2.223 +  AS '$libdir/latlon-v0002', 'pgl_create_epoint';
   2.224 +
   2.225 +CREATE OR REPLACE FUNCTION empty_ebox()
   2.226 +  RETURNS ebox
   2.227 +  LANGUAGE C IMMUTABLE STRICT
   2.228 +  AS '$libdir/latlon-v0002', 'pgl_create_empty_ebox';
   2.229 +
   2.230 +CREATE OR REPLACE FUNCTION ebox(float8, float8, float8, float8)
   2.231 +  RETURNS ebox
   2.232 +  LANGUAGE C IMMUTABLE STRICT
   2.233 +  AS '$libdir/latlon-v0002', 'pgl_create_ebox';
   2.234 +
   2.235 +CREATE OR REPLACE FUNCTION ebox(epoint, epoint)
   2.236 +  RETURNS ebox
   2.237 +  LANGUAGE C IMMUTABLE STRICT
   2.238 +  AS '$libdir/latlon-v0002', 'pgl_create_ebox_from_epoints';
   2.239 +
   2.240 +CREATE OR REPLACE FUNCTION ecircle(float8, float8, float8)
   2.241 +  RETURNS ecircle
   2.242 +  LANGUAGE C IMMUTABLE STRICT
   2.243 +  AS '$libdir/latlon-v0002', 'pgl_create_ecircle';
   2.244 +
   2.245 +CREATE OR REPLACE FUNCTION ecircle(epoint, float8)
   2.246 +  RETURNS ecircle
   2.247 +  LANGUAGE C IMMUTABLE STRICT
   2.248 +  AS '$libdir/latlon-v0002', 'pgl_create_ecircle_from_epoint';
   2.249 +
   2.250 +CREATE OR REPLACE FUNCTION latitude(epoint)
   2.251 +  RETURNS float8
   2.252 +  LANGUAGE C IMMUTABLE STRICT
   2.253 +  AS '$libdir/latlon-v0002', 'pgl_epoint_lat';
   2.254 +
   2.255 +CREATE OR REPLACE FUNCTION longitude(epoint)
   2.256 +  RETURNS float8
   2.257 +  LANGUAGE C IMMUTABLE STRICT
   2.258 +  AS '$libdir/latlon-v0002', 'pgl_epoint_lon';
   2.259 +
   2.260 +CREATE OR REPLACE FUNCTION min_latitude(ebox)
   2.261 +  RETURNS float8
   2.262 +  LANGUAGE C IMMUTABLE STRICT
   2.263 +  AS '$libdir/latlon-v0002', 'pgl_ebox_lat_min';
   2.264 +
   2.265 +CREATE OR REPLACE FUNCTION max_latitude(ebox)
   2.266 +  RETURNS float8
   2.267 +  LANGUAGE C IMMUTABLE STRICT
   2.268 +  AS '$libdir/latlon-v0002', 'pgl_ebox_lat_max';
   2.269 +
   2.270 +CREATE OR REPLACE FUNCTION min_longitude(ebox)
   2.271 +  RETURNS float8
   2.272 +  LANGUAGE C IMMUTABLE STRICT
   2.273 +  AS '$libdir/latlon-v0002', 'pgl_ebox_lon_min';
   2.274 +
   2.275 +CREATE OR REPLACE FUNCTION max_longitude(ebox)
   2.276 +  RETURNS float8
   2.277 +  LANGUAGE C IMMUTABLE STRICT
   2.278 +  AS '$libdir/latlon-v0002', 'pgl_ebox_lon_max';
   2.279 +
   2.280 +CREATE OR REPLACE FUNCTION center(ecircle)
   2.281 +  RETURNS epoint
   2.282 +  LANGUAGE C IMMUTABLE STRICT
   2.283 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_center';
   2.284 +
   2.285 +CREATE OR REPLACE FUNCTION radius(ecircle)
   2.286 +  RETURNS float8
   2.287 +  LANGUAGE C IMMUTABLE STRICT
   2.288 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_radius';
   2.289 +
   2.290 +CREATE OR REPLACE FUNCTION epoint_ebox_overlap_proc(epoint, ebox)
   2.291 +  RETURNS boolean
   2.292 +  LANGUAGE C IMMUTABLE STRICT
   2.293 +  AS '$libdir/latlon-v0002', 'pgl_epoint_ebox_overlap';
   2.294 +
   2.295 +CREATE OR REPLACE FUNCTION epoint_ecircle_overlap_proc(epoint, ecircle)
   2.296 +  RETURNS boolean
   2.297 +  LANGUAGE C IMMUTABLE STRICT
   2.298 +  AS '$libdir/latlon-v0002', 'pgl_epoint_ecircle_overlap';
   2.299 +
   2.300 +CREATE OR REPLACE FUNCTION epoint_ecluster_overlap_proc(epoint, ecluster)
   2.301 +  RETURNS boolean
   2.302 +  LANGUAGE C IMMUTABLE STRICT
   2.303 +  AS '$libdir/latlon-v0002', 'pgl_epoint_ecluster_overlap';
   2.304 +
   2.305 +CREATE OR REPLACE FUNCTION ebox_overlap_proc(ebox, ebox)
   2.306 +  RETURNS boolean
   2.307 +  LANGUAGE C IMMUTABLE STRICT
   2.308 +  AS '$libdir/latlon-v0002', 'pgl_ebox_overlap';
   2.309 +
   2.310 +CREATE OR REPLACE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
   2.311 +  RETURNS boolean
   2.312 +  LANGUAGE C IMMUTABLE STRICT
   2.313 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_overlap';
   2.314 +
   2.315 +CREATE OR REPLACE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
   2.316 +  RETURNS boolean
   2.317 +  LANGUAGE C IMMUTABLE STRICT
   2.318 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_ecluster_overlap';
   2.319 +
   2.320 +CREATE OR REPLACE FUNCTION epoint_distance_proc(epoint, epoint)
   2.321 +  RETURNS float8
   2.322 +  LANGUAGE C IMMUTABLE STRICT
   2.323 +  AS '$libdir/latlon-v0002', 'pgl_epoint_distance';
   2.324 +
   2.325 +CREATE OR REPLACE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
   2.326 +  RETURNS float8
   2.327 +  LANGUAGE C IMMUTABLE STRICT
   2.328 +  AS '$libdir/latlon-v0002', 'pgl_epoint_ecircle_distance';
   2.329 +
   2.330 +CREATE OR REPLACE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
   2.331 +  RETURNS float8
   2.332 +  LANGUAGE C IMMUTABLE STRICT
   2.333 +  AS '$libdir/latlon-v0002', 'pgl_epoint_ecluster_distance';
   2.334 +
   2.335 +CREATE OR REPLACE FUNCTION ecircle_distance_proc(ecircle, ecircle)
   2.336 +  RETURNS float8
   2.337 +  LANGUAGE C IMMUTABLE STRICT
   2.338 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_distance';
   2.339 +
   2.340 +CREATE OR REPLACE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
   2.341 +  RETURNS float8
   2.342 +  LANGUAGE C IMMUTABLE STRICT
   2.343 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_ecluster_distance';
   2.344 +
   2.345 +CREATE OR REPLACE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
   2.346 +  RETURNS boolean
   2.347 +  LANGUAGE C STRICT
   2.348 +  AS '$libdir/latlon-v0002', 'pgl_gist_consistent';
   2.349 +
   2.350 +CREATE OR REPLACE FUNCTION pgl_gist_union(internal, internal)
   2.351 +  RETURNS internal
   2.352 +  LANGUAGE C STRICT
   2.353 +  AS '$libdir/latlon-v0002', 'pgl_gist_union';
   2.354 +
   2.355 +CREATE OR REPLACE FUNCTION pgl_gist_compress_epoint(internal)
   2.356 +  RETURNS internal
   2.357 +  LANGUAGE C STRICT
   2.358 +  AS '$libdir/latlon-v0002', 'pgl_gist_compress_epoint';
   2.359 +
   2.360 +CREATE OR REPLACE FUNCTION pgl_gist_compress_ecircle(internal)
   2.361 +  RETURNS internal
   2.362 +  LANGUAGE C STRICT
   2.363 +  AS '$libdir/latlon-v0002', 'pgl_gist_compress_ecircle';
   2.364 +
   2.365 +CREATE OR REPLACE FUNCTION pgl_gist_compress_ecluster(internal)
   2.366 +  RETURNS internal
   2.367 +  LANGUAGE C STRICT
   2.368 +  AS '$libdir/latlon-v0002', 'pgl_gist_compress_ecluster';
   2.369 +
   2.370 +CREATE OR REPLACE FUNCTION pgl_gist_decompress(internal)
   2.371 +  RETURNS internal
   2.372 +  LANGUAGE C STRICT
   2.373 +  AS '$libdir/latlon-v0002', 'pgl_gist_decompress';
   2.374 +
   2.375 +CREATE OR REPLACE FUNCTION pgl_gist_penalty(internal, internal, internal)
   2.376 +  RETURNS internal
   2.377 +  LANGUAGE C STRICT
   2.378 +  AS '$libdir/latlon-v0002', 'pgl_gist_penalty';
   2.379 +
   2.380 +CREATE OR REPLACE FUNCTION pgl_gist_picksplit(internal, internal)
   2.381 +  RETURNS internal
   2.382 +  LANGUAGE C STRICT
   2.383 +  AS '$libdir/latlon-v0002', 'pgl_gist_picksplit';
   2.384 +
   2.385 +CREATE OR REPLACE FUNCTION pgl_gist_same(internal, internal, internal)
   2.386 +  RETURNS internal
   2.387 +  LANGUAGE C STRICT
   2.388 +  AS '$libdir/latlon-v0002', 'pgl_gist_same';
   2.389 +
   2.390 +CREATE OR REPLACE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
   2.391 +  RETURNS internal
   2.392 +  LANGUAGE C STRICT
   2.393 +  AS '$libdir/latlon-v0002', 'pgl_gist_distance';
   2.394 +
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/latlon--0.2.sql	Mon Aug 22 21:51:33 2016 +0200
     3.3 @@ -0,0 +1,1205 @@
     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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', '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-v0002', 'pgl_epoint_ecluster_overlap';
   3.737 +
   3.738 +CREATE FUNCTION ebox_overlap_proc(ebox, ebox)
   3.739 +  RETURNS boolean
   3.740 +  LANGUAGE C IMMUTABLE STRICT
   3.741 +  AS '$libdir/latlon-v0002', 'pgl_ebox_overlap';
   3.742 +
   3.743 +CREATE FUNCTION ecircle_overlap_proc(ecircle, ecircle)
   3.744 +  RETURNS boolean
   3.745 +  LANGUAGE C IMMUTABLE STRICT
   3.746 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_overlap';
   3.747 +
   3.748 +CREATE FUNCTION ecircle_ecluster_overlap_proc(ecircle, ecluster)
   3.749 +  RETURNS boolean
   3.750 +  LANGUAGE C IMMUTABLE STRICT
   3.751 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_ecluster_overlap';
   3.752 +
   3.753 +CREATE FUNCTION epoint_distance_proc(epoint, epoint)
   3.754 +  RETURNS float8
   3.755 +  LANGUAGE C IMMUTABLE STRICT
   3.756 +  AS '$libdir/latlon-v0002', 'pgl_epoint_distance';
   3.757 +
   3.758 +CREATE FUNCTION epoint_ecircle_distance_proc(epoint, ecircle)
   3.759 +  RETURNS float8
   3.760 +  LANGUAGE C IMMUTABLE STRICT
   3.761 +  AS '$libdir/latlon-v0002', 'pgl_epoint_ecircle_distance';
   3.762 +
   3.763 +CREATE FUNCTION epoint_ecluster_distance_proc(epoint, ecluster)
   3.764 +  RETURNS float8
   3.765 +  LANGUAGE C IMMUTABLE STRICT
   3.766 +  AS '$libdir/latlon-v0002', 'pgl_epoint_ecluster_distance';
   3.767 +
   3.768 +CREATE FUNCTION ecircle_distance_proc(ecircle, ecircle)
   3.769 +  RETURNS float8
   3.770 +  LANGUAGE C IMMUTABLE STRICT
   3.771 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_distance';
   3.772 +
   3.773 +CREATE FUNCTION ecircle_ecluster_distance_proc(ecircle, ecluster)
   3.774 +  RETURNS float8
   3.775 +  LANGUAGE C IMMUTABLE STRICT
   3.776 +  AS '$libdir/latlon-v0002', 'pgl_ecircle_ecluster_distance';
   3.777 +
   3.778 +CREATE OPERATOR && (
   3.779 +  leftarg = epoint,
   3.780 +  rightarg = ebox,
   3.781 +  procedure = epoint_ebox_overlap_proc,
   3.782 +  commutator = &&,
   3.783 +  restrict = areasel,
   3.784 +  join = areajoinsel
   3.785 +);
   3.786 +
   3.787 +CREATE FUNCTION epoint_ebox_overlap_commutator(ebox, epoint)
   3.788 +  RETURNS boolean
   3.789 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
   3.790 +
   3.791 +CREATE OPERATOR && (
   3.792 +  leftarg = ebox,
   3.793 +  rightarg = epoint,
   3.794 +  procedure = epoint_ebox_overlap_commutator,
   3.795 +  commutator = &&,
   3.796 +  restrict = areasel,
   3.797 +  join = areajoinsel
   3.798 +);
   3.799 +
   3.800 +CREATE OPERATOR && (
   3.801 +  leftarg = epoint,
   3.802 +  rightarg = ecircle,
   3.803 +  procedure = epoint_ecircle_overlap_proc,
   3.804 +  commutator = &&,
   3.805 +  restrict = areasel,
   3.806 +  join = areajoinsel
   3.807 +);
   3.808 +
   3.809 +CREATE FUNCTION epoint_ecircle_overlap_commutator(ecircle, epoint)
   3.810 +  RETURNS boolean
   3.811 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
   3.812 +
   3.813 +CREATE OPERATOR && (
   3.814 +  leftarg = ecircle,
   3.815 +  rightarg = epoint,
   3.816 +  procedure = epoint_ecircle_overlap_commutator,
   3.817 +  commutator = &&,
   3.818 +  restrict = areasel,
   3.819 +  join = areajoinsel
   3.820 +);
   3.821 +
   3.822 +CREATE OPERATOR && (
   3.823 +  leftarg = epoint,
   3.824 +  rightarg = ecluster,
   3.825 +  procedure = epoint_ecluster_overlap_proc,
   3.826 +  commutator = &&,
   3.827 +  restrict = areasel,
   3.828 +  join = areajoinsel
   3.829 +);
   3.830 +
   3.831 +CREATE FUNCTION epoint_ecluster_overlap_commutator(ecluster, epoint)
   3.832 +  RETURNS boolean
   3.833 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 && $1';
   3.834 +
   3.835 +CREATE OPERATOR && (
   3.836 +  leftarg = ecluster,
   3.837 +  rightarg = epoint,
   3.838 +  procedure = epoint_ecluster_overlap_commutator,
   3.839 +  commutator = &&,
   3.840 +  restrict = areasel,
   3.841 +  join = areajoinsel
   3.842 +);
   3.843 +
   3.844 +CREATE OPERATOR && (
   3.845 +  leftarg = ebox,
   3.846 +  rightarg = ebox,
   3.847 +  procedure = ebox_overlap_proc,
   3.848 +  commutator = &&,
   3.849 +  restrict = areasel,
   3.850 +  join = areajoinsel
   3.851 +);
   3.852 +
   3.853 +CREATE OPERATOR && (
   3.854 +  leftarg = ecircle,
   3.855 +  rightarg = ecircle,
   3.856 +  procedure = ecircle_overlap_proc,
   3.857 +  commutator = &&,
   3.858 +  restrict = areasel,
   3.859 +  join = areajoinsel
   3.860 +);
   3.861 +
   3.862 +CREATE OPERATOR && (
   3.863 +  leftarg = ecircle,
   3.864 +  rightarg = ecluster,
   3.865 +  procedure = ecircle_ecluster_overlap_proc,
   3.866 +  commutator = &&,
   3.867 +  restrict = areasel,
   3.868 +  join = areajoinsel
   3.869 +);
   3.870 +
   3.871 +CREATE FUNCTION ecircle_ecluster_overlap_commutator(ecluster, ecircle)
   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 = ecircle,
   3.878 +  procedure = ecircle_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 = epoint,
   3.886 +  rightarg = epoint,
   3.887 +  procedure = epoint_distance_proc,
   3.888 +  commutator = <->
   3.889 +);
   3.890 +
   3.891 +CREATE OPERATOR <-> (
   3.892 +  leftarg = epoint,
   3.893 +  rightarg = ecircle,
   3.894 +  procedure = epoint_ecircle_distance_proc,
   3.895 +  commutator = <->
   3.896 +);
   3.897 +
   3.898 +CREATE FUNCTION epoint_ecircle_distance_commutator(ecircle, epoint)
   3.899 +  RETURNS float8
   3.900 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
   3.901 +
   3.902 +CREATE OPERATOR <-> (
   3.903 +  leftarg = ecircle,
   3.904 +  rightarg = epoint,
   3.905 +  procedure = epoint_ecircle_distance_commutator,
   3.906 +  commutator = <->
   3.907 +);
   3.908 +
   3.909 +CREATE OPERATOR <-> (
   3.910 +  leftarg = epoint,
   3.911 +  rightarg = ecluster,
   3.912 +  procedure = epoint_ecluster_distance_proc,
   3.913 +  commutator = <->
   3.914 +);
   3.915 +
   3.916 +CREATE FUNCTION epoint_ecluster_distance_commutator(ecluster, epoint)
   3.917 +  RETURNS float8
   3.918 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
   3.919 +
   3.920 +CREATE OPERATOR <-> (
   3.921 +  leftarg = ecluster,
   3.922 +  rightarg = epoint,
   3.923 +  procedure = epoint_ecluster_distance_commutator,
   3.924 +  commutator = <->
   3.925 +);
   3.926 +
   3.927 +CREATE OPERATOR <-> (
   3.928 +  leftarg = ecircle,
   3.929 +  rightarg = ecircle,
   3.930 +  procedure = ecircle_distance_proc,
   3.931 +  commutator = <->
   3.932 +);
   3.933 +
   3.934 +CREATE OPERATOR <-> (
   3.935 +  leftarg = ecircle,
   3.936 +  rightarg = ecluster,
   3.937 +  procedure = ecircle_ecluster_distance_proc,
   3.938 +  commutator = <->
   3.939 +);
   3.940 +
   3.941 +CREATE FUNCTION ecircle_ecluster_distance_commutator(ecluster, ecircle)
   3.942 +  RETURNS float8
   3.943 +  LANGUAGE sql IMMUTABLE AS 'SELECT $2 <-> $1';
   3.944 +
   3.945 +CREATE OPERATOR <-> (
   3.946 +  leftarg = ecluster,
   3.947 +  rightarg = ecircle,
   3.948 +  procedure = ecircle_ecluster_distance_commutator,
   3.949 +  commutator = <->
   3.950 +);
   3.951 +
   3.952 +
   3.953 +----------------
   3.954 +-- GiST index --
   3.955 +----------------
   3.956 +
   3.957 +CREATE FUNCTION pgl_gist_consistent(internal, internal, smallint, oid, internal)
   3.958 +  RETURNS boolean
   3.959 +  LANGUAGE C STRICT
   3.960 +  AS '$libdir/latlon-v0002', 'pgl_gist_consistent';
   3.961 +
   3.962 +CREATE FUNCTION pgl_gist_union(internal, internal)
   3.963 +  RETURNS internal
   3.964 +  LANGUAGE C STRICT
   3.965 +  AS '$libdir/latlon-v0002', 'pgl_gist_union';
   3.966 +
   3.967 +CREATE FUNCTION pgl_gist_compress_epoint(internal)
   3.968 +  RETURNS internal
   3.969 +  LANGUAGE C STRICT
   3.970 +  AS '$libdir/latlon-v0002', 'pgl_gist_compress_epoint';
   3.971 +
   3.972 +CREATE FUNCTION pgl_gist_compress_ecircle(internal)
   3.973 +  RETURNS internal
   3.974 +  LANGUAGE C STRICT
   3.975 +  AS '$libdir/latlon-v0002', 'pgl_gist_compress_ecircle';
   3.976 +
   3.977 +CREATE FUNCTION pgl_gist_compress_ecluster(internal)
   3.978 +  RETURNS internal
   3.979 +  LANGUAGE C STRICT
   3.980 +  AS '$libdir/latlon-v0002', 'pgl_gist_compress_ecluster';
   3.981 +
   3.982 +CREATE FUNCTION pgl_gist_decompress(internal)
   3.983 +  RETURNS internal
   3.984 +  LANGUAGE C STRICT
   3.985 +  AS '$libdir/latlon-v0002', 'pgl_gist_decompress';
   3.986 +
   3.987 +CREATE FUNCTION pgl_gist_penalty(internal, internal, internal)
   3.988 +  RETURNS internal
   3.989 +  LANGUAGE C STRICT
   3.990 +  AS '$libdir/latlon-v0002', 'pgl_gist_penalty';
   3.991 +
   3.992 +CREATE FUNCTION pgl_gist_picksplit(internal, internal)
   3.993 +  RETURNS internal
   3.994 +  LANGUAGE C STRICT
   3.995 +  AS '$libdir/latlon-v0002', 'pgl_gist_picksplit';
   3.996 +
   3.997 +CREATE FUNCTION pgl_gist_same(internal, internal, internal)
   3.998 +  RETURNS internal
   3.999 +  LANGUAGE C STRICT
  3.1000 +  AS '$libdir/latlon-v0002', 'pgl_gist_same';
  3.1001 +
  3.1002 +CREATE FUNCTION pgl_gist_distance(internal, internal, smallint, oid)
  3.1003 +  RETURNS internal
  3.1004 +  LANGUAGE C STRICT
  3.1005 +  AS '$libdir/latlon-v0002', 'pgl_gist_distance';
  3.1006 +
  3.1007 +CREATE OPERATOR CLASS epoint_ops
  3.1008 +  DEFAULT FOR TYPE epoint USING gist AS
  3.1009 +  OPERATOR 11 = ,
  3.1010 +  OPERATOR 22 && (epoint, ebox),
  3.1011 +  OPERATOR 23 && (epoint, ecircle),
  3.1012 +  OPERATOR 24 && (epoint, ecluster),
  3.1013 +  OPERATOR 31 <-> (epoint, epoint) FOR ORDER BY float_ops,
  3.1014 +  OPERATOR 33 <-> (epoint, ecircle) FOR ORDER BY float_ops,
  3.1015 +  OPERATOR 34 <-> (epoint, ecluster) FOR ORDER BY float_ops,
  3.1016 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  3.1017 +  FUNCTION 2 pgl_gist_union(internal, internal),
  3.1018 +  FUNCTION 3 pgl_gist_compress_epoint(internal),
  3.1019 +  FUNCTION 4 pgl_gist_decompress(internal),
  3.1020 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  3.1021 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  3.1022 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  3.1023 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  3.1024 +  STORAGE ekey_point;
  3.1025 +
  3.1026 +CREATE OPERATOR CLASS ecircle_ops
  3.1027 +  DEFAULT FOR TYPE ecircle USING gist AS
  3.1028 +  OPERATOR 13 = ,
  3.1029 +  OPERATOR 21 && (ecircle, epoint),
  3.1030 +  OPERATOR 23 && (ecircle, ecircle),
  3.1031 +  OPERATOR 24 && (ecircle, ecluster),
  3.1032 +  OPERATOR 31 <-> (ecircle, epoint) FOR ORDER BY float_ops,
  3.1033 +  OPERATOR 33 <-> (ecircle, ecircle) FOR ORDER BY float_ops,
  3.1034 +  OPERATOR 34 <-> (ecircle, ecluster) FOR ORDER BY float_ops,
  3.1035 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  3.1036 +  FUNCTION 2 pgl_gist_union(internal, internal),
  3.1037 +  FUNCTION 3 pgl_gist_compress_ecircle(internal),
  3.1038 +  FUNCTION 4 pgl_gist_decompress(internal),
  3.1039 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  3.1040 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  3.1041 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  3.1042 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  3.1043 +  STORAGE ekey_area;
  3.1044 +
  3.1045 +CREATE OPERATOR CLASS ecluster_ops
  3.1046 +  DEFAULT FOR TYPE ecluster USING gist AS
  3.1047 +  OPERATOR 21 && (ecluster, epoint),
  3.1048 +  FUNCTION 1 pgl_gist_consistent(internal, internal, smallint, oid, internal),
  3.1049 +  FUNCTION 2 pgl_gist_union(internal, internal),
  3.1050 +  FUNCTION 3 pgl_gist_compress_ecluster(internal),
  3.1051 +  FUNCTION 4 pgl_gist_decompress(internal),
  3.1052 +  FUNCTION 5 pgl_gist_penalty(internal, internal, internal),
  3.1053 +  FUNCTION 6 pgl_gist_picksplit(internal, internal),
  3.1054 +  FUNCTION 7 pgl_gist_same(internal, internal, internal),
  3.1055 +  FUNCTION 8 pgl_gist_distance(internal, internal, smallint, oid),
  3.1056 +  STORAGE ekey_area;
  3.1057 +
  3.1058 +
  3.1059 +---------------------
  3.1060 +-- alias functions --
  3.1061 +---------------------
  3.1062 +
  3.1063 +CREATE FUNCTION distance(epoint, epoint)
  3.1064 +  RETURNS float8
  3.1065 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
  3.1066 +
  3.1067 +CREATE FUNCTION distance(ecluster, epoint)
  3.1068 +  RETURNS float8
  3.1069 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 <-> $2';
  3.1070 +
  3.1071 +CREATE FUNCTION distance_within(epoint, epoint, float8)
  3.1072 +  RETURNS boolean
  3.1073 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
  3.1074 +
  3.1075 +CREATE FUNCTION distance_within(ecluster, epoint, float8)
  3.1076 +  RETURNS boolean
  3.1077 +  LANGUAGE sql IMMUTABLE AS 'SELECT $1 && ecircle($2, $3)';
  3.1078 +
  3.1079 +
  3.1080 +--------------------------------
  3.1081 +-- other data storage formats --
  3.1082 +--------------------------------
  3.1083 +
  3.1084 +CREATE FUNCTION coords_to_epoint(float8, float8, text = 'epoint_lonlat')
  3.1085 +  RETURNS epoint
  3.1086 +  LANGUAGE plpgsql IMMUTABLE STRICT AS $$
  3.1087 +    DECLARE
  3.1088 +      "result" epoint;
  3.1089 +    BEGIN
  3.1090 +      IF $3 = 'epoint_lonlat' THEN
  3.1091 +        -- avoid dynamic command execution for better performance
  3.1092 +        RETURN epoint($2, $1);
  3.1093 +      END IF;
  3.1094 +      IF $3 = 'epoint' OR $3 = 'epoint_latlon' THEN
  3.1095 +        -- avoid dynamic command execution for better performance
  3.1096 +        RETURN epoint($1, $2);
  3.1097 +      END IF;
  3.1098 +      EXECUTE 'SELECT ' || $3 || '($1, $2)' INTO STRICT "result" USING $1, $2;
  3.1099 +      RETURN "result";
  3.1100 +    END;
  3.1101 +  $$;
  3.1102 +
  3.1103 +CREATE FUNCTION GeoJSON_to_epoint(jsonb, text = 'epoint_lonlat')
  3.1104 +  RETURNS epoint
  3.1105 +  LANGUAGE sql IMMUTABLE STRICT AS $$
  3.1106 +    SELECT CASE
  3.1107 +    WHEN $1->>'type' = 'Point' THEN
  3.1108 +      coords_to_epoint(
  3.1109 +        ($1->'coordinates'->>1)::float8,
  3.1110 +        ($1->'coordinates'->>0)::float8,
  3.1111 +        $2
  3.1112 +      )
  3.1113 +    WHEN $1->>'type' = 'Feature' THEN
  3.1114 +      GeoJSON_to_epoint($1->'geometry', $2)
  3.1115 +    ELSE
  3.1116 +      NULL
  3.1117 +    END
  3.1118 +  $$;
  3.1119 +
  3.1120 +CREATE FUNCTION GeoJSON_to_ecluster(jsonb, text = 'epoint_lonlat')
  3.1121 +  RETURNS ecluster
  3.1122 +  LANGUAGE sql IMMUTABLE STRICT AS $$
  3.1123 +    SELECT CASE $1->>'type'
  3.1124 +    WHEN 'Point' THEN
  3.1125 +      coords_to_epoint(
  3.1126 +        ($1->'coordinates'->>1)::float8,
  3.1127 +        ($1->'coordinates'->>0)::float8,
  3.1128 +        $2
  3.1129 +      )::ecluster
  3.1130 +    WHEN 'MultiPoint' THEN
  3.1131 +      ( SELECT ecluster_create_multipoint(array_agg(
  3.1132 +          coords_to_epoint(
  3.1133 +            ("coord"->>1)::float8,
  3.1134 +            ("coord"->>0)::float8,
  3.1135 +            $2
  3.1136 +          )
  3.1137 +        ))
  3.1138 +        FROM jsonb_array_elements($1->'coordinates') AS "coord"
  3.1139 +      )
  3.1140 +    WHEN 'LineString' THEN
  3.1141 +      ( SELECT ecluster_create_path(array_agg(
  3.1142 +          coords_to_epoint(
  3.1143 +            ("coord"->>1)::float8,
  3.1144 +            ("coord"->>0)::float8,
  3.1145 +            $2
  3.1146 +          )
  3.1147 +        ))
  3.1148 +        FROM jsonb_array_elements($1->'coordinates') AS "coord"
  3.1149 +      )
  3.1150 +    WHEN 'MultiLineString' THEN
  3.1151 +      ( SELECT ecluster_concat(array_agg(
  3.1152 +          ( SELECT ecluster_create_path(array_agg(
  3.1153 +              coords_to_epoint(
  3.1154 +                ("coord"->>1)::float8,
  3.1155 +                ("coord"->>0)::float8,
  3.1156 +                $2
  3.1157 +              )
  3.1158 +            ))
  3.1159 +            FROM jsonb_array_elements("coord_array") AS "coord"
  3.1160 +          )
  3.1161 +        ))
  3.1162 +        FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
  3.1163 +      )
  3.1164 +    WHEN 'Polygon' THEN
  3.1165 +      ( SELECT ecluster_concat(array_agg(
  3.1166 +          ( SELECT ecluster_create_polygon(array_agg(
  3.1167 +              coords_to_epoint(
  3.1168 +                ("coord"->>1)::float8,
  3.1169 +                ("coord"->>0)::float8,
  3.1170 +                $2
  3.1171 +              )
  3.1172 +            ))
  3.1173 +            FROM jsonb_array_elements("coord_array") AS "coord"
  3.1174 +          )
  3.1175 +        ))
  3.1176 +        FROM jsonb_array_elements($1->'coordinates') AS "coord_array"
  3.1177 +      )
  3.1178 +    WHEN 'MultiPolygon' THEN
  3.1179 +      ( SELECT ecluster_concat(array_agg(
  3.1180 +          ( SELECT ecluster_concat(array_agg(
  3.1181 +              ( SELECT ecluster_create_polygon(array_agg(
  3.1182 +                  coords_to_epoint(
  3.1183 +                    ("coord"->>1)::float8,
  3.1184 +                    ("coord"->>0)::float8,
  3.1185 +                    $2
  3.1186 +                  )
  3.1187 +                ))
  3.1188 +                FROM jsonb_array_elements("coord_array") AS "coord"
  3.1189 +              )
  3.1190 +            ))
  3.1191 +            FROM jsonb_array_elements("coord_array_array") AS "coord_array"
  3.1192 +          )
  3.1193 +        ))
  3.1194 +        FROM jsonb_array_elements($1->'coordinates') AS "coord_array_array"
  3.1195 +      )
  3.1196 +    WHEN 'Feature' THEN
  3.1197 +      GeoJSON_to_ecluster($1->'geometry', $2)
  3.1198 +    WHEN 'FeatureCollection' THEN
  3.1199 +      ( SELECT ecluster_concat(array_agg(
  3.1200 +          GeoJSON_to_ecluster("feature", $2)
  3.1201 +        ))
  3.1202 +        FROM jsonb_array_elements($1->'features') AS "feature"
  3.1203 +      )
  3.1204 +    ELSE
  3.1205 +      NULL
  3.1206 +    END
  3.1207 +  $$;
  3.1208 +
     4.1 --- a/latlon.control	Mon Aug 22 21:35:25 2016 +0200
     4.2 +++ b/latlon.control	Mon Aug 22 21:51:33 2016 +0200
     4.3 @@ -1,4 +1,4 @@
     4.4  # geographical extension
     4.5  comment = 'geospatial support'
     4.6 -default_version = '0.1'
     4.7 +default_version = '0.2'
     4.8  relocatable = true

Impressum / About Us