SQL Server ज्यामिति BLOB से किसी और चीज़ में कैसे परिवर्तित करें?


14

मेरे पास एक तीसरी पार्टी से एक CSV डेटा फ़ाइल है जो एक निर्यातित SQL सर्वर तालिका है। उन्होंने बस एक किया select * from fooऔर परिणाम को एक पाठ फ़ाइल में भेज दिया और इसे भेज दिया।

उनकी तालिका में ज्यामिति प्रकार का स्तंभ है, इसलिए मेरे कच्चे पाठ में मेरे पास "0xE610000010C47 ...", आदि जैसे कुछ हैं। फिलहाल मैंने इसे SQL सर्वर में एक तालिका में एक nvarchar के रूप में लोड किया है।

मुझे अनुमान था कि मैं अपने अंत में एक ज्यामिति क्षेत्र में वापस रिवर्स करने में सक्षम हो जाएगा, लेकिन यह इतना आसान नहीं लगता है। STGeomFromWKBकाम नहीं करता है क्योंकि यह वास्तव में एक WKB नहीं है। मैं स्ट्रिंग को ज्योमेट्री के रूप में नहीं डाल सकता क्योंकि यह शिकायत करता है कि यह डब्ल्यूकेटी नहीं है।

तो, क्या कोई तरीका है जो मैं SQL सर्वर में इस मान को प्राप्त कर सकता हूं जैसे कि यह एक सामान्य ज्यामिति BLOB है? क्या मैं SQL सर्वर को इसे इस प्रकार मान सकता हूं?

मुझे यह लिंक मिला जिसने एसक्यूएल सर्वर में क्या है के बारे में कम से कम मेरे सवाल का जवाब देने में मदद की, लेकिन मुझे वहां बिल्कुल नहीं मिला: एसक्यूएलवर 2008 के ज्यामिति डेटा प्रकार का प्रारूप क्या है


ऐसा लगता है कि WKB (वेल विन्ड बाइनरी) में Esri डिस्क्रिप्शन edndoc.esri.com/arcsde/9.1/general_topics/… है, लेकिन इसका प्रारूप OGC (ओपन जियोस्पेशियल कंसोर्टियम) है, मुझे लगता है कि बिल्टइन का उपयोग करना थोड़ा आसान होगा दिए गए लिंक या एक सूचीबद्ध msdn.microsoft.com/en-AU/library/bb933960.aspx पर वर्णित कार्य मुझे लगता है कि समस्या यह है कि आपने पाठ के रूप में हेक्स स्ट्रिंग आयात किया है और वास्तव में बाइनरी के रूप में नहीं - लेकिन मैं कर सकता हूं वहाँ मैं एसक्यूएल के बैकएंड के साथ करने के लिए ज्यादा मदद नहीं की है। शायद आप स्टेक्सएक्सचेंज पर सुपर यूजर या डीबी एडमिन से पूछ सकते हैं।
माइकल स्टिम्सन

@ पैटर क्या आपने कभी इनमें से किसी को अपने मुद्दे का हल ढूंढा?
DPSSpatial

जवाबों:


9

जब आप डेटा को SQL सर्वर में आयात करते हैं, तो इसे VARBINARY (MAX) कॉलम में डालें। फिर आपको आवश्यकता के अनुसार इसे ज्यामिति या भूगोल के रूप में कास्ट करने में सक्षम होना चाहिए। आपको सावधान रहने की आवश्यकता होगी कि आयात के दौरान स्ट्रिंग 0xE6 ... नहीं बदला गया है।

एक अन्य विकल्प चयन प्राप्त करने के लिए एक गतिशील क्वेरी करना है। मैंने नीचे कुछ रूपांतरण उदाहरण दिए हैं।

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

@ मिकी के जवाब पर बिल्डिंग, क्योंकि आप अपने मूल्यों के साथ एक टेबल रखने जा रहे हैं, जो पहले से ही WKB में बैठे हैं (या जो भी हम इसे बुला रहे हैं), आप sql लिखना चाहेंगे जो सभी रिकॉर्ड्स को ज्यामिति में बदल देगा, बजाय मैक के एक चर, आदि घोषित करें।

