Bagaimana mengkonversi dari SQL Server BLOB geometri ke sesuatu yang lain?

14

Saya memiliki file data CSV dari pihak ke-3 yang merupakan tabel SQL Server yang diekspor. Mereka hanya melakukan select * from foodan mengeluarkan hasilnya ke file teks dan mengirimkannya.

Dalam tabel mereka adalah kolom tipe Geometri, jadi dalam teks mentah saya, saya memiliki sesuatu seperti "0xE610000010C47 ...", dll. Saat ini saya telah memuatnya ke dalam tabel di SQL Server sebagai nvarchar.

Saya mengantisipasi saya akan dapat membalikkan kembali ke bidang Geometri di ujung saya, tetapi itu tampaknya tidak begitu mudah. STGeomFromWKBtidak berfungsi karena itu sebenarnya bukan WKB. Saya tidak dapat menampilkan string sebagai Geometri karena mengeluh bahwa itu bukan WKT.

Jadi, apakah ada cara saya bisa mendapatkan nilai ini ke dalam SQL Server seolah-olah itu adalah BLOB Geometri normal? Dapatkah saya memberi tahu SQL Server untuk memperlakukannya seperti itu?

Saya menemukan tautan ini yang membantu setidaknya menjawab pertanyaan saya tentang apa yang ada di SQL Server, tetapi tidak membuat saya sepenuhnya: apa format tipe data Geometri dari SQLServer 2008

Peter
sumber
Sepertinya WKB (Binary Dikenal Baik) ada deskripsi Esri edndoc.esri.com/arcsde/9.1/general_topics/… tetapi formatnya adalah OGC (Open Geospatial Consortium) Saya akan berpikir akan sedikit lebih mudah untuk menggunakan builtin fungsi seperti yang dijelaskan pada tautan yang disediakan atau satu yang terdaftar msdn.microsoft.com/en-AU/library/bb933960.aspx Saya pikir masalahnya terletak pada Anda telah mengimpor string hex sebagai teks dan tidak benar-benar sebagai biner - tapi saya bisa dapat membantu di sana saya belum banyak melakukan dengan backend dari SQL. Mungkin Anda bisa bertanya pada Super User atau DB Admin di stackexchange.
Michael Stimson
@ Peter apakah Anda pernah menemukan solusi untuk masalah Anda?
DPSSpatial

Jawaban:

9

Saat Anda mengimpor data ke SQL Server, masukkan ke dalam kolom VARBINARY (MAX). Anda kemudian dapat CAST ini sebagai Geometri atau Geografi sesuai kebutuhan. Anda harus berhati-hati agar string 0xE6 ... tidak berubah selama impor.

Pilihan lain adalah melakukan kueri dinamis untuk mendapatkan pilihan. Saya menaruh beberapa contoh konversi di bawah ini.

-- 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
sumber
6

Membangun jawaban @ MickyT, karena Anda akan memiliki tabel dengan nilai-nilai Anda sudah ada di WKB (atau apa pun sebutan kami), Anda ingin menulis sql yang akan mengubah semua catatan menjadi geometri, daripada harus mendeklarasikan variabel, dll. dll.

Jadi jika Anda memulai dengan tabel temp sederhana yang akan mereplikasi WKB dalam satu catatan, itu akan terlihat seperti ini:

select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb

Sekarang jika Anda menganggap itu sebagai temp table dan membungkus beberapa SQL di sekitarnya, Anda memiliki kolom dengan WKB di sana dan Anda dapat mengubahnya menjadi varbinary seperti yang disarankan di atas:

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

di mana temp.wkb bisa menjadi kolom di tabel Anda yang lebih besar yang berisi nilai WKB dari CSV

Akhirnya, gunakan metode yang dijelaskan oleh MickyT dan ubah varbinary menjadi geometri:

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

Yang mengembalikan geometri dan hasil spasial:

masukkan deskripsi gambar di sini

EDIT di mana SRID dideklarasikan? Seperti yang dijawab MickyT, itu ada dalam biner, dan Anda dapat membungkus 1 kueri sql lagi di sana untuk diuji:

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

yang menghasilkan, dan benar dalam contoh saya, 2877 (colorado state plane):

masukkan deskripsi gambar di sini

DPSSpatial
sumber
1
SRID dibangun ke dalam biner Geometri. Biner yang disediakan bukan WKB, tetapi representasi biner aktual SQL Servery dari Geometri.
MickyT
@MickyT ah ya! Saya akan memposting satu cuplikan lagi untuk menguji ... Terima kasih !!!
DPSSpatial
Apakah mungkin untuk menambahkan kolom Geometri ke tabel asli dan memperbarui kolom itu dengan Geometri?
Peter Horsbøll Moller
1
@ PeterHorsbøllMøller Saya pikir itu langkah yang tepat ... setelah dikonversi. Saya akan mengerjakannya dan memposting nanti.
DPSSpatial
3

Poster asli di sini, ketika saya mencoba menyelesaikan pendaftaran, itu tidak menautkan masuk ke pos asli. Bagaimanapun....

Terima kasih atas semua bantuannya! Saya akan memutakhirkan setiap jawaban begitu saya bisa dan mungkin jika saya bisa mengetahui cara menautkan akun ini dan yang asli saya bisa menandai jawaban. Juga, setelah petunjuk Anda, saya tidak percaya saya ketinggalan menggunakan CONVERTbukan CAST. Itu membuatnya jauh lebih mudah.

Saya pikir masalah utama saya adalah mendapatkan "string" biner mentah untuk sesuatu yang bisa saya gunakan. Berikut ini contoh bagaimana saya menyelesaikannya:

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
pengguna57679
sumber
kelihatan bagus!!! Bagus untuk mendokumentasikan semua ini ... suatu hari akan berguna!
DPSSpatial
ini memang berguna - seorang rekan di departemen BI kami secara independen menemukan posting ini dan menggunakannya untuk mendapatkan SQL Server Integration Services (SSIS) untuk meneruskan geometri bolak-balik antara server, yang pada saat ini tidak ditemukan secara native di SSIS !! !
DPSSpatial