Adición de un índice de hash geográfico a una tabla
A continuación, encontrará un ejemplo de una función definida por el usuario (UDF) para la creación de una ID de hash geográfico. En esta UDF se utilizan parámetros de valor numérico para la longitud y la latitud junto con la precisión. En esta función se da por hecho que los valores de longitud y latitud se tomaron según el sistema de coordenadas WGS 84.
Nota:
- Para crear la función, asegúrese de que cuenta con los permisos para crear UDF en la base de datos.
- Asegúrese de proporcionar un nombre único a la función y de que no exista otra con el mismo nombre.
CREATE FUNCTION [dbo].[createGeohash] (@LONGITUDE NUMERIC(10, 6),
@LATITUDE NUMERIC(10, 6), @PRECISION INT) RETURNS VARCHAR(12) AS
BEGIN
DECLARE @GEOHASH_CHARSET CHAR(32)
SET @GEOHASH_CHARSET = '0123456789bcdefghjkmnpqrstuvwxyz'
DECLARE @MIN_LAT AS NUMERIC(12,8) = -90.0
DECLARE @MAX_LAT AS NUMERIC(12,8) = 90.0
DECLARE @MIN_LNG AS NUMERIC(12,8) = -180.0
DECLARE @MAX_LNG AS NUMERIC(12,8) = 180.0
DECLARE @IDX AS INT = 0
DECLARE @BIT AS INT = 0
DECLARE @GEOHASH AS VARCHAR(12)
DECLARE @GEOHASH_SUFFIX AS CHAR(1)
DECLARE @MID_POINT AS NUMERIC(12,8)
DECLARE @LOOPCOUNTER AS INT = 0
DECLARE @EVEN AS BIT = 1
SET @LOOPCOUNTER = 0
WHILE (@LOOPCOUNTER < @PRECISION)
BEGIN
IF(@EVEN > 0)
BEGIN
SET @MID_POINT = (@MIN_LNG + @MAX_LNG) / 2
IF(@LONGITUDE >= @MID_POINT)
BEGIN
SET @MIN_LNG = @MID_POINT
SET @IDX = (@IDX * 2) + 1
END
ELSE
BEGIN
SET @MAX_LNG = @MID_POINT
SET @IDX = (@IDX * 2)
END
END
ELSE
BEGIN
SET @MID_POINT = (@MIN_LAT + @MAX_LAT) / 2
IF(@LATITUDE >= @MID_POINT)
BEGIN
SET @MIN_LAT = @MID_POINT
SET @IDX = (@IDX * 2) + 1
END
ELSE
BEGIN
SET @MAX_LAT = @MID_POINT
SET @IDX = (@IDX * 2)
END
END
SET @EVEN = ~@EVEN
SET @BIT = @BIT + 1
IF(@BIT = 5)
BEGIN
SET @GEOHASH_SUFFIX = SubString(@GEOHASH_CHARSET, @IDX + 1, 1)
SET @GEOHASH = CONCAT(@GEOHASH, @GEOHASH_SUFFIX)
SET @LOOPCOUNTER = @LOOPCOUNTER + 1
SET @BIT = 0
SET @IDX = 0
END
END
RETURN @GEOHASH
END
Consultas para ACTUALIZAR la tabla de la base de datos con el hash geográfico
La tabla debe contar con una columna de tipo Varchar para almacenar la ID de hash geográfico. Con el propósito de garantizar que la actualización funcione correctamente cuando existan valores nulos, utilice las cláusula WHERE para buscar la instancia de “no es nulo”.Ejemplo de consulta para una tabla con una geometría de punto
UPDATE
dbo.POI SET GEOHASH = dbo.createGeohash(CAST(SP_GEOMETRY.STX as numeric(16,8)),
CAST(SP_GEOMETRY.STY as numeric(16,8)), 12);
Ejemplo de consulta para una tabla con columnas X (longitud) e Y (latitud)
UPDATE dbo.POI SET GEOHASH =
dbo.createGeohash(LONGITUDE, LATITUDE, 12);