কীভাবে এসকিউএল সার্ভার জ্যামিতি BLOB থেকে অন্য কিছুতে রূপান্তর করবেন?


14

আমার কাছে তৃতীয় পক্ষের একটি সিএসভি ডেটা ফাইল রয়েছে যা রফতানি হওয়া এসকিউএল সার্ভারের টেবিল। তারা কেবল একটি করে select * from fooএবং ফলাফলটিকে একটি পাঠ্য ফাইলে আউটপুট করে তা প্রেরণ করে।

তাদের টেবিলটিতে জ্যামিতি প্রকারের কলাম রয়েছে, সুতরাং আমার কাঁচা পাঠ্যে আমার কাছে "0xE610000010C47 ..." ইত্যাদি রয়েছে the এই মুহুর্তে আমি এটিকে এনভিচর হিসাবে এসকিউএল সার্ভারে একটি টেবিলে লোড করেছি into

আমি অনুমান করেছিলাম যে আমি আমার শেষদিকে জ্যামিতির ক্ষেত্রে ফিরে যেতে সক্ষম হব, তবে এটি এত সহজ বলে মনে হচ্ছে না। STGeomFromWKBকাজ করে না কারণ এটি আসলে ডাব্লুবিবি নয়। আমি স্ট্রিংটি জ্যামিতি হিসাবে কাস্ট করতে পারি না কারণ এটি অভিযোগ করে যে এটি কোনও ডাব্লুটিটি নয়।

সুতরাং, এসকিউএল সার্ভারে আমি এই মানটি পেতে পারি এমন কোনও উপায় আছে যেন এটি একটি সাধারণ জ্যামিতি বিএলওবি? আমি কি এসকিউএল সার্ভারকে এটির মতো আচরণ করতে বলতে পারি?

আমি এই লিঙ্কটি পেয়েছি যা কমপক্ষে এসকিউএল সার্ভারে কী আছে তা সম্পর্কে আমার প্রশ্নের জবাব দিতে সহায়তা করেছে, তবে আমার সেখানে পুরোপুরি পাইনি: এসকিউএল সার্ভার ২০০৮-এর জ্যামিতির ডেটা ধরণের ফর্ম্যাট কী?


দেখে মনে হচ্ছে ডাব্লুকেবি (সুপরিচিত বাইনারি) এরিরি বর্ণনা রয়েছে ndndoc.esri.com/arcsde/9.1/ জেনারাল_টপিক্স / but তবে ফর্ম্যাটটি ওজিসি (ওপেন জিওপ্যাটিয়াল কনসোর্টিয়াম) আমার মনে হয় বিল্টিন ব্যবহার করা কিছুটা সহজ হবে প্রদত্ত লিঙ্কে বর্ণিত ফাংশন বা একটি তালিকাভুক্ত এমএসডিএন.ইমক্রোসফটি.এইএন / লিবেরি / বিবি 933960.aspx আমি মনে করি যে সমস্যাটি হ'ল আপনি হেক্স স্ট্রিংটি পাঠ্য হিসাবে আমদানি করেছেন এবং আসলে বাইনারি হিসাবে নয় - তবে আমি করতে পারি সেখানে সাহায্য করা আমার এসকিউএল এর ব্যাকএন্ডের সাথে খুব একটা হয়নি। সম্ভবত আপনি সুপার ব্যবহারকারী বা স্ট্যাকেক্সচেঞ্জে ডিবি অ্যাডমিনের কাছে জানতে চাইতে পারেন।
মাইকেল সিলিমসন 21

@ পিটার আপনি কি কখনও এই সমস্যার সমাধান খুঁজে পেয়েছেন?
ডিপিএসএসপিশিয়াল

উত্তর:


9

আপনি যখন এসকিউএল সার্ভারে ডেটা আমদানি করেন, তখন এটি ভারবিনারি (ম্যাক্স) কলামে রাখুন। তারপরে আপনার এটি প্রয়োজনীয় হিসাবে জ্যামিতি বা ভূগোল হিসাবে কাস্ট করতে সক্ষম হওয়া উচিত। আপনার সতর্কতা অবলম্বন করতে হবে যে আমদানির সময় 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

