Hinzufügen eines Geohash-Index zu einer Tabelle
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);