Làm cách nào để chuyển đổi từ SQL Server hình học BLOB sang thứ khác?


14

Tôi có tệp dữ liệu CSV từ bên thứ 3 là bảng SQL Server đã xuất. Họ chỉ đơn giản là làm select * from foovà xuất kết quả ra một tệp văn bản và gửi nó đi.

Trong bảng của họ là cột kiểu Hình học, vì vậy trong văn bản thô của tôi, tôi có một cái gì đó như "0xE610000010C47 ...", v.v. Hiện tại tôi đã tải nó vào một bảng trong SQL Server dưới dạng một nvarchar.

Tôi đã dự đoán rằng tôi sẽ có thể quay ngược trở lại vào trường Hình học, nhưng điều đó dường như không dễ dàng gì. STGeomFromWKBkhông hoạt động vì nó không thực sự là WKB. Tôi không thể sử dụng chuỗi dưới dạng Hình học vì nó phàn nàn rằng đó không phải là WKT.

Vì vậy, có cách nào tôi có thể nhận giá trị này vào SQL Server như thể nó là một hình học BLOB bình thường không? Tôi có thể bảo SQL Server xử lý như vậy không?

Tôi đã tìm thấy liên kết này giúp ít nhất trả lời câu hỏi của tôi về SQL Server là gì, nhưng không hiểu được tôi ở đâu: định dạng kiểu dữ liệu Hình học của SQLServer 2008 là gì


Có vẻ như WKB (Được biết đến nhị phân) có một mô tả Esri edndoc.esri.com/arcsde/9.1/general_topics/, nhưng định dạng là OGC (Open Geospatial Consortium) các chức năng như được mô tả trên liên kết được cung cấp hoặc một danh sách msdn.microsoft.com/en-AU/l Library / bb933960.aspx Tôi nghĩ rằng vấn đề nằm ở chỗ bạn đã nhập một chuỗi hex dưới dạng văn bản và không thực sự là nhị phân - nhưng tôi có thể Tôi không có nhiều việc phải làm với phần phụ trợ của SQL. Có lẽ bạn có thể hỏi về Super User hoặc DB Admin trên stackexchange.
Michael Promotionson

@Peter bạn đã bao giờ tìm thấy bất kỳ giải pháp nào trong số này cho vấn đề của mình chưa?
DPSSpatial

Câu trả lời:


9

Khi bạn nhập dữ liệu vào SQL Server, hãy đặt dữ liệu đó vào cột VARBINARY (MAX). Sau đó, bạn có thể CAST này dưới dạng Hình học hoặc Địa lý theo yêu cầu. Bạn sẽ cần cẩn thận rằng chuỗi 0xE6 ... không bị thay đổi trong quá trình nhập.

Một tùy chọn khác là thực hiện một truy vấn động để có được lựa chọn. Tôi đặt một vài ví dụ chuyển đổi dưới đây.

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

Dựa trên câu trả lời của @ MickyT, vì bạn sẽ có một bảng với các giá trị của bạn đã có trong WKB (hoặc bất cứ điều gì chúng tôi gọi nó), bạn sẽ muốn viết sql sẽ chuyển đổi tất cả các bản ghi thành hình học, thay vì phải khai báo một biến, v.v.

Vì vậy, nếu bạn bắt đầu với một bảng tạm thời đơn giản sẽ sao chép WKB trong một bản ghi, nó sẽ trông như thế này:

select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb

Bây giờ nếu bạn coi đó là một bảng tạm thời và bao bọc một số SQL xung quanh nó, bạn có một cột có WKB trong đó và bạn có thể chuyển đổi nó thành varbinary như được đề xuất ở trên:

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

trong đó temp.wkb có thể là cột trong bảng lớn hơn của bạn chứa các giá trị WKB từ CSV

Cuối cùng, sử dụng phương pháp được mô tả bởi MickyT và chuyển đổi phương sai sang hình học:

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

Trả về hình học và kết quả không gian:

nhập mô tả hình ảnh ở đây

EDIT nơi SRID được khai báo? Như MickyT đã trả lời, nó ở dạng nhị phân và bạn có thể bọc thêm 1 truy vấn sql quanh đó để kiểm tra:

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

mang lại, và đúng trong ví dụ của tôi, 2877 (mặt phẳng trạng thái colorado):

nhập mô tả hình ảnh ở đây


1
SRID được tích hợp vào nhị phân Hình học. Nhị phân được cung cấp không phải là WKB, mà là biểu diễn nhị phân SQL Servery thực tế của Hình học.
MickyT

@MickyT ah vâng! Tôi sẽ đăng thêm một đoạn để kiểm tra ... Cảm ơn bạn !!!
DPSSpatial

Có thể thêm cột Hình học vào bảng gốc và cập nhật cột đó bằng Hình học không?
Peter Horsbøll Møller

1
@ PeterHorsbøllMøller Tôi nghĩ rằng đó là bước đi đúng đắn ... một khi nó được chuyển đổi. Tôi sẽ làm việc trên đó và đăng sau.
DPSSpatial

3

Áp phích gốc ở đây, khi tôi cố gắng hoàn thành đăng ký, nó không liên kết được thông tin đăng nhập cho bài đăng gốc. Dù sao....

Cảm ơn vì sự giúp đỡ! Tôi sẽ đưa ra từng câu trả lời một khi tôi có thể và có lẽ nếu tôi có thể tìm ra cách liên kết tài khoản này và tài khoản gốc tôi có thể đánh dấu một câu trả lời. Ngoài ra, sau khi con trỏ của bạn, tôi không thể tin rằng tôi đã bỏ lỡ sử dụng CONVERTthay vì CAST. Nó làm cho nó dễ dàng hơn nhiều.

Tôi nghĩ vấn đề chính của tôi là lấy "chuỗi" nhị phân thô thành thứ gì đó tôi có thể sử dụng. Đây là một ví dụ về cách tôi giải quyết nó:

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

có vẻ tốt !!! Thật tốt khi có tất cả những tài liệu này ... nó sẽ có ích vào một ngày nào đó!
DPSSpatial

điều này rất hữu ích - một đồng nghiệp trong bộ phận BI của chúng tôi đã độc lập tìm thấy bài đăng này và sử dụng nó để nhận Dịch vụ tích hợp máy chủ SQL (SSIS) để truyền hình học qua lại giữa các máy chủ, tại thời điểm này không được tìm thấy trong SSIS !! !
DPSSpatial
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.