Wie konvertiere ich ein SQL Server-Geometrie-BLOB in etwas anderes?

14

Ich habe eine CSV-Datendatei von einem Drittanbieter, bei der es sich um eine exportierte SQL Server-Tabelle handelt. Sie haben einfach a gemacht select * from foound das Ergebnis in eine Textdatei ausgegeben und gesendet.

In ihrer Tabelle befindet sich eine Spalte vom Typ Geometrie, daher habe ich in meinem Rohtext so etwas wie "0xE610000010C47 ..." usw. Im Moment habe ich sie als nvarchar in eine Tabelle in SQL Server geladen.

Ich hatte erwartet, dass ich an meinem Ende wieder in ein Geometriefeld zurückkehren könnte, aber das scheint nicht so einfach zu sein. STGeomFromWKBfunktioniert nicht, weil es eigentlich kein WKB ist. Ich kann die Zeichenfolge nicht als Geometrie umwandeln, da sie sich darüber beschwert, dass es sich nicht um eine WKT handelt.

Gibt es eine Möglichkeit, diesen Wert in SQL Server zu übernehmen, als wäre es ein normales Geometrie-BLOB? Kann ich SQL Server anweisen, es als solches zu behandeln?

Ich habe diesen Link gefunden, der zumindest dazu beigetragen hat, meine Frage zu SQL Server zu beantworten, mich aber nicht ganz dorthin gebracht hat: Was ist das Format des Geometriedatentyps von SQLServer 2008?

Peter
quelle
Es sieht so aus, als ob es in WKB (Well Known Binary) eine Esri-Beschreibung gibt. Edndoc.esri.com/arcsde/9.1/general_topics/…, aber das Format ist OGC (Open Geospatial Consortium). Ich würde denken, es wäre etwas einfacher, das eingebaute zu verwenden funktioniert wie auf dem bereitgestellten Link beschrieben oder in einer aufgelisteten msdn.microsoft.com/en-AU/library/bb933960.aspx Ich denke, das Problem liegt darin, dass Sie eine Hex-Zeichenfolge als Text und nicht als Binär importiert haben - aber ich kann Ich helfe dort nicht viel mit dem Backend von SQL zu tun. Vielleicht könnten Sie beim Stackexchange nach Super User oder DB Admin fragen.
Michael Stimson
@Peter Haben Sie jemals eine Lösung für Ihr Problem gefunden?
DPSSpatial

Antworten:

9

Wenn Sie die Daten in SQL Server importieren, fügen Sie sie in eine VARBINARY (MAX) -Spalte ein. Sie sollten dies dann nach Bedarf als Geometrie oder Geografie CASTEN können. Sie müssen darauf achten, dass die Zeichenfolge 0xE6 ... während des Imports nicht geändert wird.

Eine andere Möglichkeit besteht darin, eine dynamische Abfrage durchzuführen, um die Auswahl zu erhalten. Im Folgenden sind einige Konvertierungsbeispiele aufgeführt.

-- As a varchar and binary
DECLARE @NV AS NVARCHAR(MAX) = '0xE610000001040E0000002AA57BA76F5446C027B8FD971024654007517714795446C00C42473D1624654094CFCDE3795446C0D3F576B91624654068507E9C7A5446C0D7BE805E18246540F2FC444A7C5446C0E93DDF6019246540B4CA4C697D5446C0D5DF5C0D1A2465401A0923AC7C5446C08183DE3F1A2465407599E1907B5446C0E2A8818B1A24654058B4805A7A5446C0A70261DE1A24654089729F5C775446C072080BDD1B2465401AAC24A8745446C057CB10FE1C2465403D16A5446E5446C05A20FEE21A246540658BA4DD685446C00907FFA3172465402AA57BA76F5446C027B8FD971024654001000000020000000001000000FFFFFFFF0000000003' 
DECLARE @NB AS VARBINARY(MAX) = 0xE610000001040E0000002AA57BA76F5446C027B8FD971024654007517714795446C00C42473D1624654094CFCDE3795446C0D3F576B91624654068507E9C7A5446C0D7BE805E18246540F2FC444A7C5446C0E93DDF6019246540B4CA4C697D5446C0D5DF5C0D1A2465401A0923AC7C5446C08183DE3F1A2465407599E1907B5446C0E2A8818B1A24654058B4805A7A5446C0A70261DE1A24654089729F5C775446C072080BDD1B2465401AAC24A8745446C057CB10FE1C2465403D16A5446E5446C05A20FEE21A246540658BA4DD685446C00907FFA3172465402AA57BA76F5446C027B8FD971024654001000000020000000001000000FFFFFFFF0000000003

-- Failing conversions
SELECT CAST(@NV AS Geometry)
SELECT CAST(CAST(@NV AS VARBINARY(MAX)) AS Geometry)
-- Correct conversion
SELECT CAST(@NB AS Geometry)
EXEC('SELECT CAST(' + @NV + ' AS Geometry)')
MickyT
quelle
6