@ মিকিটির উত্তরের উপর ভিত্তি করে, যেহেতু আপনি ইতিমধ্যে ডব্লুবিবিতে বসে আপনার মানগুলির সাথে একটি টেবিল রাখতে যাচ্ছেন (বা আমরা যা বলছি তা), আপনি এসকিএল লিখতে চাইবেন যা সমস্ত রেকর্ডকে জ্যামিতিতে রূপান্তরিত করবে, না করে ভেরিয়েবল ইত্যাদি ঘোষণা করুন ইত্যাদি etc.

সুতরাং আপনি যদি কোনও সাধারণ টেম্প টেবিল দিয়ে শুরু করেন যা ডাব্লুকেবিকে একটি রেকর্ডে প্রতিলিপি করে তোলে, এটি দেখতে এটির মতো হবে:

select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb

এখন আপনি যদি এটি অস্থায়ী টেবিল হিসাবে বিবেচনা করেন এবং এর চারপাশে কিছু এসকিউএল জড়িয়ে রাখেন তবে আপনার সেখানে ডাব্লুবিবি-র একটি কলাম রয়েছে এবং আপনি উপরে বর্ণিত হিসাবে এটি বার্নারিতে রূপান্তর করতে পারেন:

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

যেখানে temp.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

যা জ্যামিতি এবং একটি স্থানিক ফলাফল দেয়:

এখানে চিত্র বর্ণনা লিখুন

সম্পাদনা কোথায় এসআরআইডি ঘোষিত হয়? মিকিটি যেমন উত্তর দিয়েছে, এটি বাইনারিতে রয়েছে এবং আপনি পরীক্ষা করার জন্য আরও 1 টি বর্গ কোয়েরি জিজ্ঞাসা করতে পারেন:

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
এসআরআইডি জ্যামিতি বাইনারি মধ্যে নির্মিত হয়। যে বাইনারি সরবরাহ করা হয় তা ডাব্লুবিবি নয়, তবে জ্যামিতির আসল এসকিউএল সার্ভারি বাইনারি উপস্থাপনা।
মিকিটি

@ মিকটি আহ্ হ্যাঁ! আমি পরীক্ষার জন্য আরও একটি স্নিপেট পোস্ট করব ... ধন্যবাদ !!!
ডিপিএসএসপিশিয়াল

মূল টেবিলটিতে জ্যামিতি কলাম যুক্ত করা এবং জ্যামিতির সাথে সেই কলামটি আপডেট করা কি সম্ভব হবে?
পিটার হর্সবুল মোলার

1
@ পিটারহর্সবিউলমেলার আমার মনে হয় এটি সঠিক পদক্ষেপ ... একবার রূপান্তরিত হওয়ার পরে। আমি এটিতে কাজ করব এবং পরে পোস্ট করব।
DPSSpatial

3

এখানে মূল পোস্টার, যখন আমি সাইনআপ শেষ করার চেষ্টা করেছি তখন এটি মূল পোস্টের জন্য সাইন ইনটিকে লিঙ্ক করে না। যাই হোক ....

সব ধরনের সাহায্য করার জন্য ধন্যবাদ! আমি সক্ষম হয়ে একবার প্রতিটি উত্তর upvote করব এবং আমি যদি এই অ্যাকাউন্টটি কীভাবে যুক্ত করতে পারি এবং মূল উত্তরটি আমি উত্তর চিহ্নিত করতে পারি তবে তা বুঝতে পারি। এছাড়াও, আপনার পয়েন্টারগুলির পরে আমি বিশ্বাস করতে পারি না যে 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

এটি কার্যকর হয়েছিল - আমাদের বিআই বিভাগের একজন সহযোগী স্বতন্ত্রভাবে এই পোস্টটি খুঁজে পেয়েছেন এবং এসকিউএল সার্ভার ইন্টিগ্রেশন সার্ভিসেস (এসএসআইএস) সার্ভারগুলির মধ্যে জ্যামিতিটি পিছনে পিছনে পেতে এটি ব্যবহার করেছেন, যা এসএসআইএসে স্থানীয়ভাবে পাওয়া যায় না !! !
DPSSpatial
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.