इसलिए यदि आप एक साधारण अस्थायी तालिका के साथ शुरुआत करते हैं जो एक रिकॉर्ड में WKB को दोहराएगा, तो यह इस तरह दिखेगा:

select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb

अब यदि आप इसे एक टेंपरेचर टेबल मानते हैं और इसके चारों ओर कुछ एसक्यूएल लपेटते हैं, तो आपके पास WKB के साथ एक कॉलम है और आप इसे ऊपर बताए अनुसार वैरिएबल में बदल सकते हैं:

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

जहाँ temp.wkb CSV से WKB मान वाले आपकी बड़ी तालिका में कॉलम हो सकता है

अंत में, मिकी द्वारा वर्णित विधि का उपयोग करें और ज्यामिति को ज्यामिति में परिवर्तित करें:

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

जो ज्यामिति और एक स्थानिक परिणाम देता है:

यहाँ छवि विवरण दर्ज करें

EDIT जहां SRID घोषित हो जाता है? जैसा कि मिक्सी ने उत्तर दिया, यह द्विआधारी में है, और आप परीक्षण करने के लिए वहां 1 और sql क्वेरी लपेट सकते हैं:

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

जो पैदावार, और मेरे उदाहरण में सही है, 2877 (कोलोरेडो स्टेट प्लेन):

यहाँ छवि विवरण दर्ज करें


1
SRID ज्यामिति बाइनरी में बनाया गया है। जो बाइनरी आपूर्ति की गई है वह WKB नहीं है, लेकिन ज्यामिति का वास्तविक SQL Servery बाइनरी प्रतिनिधित्व है।
मिकट

@ मिक्की आह हाँ! मैं परीक्षण करने के लिए एक और स्निपेट पोस्ट करूंगा ... धन्यवाद !!!
DPSSpatial

क्या मूल तालिका में ज्यामिति स्तंभ जोड़ना और ज्यामिति के साथ उस स्तंभ को अपडेट करना संभव होगा?
पीटर हॉर्सबेल मॉलर

1
@ पीटरहॉर्बॉलमोरलर मुझे लगता है कि यह सही कदम है ... एक बार जब यह परिवर्तित हो जाता है। मैं उस पर काम करूंगा और बाद में पोस्ट करूंगा।
DPSSpatial

3

मूल पोस्टर यहां, जब मैंने साइनअप को समाप्त करने का प्रयास किया तो यह मूल पोस्ट के लिए साइनइन को लिंक नहीं करता था। वैसे भी ....

पूरी सहायताके लिए शुक्रिया! एक बार जब मैं करने में सक्षम होऊंगा तो मैं प्रत्येक उत्तर को बढ़ा दूंगा और हो सकता है कि मैं यह पता लगा सकूं कि इस खाते को कैसे लिंक किया जाए और मूल मैं एक उत्तर को चिह्नित कर सकता हूं। इसके अलावा, आपके संकेत के बाद मैं विश्वास नहीं कर सकता कि मैं CONVERTइसके बजाय का उपयोग करने से चूक गया CAST। यह बहुत आसान बनाता है।

मुझे लगता है कि मेरी मुख्य समस्या कच्ची द्विआधारी "स्ट्रिंग" हो रही थी जिसका मैं उपयोग कर सकता था। यहाँ एक नमूना है कि मैंने इसे कैसे हल किया:

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

अच्छा लग रहा है!!! यह सब प्रलेखित होने के लिए अच्छा है ... यह एक दिन काम आएगा!
DPSSpatial

यह काम में नहीं आया - हमारे बीआई विभाग में एक साथी ने स्वतंत्र रूप से इस पोस्ट को पाया और इसका उपयोग SQL सर्वर इंटीग्रेशन सर्विसेज (SSIS) को सर्वर के बीच ज्यामिति को आगे और पीछे करने के लिए किया, जो इस बिंदु पर SSIS में मूल रूप से नहीं पाया जाता है !! !
DPSSpatial
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.