Hinzufügen eines Geohash-Index zu einer Tabelle

Um Clustering zu aktivieren (aggregierte Tabellen) und die Visualisierung großer Datenmengen zu erleichtern, generieren Sie den Geohash-Index der Geometrie (oder von XY).

Unten finden Sie ein Beispiel für eine benutzerdefinierte Funktion (User Defined Function, UDF) zur Erstellung einer Geohash-ID. Diese UDF akzeptiert Parameter mit numerischen Werten für Längengrad und Breitengrad sowie für Genauigkeit. Diese Funktion setzt für Längengrad- und Breitengradwerte ein WGS 84-Koordinatensystem voraus.

Anmerkung:
  • Vergewissern Sie sich vor dem Erstellen der Funktion, dass Sie auf der Datenbank über die erforderlichen Rechte zum Erstellen einer UDF verfügen.
  • Achten Sie darauf, die Funktion eindeutig zu benennen und keinen Namen einer bereits vorhandenen Funktion zu verwenden.
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

Abfragen zur AKTUALISIERUNG der Datenbanktabelle mit Geohash

Zur Speicherung der Geohash-ID ist in der Tabelle eine Spalte des Typs „Varchar“ erforderlich. Um sicherzustellen, dass die Aktualisierung bei vorhandenen Nullwerten korrekt abläuft, verwenden Sie die WHERE-Klausel, um nach „nicht Null“ zu prüfen.

Beispielabfrage für eine Tabelle mit einer Punktgeometrie

UPDATE dbo.POI SET GEOHASH = dbo.createGeohash(CAST(SP_GEOMETRY.STX as numeric(16,8)), CAST(SP_GEOMETRY.STY as numeric(16,8)), 12);

Beispielabfrage für eine Tabelle mit X- (Längengrad) und Y-Spalten (Breitengrad)

UPDATE dbo.POI SET GEOHASH = dbo.createGeohash(LONGITUDE, LATITUDE, 12);