Aufbauend auf der Antwort von @ MickyT möchten Sie SQL schreiben, das alle Datensätze in Geometrie konvertiert, anstatt dies zu tun, da Sie eine Tabelle mit Ihren Werten bereits in WKB haben (oder wie auch immer wir es nennen) Deklarieren Sie eine Variable usw. usw.

Wenn Sie also mit einer einfachen temporären Tabelle beginnen, die die WKB in einem Datensatz repliziert, sieht sie folgendermaßen aus:

select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb

Wenn Sie dies nun als temporäre Tabelle behandeln und etwas SQL darum wickeln, haben Sie eine Spalte mit dem WKB darin und können diese wie oben vorgeschlagen in varbinary konvertieren:

select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp

wo temp.wkb kann die Spalte in der Tabelle größer sein , um die WKB - Werte aus der CSV - enthaltenden

Verwenden Sie abschließend die von MickyT beschriebene Methode und konvertieren Sie die Varbinary in Geometrie:

select 
cast(geomconvert.geombinary as geometry) as geom
 from (
select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp
) as geomconvert

Was Geometrie und ein räumliches Ergebnis zurückgibt:

Geben Sie hier die Bildbeschreibung ein

BEARBEITEN Wo wird die SRID deklariert? Wie MickyT antwortete, ist es in der Binärdatei, und Sie können dort eine weitere SQL-Abfrage umschließen, um zu testen:

select top 1 getsrid.geom.STSrid from (

select 
cast(geomconvert.geombinary as geometry) as geom
 from (
select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp
) as geomconvert

) as getsrid

was ergibt und in meinem Beispiel 2877 (Colorado State Plane) richtig ist:

Geben Sie hier die Bildbeschreibung ein

DPSSpatial
quelle
1
Die SRID ist in die Geometrie-Binärdatei integriert. Die mitgelieferte Binärdatei ist nicht WKB, sondern die tatsächliche binäre SQL Servery-Darstellung der Geometrie.
MickyT
@ MickyT ah ja! Ich werde noch einen Ausschnitt zum Testen posten ... Danke !!!
DPSSpatial
Wäre es möglich, der ursprünglichen Tabelle eine Geometrie-Spalte hinzuzufügen und diese Spalte mit der Geometrie zu aktualisieren?
Peter Horsbøll Møller
1
@ PeterHorsbøllMøller Ich denke, das ist der richtige Schritt ... sobald es konvertiert ist. Ich werde daran arbeiten und später posten.
DPSSpatial
3

Original-Poster hier, als ich versuchte, die Anmeldung abzuschließen, wurde die Anmeldung für den Original-Beitrag nicht verknüpft. Wie auch immer....

Danke für all die Hilfe! Ich werde jede Antwort positiv bewerten, sobald ich dazu in der Lage bin. Wenn ich herausfinden kann, wie dieses Konto und das ursprüngliche Konto verknüpft werden können, kann ich eine Antwort markieren. Auch nach Ihren Hinweisen kann ich nicht glauben, dass ich es verpasst habe, CONVERTstattdessen zu verwenden CAST. Es macht es viel einfacher.

Ich denke, mein Hauptproblem war es, den rohen binären "String" auf etwas zu bringen, das ich verwenden konnte. Hier ist ein Beispiel, wie ich es gelöst habe:

DECLARE @data TABLE (
  ID nvarchar(1024),
  ImportedGeometry nvarchar(max),
  FinalGeometry geometry
  )

  INSERT INTO @data (ID, ImportedGeometry) values ('1', '0xE6100000010C4703780B24B855C061C3D32B65093540')
  INSERT INTO @data (ID, ImportedGeometry) values ('2', '0xE6100000010C96438B6CE7D359C0BD5296218E853440')

select 
d.ID,
d.ImportedGeometry,
CONVERT(varbinary(max), d.ImportedGeometry, 1) as ConvertedGeometryBin,
(cast(CONVERT(varbinary(max), d.ImportedGeometry, 1) as geometry)) as FinalGeometry
from @data d

UPDATE @data
SET FinalGeometry = (cast(CONVERT(varbinary(max), ImportedGeometry, 1) as geometry))

select 
d.ID,
d.FinalGeometry,
d.FinalGeometry.STAsText(),
d.FinalGeometry.STSrid
from @data d
user57679
quelle
sieht gut aus!!! Gut, dass das alles dokumentiert ist ... es wird eines Tages nützlich sein!
DPSSpatial
Dies hat sich als nützlich erwiesen. Ein Mitarbeiter in unserer BI-Abteilung hat diesen Beitrag unabhängig gefunden und ihn verwendet, um SQL Server Integration Services (SSIS) dazu zu bringen, Geometrie zwischen Servern hin und her zu übertragen, was derzeit in SSIS nicht nativ zu finden ist. !
DPSSpatial