Adición de un índice de hash geográfico a una tabla

Para activar la agrupación en clústeres (tablas agregadas) y facilitar la visualización de datos grandes, genere un índice geohash en la geometría (o XY).

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);