Erstellen Sie eine Geografie- / Geometriespalte aus x- und y-Feldern - SQL Server 2008

26

Ich bin neu in SQL Server 2008 und hoffe, dass Sie meine Frage / Notwendigkeit verstehen.

Somit habe ich eine Tabelle, die 3 Felder (Name, Lat und Long) in meiner Datenbank enthält (räumlich). Ich möchte eine Geometrie- / Geografiespalte basierend auf diesen Feldern (Lat und Long) erstellen, aber leider ohne Erfolg.

Meine Frage ist: Wie kann ich das schaffen?

Tudor
quelle

Antworten:

36

Sie können eine berechnete Spalte wie diese hinzufügen

alter table yourTable add geographyColumn as geography::STGeomFromText('POINT('+convert(varchar(20),Long)+' '+convert(varchar(20),Lat)+')',4326)

Ich habe die Konvertierung von lng oder lat hinzugefügt, weil ich Long und Lats als Zahlen speichere.

Jamo
quelle
3
Vielen Dank für Ihre Antworten, ich habe mein Problem mithilfe der folgenden Zeile gelöst: UPDATE yourdatabase SET geometry_column = geometry :: Point ([ColX], [ColY], SRID)
Tudor
3
Ist es möglich einen Trigger dafür anzulegen? Wie wenn Sie Ihre Felder (Spalten X und Y) mit Informationen füllen, wird das oben erwähnte Skript ausgeführt.
Tudor
10

Sieht aus wie Sie die STGeomFromText()oder STPointFromText()SQL-Methode wollen:

DECLARE @g geography;
SET @g = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.ToString();

oder

DECLARE @g geography;
SET @g = geography::STPointFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.ToString();

Erstellen Sie Ihr Feld Geometryoder und füllen Sie dieses GeographyFeld dann mit SQL mit Ihren Lat / Lon-Werten aus.

Chad Cooper
quelle
Was wäre der Unterschied in der Verwendung der folgenden Methode statt ...DECLARE @g geometry; SET @g = geometry::STPointFromText('POINT (100 100)', 0);
awesomo
@awesomo - Ja, du könntest das benutzen, wenn du willst.
Chad Cooper
1

Wenn bei Verwendung der CONVERT(VARCHAR,Anweisung eine Rundung der ursprünglichen Long / Lat-Werte auftritt .

Versuchen Sie es mit:

GeoData = geometry:: STGeomFromText('POINT(' + CAST(CAST(X AS decimal(13, 2)) AS varchar) + ' '  + CAST(CAST(Y AS decimal(13, 2)) AS varchar) + ')', 4326)
Liz
quelle