WL#7928: Geohash encoding and decoding functions
Status: Complete
Geohash is a system for encoding latitude and longitude coordinates of arbitrary precision into a text string. This worklog is about adding functions to encode and decode geohashes.
These functions will make it possible for applications to import and export data from MySQL using the geohash format. It will also make it possible to index and search for geographic data in one-dimensional indexes.
Specification: http://en.wikipedia.org/wiki/Geohash
User Documentation
Functional requirements: F-1: The encoding function MUST correctly encode all valid longitude-latitude coordinates into geohashes according to the specification. F-2: The decoding functions MUST correctly decode all valid geohashes into longitude/latitude/point. F-3: The encoding function MUST NOT allow invalid longitude, latitude or point values. It MUST raise an exception condition if given invalid parameter values. F-4: The decoding functions MUST NOT allow invalid geohash values. They MUST raise exception conditions if given invalid parameter values. F-5: The functions MUST NOT return NULL unless given a NULL parameter value. In case of NULL values for one or more nullable input parameters, the functions MUST return NULL. F-6: The functions SHOULD NOT allow non-numeric types as longitude, latitude or length parameters. They SHOULD raise exception conditions in such cases. F-7: The functions SHOULD NOT allow non-string values as geohash parameters. They SHOULD raise exception conditions in such cases. F-8: The user MUST provide a maxlength parameter to encoding functions to get a geohash of the requested length (in bytes). Such a parameter MUST be an integer number greater than 0. If this parameter is NULL, the functions MUST return NULL. F-9: The user SHOULD be allowed to provide an SRID parameter to decoding functions returning geometric objects. Such a parameter MUST be a positive 32 bit unsigned integer and SHOULD NOT have a default value. If this parameter is NULL, the functions MUST return NULL. F-10: Valid longitude values MUST be in the range [-180,180]. Positive values are east of the prime meridian. Longitude parameters MUST be nullable. F-11: Valid latitude values MUST be in the range [-90,90]. Positive values are north of the equator. Latitude parameters MUST be nullable. F-12: Longitude and latitude output values SHOULD be DOUBLE values. They MUST be DECIMAL or DOUBLE. F-13: Valid points MUST be of the POINT datatype and have a valid longitude parameter as x coordinate and a valid latitude parameters as y coordinate. Point parameters MUST be nullable. F-14: Valid geohash strings MUST only contain the characters "0123456789bcdefghjkmnpqrstuvwxyz". Geohash string parameters MUST be nullable. F-15: Empty strings SHOULD NOT be valid geohash strings. Empty strings MUST be either invalid geohash strings or equivalent to NULL. Non-functional requirements: NF-1: The functions SHOULD stop processing long input parameters after the required precision is reached. NF-2: The functions SHOULD stop processing immediately after an error (e.g., an invalid parameter) is discovered.
Changes to the interface specification: I-1: No new files. I-2: New syntax: Four new functions: <string> = ST_GEOHASH(<longitude>, <latitude>, <maxlength>) <string> = ST_GEOHASH(<point>, <maxlength>) <double> = ST_LONGFROMGEOHASH(<string>) <double> = ST_LATFROMGEOHASH(<string>) <point> = ST_POINTFROMGEOHASH(<string>, <srid>) I-3: No new commands. I-4: No new tools. I-5: No impact on existing functionality.
Overall design ============== Four new functions implemented as four new Item_func subclasses, where latitude and longitude decoding functions is derived from a new superclass: - Item_func_geohash : public Item_str_func - Item_func_pointfromgeohash : public Item_geometry_func - Item_func_latlongfromgeohash : public Item_real_func - Item_func_longfromgeohash : public Item_func_latlongfromgeohash - Item_func_latfromgeohash : public Item_func_latlongfromgeohash Each function has a corresponding Create_func subclass: - Create_func_geohash : public Create_native_func - Create_func_longfromgeohash : public Create_func_arg1 - Create_func_latfromgeohash : public Create_func_arg1 - Create_func_pointfromgeohash : public Create_func_arg2 Each of these factory classes are registered in func_array in item_create.cc using GEOM_BUILDER. Detailed design =============== Item_func subclasses -------------------- The types and number of input parameters is determined in Item_func_*::fix_fields()/fix_length_and_dec(). Exception conditions are raised if the number of parameters and parameter types don't match the expected function signatures. At evaluation time, in Item_func_*::val_str() or Item_func_*::val_decimal(), exception conditions are raised if the parameter values are invalid. Upper and lower limits for longitude and latitude values are defined in one place for each class. Item_func_geohash ----------------- Subclass of Item_str_func. This class will handle two forms of the same function: <string> = ST_GEOHASH(<longitude>, <latitude>, <maxlength>) <string> = ST_GEOHASH(<point>, <maxlength>) At the current time, points of any SRID is allowed. An exception condition will be raised if the values turn out to be out of range. Item_func_pointfromgeohash -------------------------- Subclass of Item_geometry_func. This class will handle one function: <point> = ST_POINTFROMGEOHASH(<string>, <srid>) At the current time, any SRID is allowed. Item_func_latlongfromgeohash ---------------------------- Subclass of Item_real_func. This class will contain common functions for decoding geohash strings, including decoding geohash into longitude and latitude, and rounding these values according to the length of the input geohash. Item_func_longfromgeohash ------------------------- Subclass of Item_func_latlongfromgeohash. This class will handle one function: <double> = ST_LONGFROMGEOHASH(<string>) The number of digits in the result is defined by the length of the geohash string. Item_func_latfromgeohash ------------------------ Subclass of Item_func_latlongfromgeohash. This class will handle one function: <double> = ST_LATFROMGEOHASH(<string>) The number of digits in the result is defined by the length of the geohash string. Create_func subclasses ---------------------- These are factory classes to create objects of the corresponding Item_func subclasses. Create_func_geohash::create_native() handles 2 and 3 parameter versions of the encoding function and calls the Item_func_geohash constructor with the correct number of parameters. The other factory classes benefit from the parameter list expansion inherited from their base classes.
Copyright (c) 2000, 2024, Oracle Corporation and/or its affiliates. All rights reserved.