Nasıl SQL Server geometri BLOB başka bir şeye dönüştürmek için?


14

Dışa aktarılan bir SQL Server tablosu olan bir üçüncü taraftan CSV veri dosyası var. Sadece select * from foobir metin çıktılar ve bir çıktı çıktı ve gönderdi.

Tablolarında Geometry tipi sütun var, bu yüzden ham metnimde "0xE610000010C47 ..." gibi bir şey var. Şu anda SQL Server'da bir nvarchar olarak bir tabloya yükledim.

Sonunda bir Geometri alanına geri dönebileceğimi tahmin ettim, ama bu o kadar kolay görünmüyor. STGeomFromWKBçalışmıyor çünkü bu aslında bir WKB değil. Bu bir WKT olmadığını şikayet çünkü Geometri olarak dize döküm olamaz.

Yani, bu değeri normal bir Geometri BLOB sanki SQL Server içine alabilirim herhangi bir yolu var mı? SQL Server'a bu şekilde davranmasını söyleyebilir miyim?

En azından SQL Server'da ne olduğu ile ilgili soruma cevap veren bu bağlantıyı buldum, ancak beni oraya kadar getirmedim: SQLServer 2008'in Geometri veri türünün formatı nedir


Görünüşe göre WKB (Bilinen İkili) bir Esri açıklaması var edndoc.esri.com/arcsde/9.1/general_topics/… ama biçim OGC (Açık Geospatial Konsorsiyumu) ​​Ben yerleşik kullanmak biraz daha kolay olacağını düşünüyorum Sağlanan bağlantıda veya listelenen bir listede açıklanan işlevler msdn.microsoft.com/en-AU/library/bb933960.aspx Sorun, bir hex dizesini metin olarak değil de ikili olarak içe aktarmanızda yatıyor - ancak orada yardım değil SQL arka ucuyla ilgisi yoktu. Belki Stackexchange üzerinde Süper Kullanıcı veya DB Yönetici isteyebilirsiniz.
Michael Stimson

@Peter Hiç sorununuz için bir çözüm buldunuz mu?
16:50

Yanıtlar:


9

Verileri SQL Server'a aldığınızda, bir VARBINARY (MAX) sütununa yerleştirin. Daha sonra bunu gerektiği gibi bir Geometri veya Coğrafya olarak CAST edebilmelisiniz. İçe aktarma sırasında 0xE6 ... dizesinin değişmemesine dikkat etmeniz gerekir.

Başka bir seçenek, seçimi almak için dinamik bir sorgu yapmaktır. Aşağıda birkaç dönüşüm örneği koydum.

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

6

@ MickyT'nin cevabına dayanarak, değerlerinizin zaten WKB'de (ya da onu çağırdığımız her ne olursa olsun) oturduğu bir tablonuz olacağından, tüm kayıtları geometriye dönüştürecek sql yazmak istersiniz. bir değişken vb.

Bu nedenle, bir kayıtta WKB'yi çoğaltacak basit bir geçici tabloyla başlarsanız, şöyle görünür:

select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb

Şimdi bunu bir geçici tablo olarak ele alıyorsanız ve etrafına biraz SQL sarıyorsanız, orada WKB ile bir sütununuz var ve bunu yukarıda önerildiği gibi varbinary'ye dönüştürebilirsiniz:

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

Burada temp.wkb , daha büyük tablonuzda CSV'den WKB değerlerini içeren sütun olabilir

Son olarak, MickyT tarafından açıklanan yöntemi kullanın ve varbineri geometriye dönüştürün:

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

Geometri ve uzamsal bir sonuç veren:

resim açıklamasını buraya girin

EDIT SRID nerede ilan edilir? MickyT'nin yanıtladığı gibi, ikili dosyadadır ve test etmek için 1 sql sorgusunun etrafına sarılabilirsiniz:

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

Bu, benim örneğimde, 2877 (Colorado devlet uçağı) verir ve doğrudur:

resim açıklamasını buraya girin


1
SRID, Geometri ikili dosyasında yerleşik olarak bulunur. Sağlanan ikili WKB değil, Geometri'nin gerçek SQL Servery ikili temsilidir.
MickyT

@MickyT ah evet! Test etmek için bir snippet daha yayınlayacağım ... Teşekkürler !!!
DPSSpatial

Orijinal tabloya bir Geometri sütunu eklemek ve bu sütunu Geometri ile güncellemek mümkün müdür?
Peter Horsbøll Møller

1
@ PeterHorsbøllMøller Sanırım bu doğru hamle ... dönüştürüldükten sonra. Bunun üzerinde çalışacağım ve daha sonra yayınlayacağım.
DPSSpatial

3

Orijinal poster burada, kayıt işlemini bitirmeye çalıştığımda, orijinal gönderi için oturum açmayı bağlamadı. Neyse ....

Tüm yardımlarınız için teşekkürler! Her bir cevabımı onaylayacağım ve belki de bu hesabı ve orijinali nasıl bağlayacağımı anlayabilirsem bir cevabı işaretleyebilirim. Ayrıca, işaretçilerinizden sonra kullanmak CONVERTyerine özlediğime inanamıyorum CAST. Çok daha kolay.

Benim ana sorun ham ikili "dize" kullanabileceğim bir şey elde etmek olduğunu düşünüyorum. İşte nasıl çözdüğümün bir örneği:

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

iyi görünüyor!!! Tüm bunların belgelenmesi iyi ... bir gün işinize yarayacak!
DPSSpatial

bu kullanışlı oldu - BI departmanımızdaki bir adam bağımsız olarak bu gönderiyi buldu ve bu noktada SSIS'de doğal olarak bulunmayan sunucular arasında geometriyi ileri geri geçirmek için SQL Server Entegrasyon Hizmetlerini (SSIS) almak için kullandı! !
DPSSpatial
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.