@@ -119,11 +119,11 @@ DECLARE
119
119
FINAL_LAT_PRECISION_ decimal := PAIR_PRECISION_ * power(GRID_ROWS_, MAX_DIGIT_COUNT_ - PAIR_CODE_LENGTH_);
120
120
latVal decimal := 0 ;
121
121
BEGIN
122
- latVal := round (latitude * FINAL_LAT_PRECISION_);
122
+ latVal := floor (latitude * FINAL_LAT_PRECISION_);
123
123
latVal := latVal + LATITUDE_MAX_ * FINAL_LAT_PRECISION_;
124
124
IF (latVal < 0 ) THEN
125
125
latVal := 0 ;
126
- ELSIF (latVal > 2 * LATITUDE_MAX_ * FINAL_LAT_PRECISION_) THEN
126
+ ELSIF (latVal >= 2 * LATITUDE_MAX_ * FINAL_LAT_PRECISION_) THEN
127
127
latVal := 2 * LATITUDE_MAX_ * FINAL_LAT_PRECISION_ - 1 ;
128
128
END IF;
129
129
RETURN latVal;
@@ -155,11 +155,11 @@ DECLARE
155
155
FINAL_LNG_PRECISION_ decimal := PAIR_PRECISION_ * power(GRID_COLUMNS_, MAX_DIGIT_COUNT_ - PAIR_CODE_LENGTH_);
156
156
lngVal decimal := 0 ;
157
157
BEGIN
158
- lngVal := round (longitude * FINAL_LNG_PRECISION_);
158
+ lngVal := floor (longitude * FINAL_LNG_PRECISION_);
159
159
lngVal := lngVal + LONGITUDE_MAX_ * FINAL_LNG_PRECISION_;
160
- IF (lngVal < 0 ) THEN
160
+ IF (lngVal <= 0 ) THEN
161
161
lngVal := lngVal % (2 * LONGITUDE_MAX_ * FINAL_LNG_PRECISION_) + 2 * LONGITUDE_MAX_ * FINAL_LNG_PRECISION_;
162
- ELSIF (lngVal > 2 * LONGITUDE_MAX_ * FINAL_LNG_PRECISION_) THEN
162
+ ELSIF (lngVal >= 2 * LONGITUDE_MAX_ * FINAL_LNG_PRECISION_) THEN
163
163
lngVal := lngVal % (2 * LONGITUDE_MAX_ * FINAL_LNG_PRECISION_);
164
164
END IF;
165
165
RETURN lngVal;
@@ -396,6 +396,7 @@ DECLARE
396
396
PADDING_CHARACTER_ text := ' 0' ;
397
397
CODE_ALPHABET_ text := ' 23456789CFGHJMPQRVWX' ;
398
398
ENCODING_BASE_ int := char_length(CODE_ALPHABET_);
399
+ MIN_DIGIT_COUNT_ int := 2 ;
399
400
MAX_DIGIT_COUNT_ int := 15 ;
400
401
PAIR_CODE_LENGTH_ int := 10 ;
401
402
GRID_CODE_LENGTH_ int := MAX_DIGIT_COUNT_ - PAIR_CODE_LENGTH_;
@@ -407,6 +408,13 @@ DECLARE
407
408
ndx smallint ;
408
409
i_ smallint ;
409
410
BEGIN
411
+ IF ((codeLength < MIN_DIGIT_COUNT_) OR ((codeLength < PAIR_CODE_LENGTH_) AND (codeLength % 2 = 1 ))) THEN
412
+ RAISE EXCEPTION ' Invalid Open Location Code length - %' , codeLength
413
+ USING HINT = ' The Open Location Code length must be 2, 4, 6, 8, 10, 11, 12, 13, 14, or 15.' ;
414
+ END IF;
415
+
416
+ codeLength := LEAST(codeLength, MAX_DIGIT_COUNT_);
417
+
410
418
IF (codeLength > PAIR_CODE_LENGTH_) THEN
411
419
i_ := 0 ;
412
420
WHILE (i_ < (MAX_DIGIT_COUNT_ - PAIR_CODE_LENGTH_)) LOOP
@@ -461,37 +469,9 @@ RETURNS text
461
469
IMMUTABLE
462
470
AS $BODY$
463
471
DECLARE
464
- SEPARATOR_ text := ' +' ;
465
- SEPARATOR_POSITION_ int := 8 ;
466
- PADDING_CHARACTER_ text := ' 0' ;
467
- CODE_ALPHABET_ text := ' 23456789CFGHJMPQRVWX' ;
468
- ENCODING_BASE_ int := char_length(CODE_ALPHABET_);
469
- LATITUDE_MAX_ int := 90 ;
470
- LONGITUDE_MAX_ int := 180 ;
471
- MIN_DIGIT_COUNT_ int := 2 ;
472
- MAX_DIGIT_COUNT_ int := 15 ;
473
- PAIR_CODE_LENGTH_ int := 10 ;
474
- PAIR_PRECISION_ decimal := power(ENCODING_BASE_, 3 );
475
- GRID_CODE_LENGTH_ int := MAX_DIGIT_COUNT_ - PAIR_CODE_LENGTH_;
476
- GRID_COLUMNS_ int := 4 ;
477
- GRID_ROWS_ int := 5 ;
478
- FINAL_LAT_PRECISION_ decimal := PAIR_PRECISION_ * power(GRID_ROWS_, MAX_DIGIT_COUNT_ - PAIR_CODE_LENGTH_);
479
- FINAL_LNG_PRECISION_ decimal := PAIR_PRECISION_ * power(GRID_COLUMNS_, MAX_DIGIT_COUNT_ - PAIR_CODE_LENGTH_);
480
- code text := ' ' ;
481
472
latVal decimal := 0 ;
482
473
lngVal decimal := 0 ;
483
- latDigit smallint ;
484
- lngDigit smallint ;
485
- ndx smallint ;
486
- i_ smallint ;
487
474
BEGIN
488
- IF ((codeLength < MIN_DIGIT_COUNT_) OR ((codeLength < PAIR_CODE_LENGTH_) AND (codeLength % 2 = 1 ))) THEN
489
- RAISE EXCEPTION ' Invalid Open Location Code length - %' , codeLength
490
- USING HINT = ' The Open Location Code length must be 2, 4, 6, 8, 10, 11, 12, 13, 14, or 15.' ;
491
- END IF;
492
-
493
- codeLength := LEAST(codeLength, MAX_DIGIT_COUNT_);
494
-
495
475
latVal := pluscode_latitudeToInteger(latitude);
496
476
lngVal := pluscode_longitudeToInteger(longitude);
497
477
0 commit comments