SQL 2008 के लिए बहुभुज "सौम्यता" बदलें (बहुभुज शीर्ष क्रम को उल्टा करें)


11

मैं कुछ सौ आकार (है polygonऔर multipolygonरों) अंक है कि मैं एसक्यूएल 2008 में प्राप्त करने के लिए कोशिश कर रहा हूँ की हजारों से मिलकर प्रत्येक।

दुर्भाग्य से, जिन आकृतियों को मैंने आयात करने की कोशिश की है, वे "राइट-हैंडेड" हैं (प्रत्येक की परिधि इसमें शामिल बिंदुओं के आसपास दक्षिणावर्त खींची गई है)। SQL सर्वर "बाएं-हाथ" आकृतियों (इंटीरियर के चारों ओर एंटी-क्लॉकवाइज़) को मानता है, कम से कम geographyप्रकारों के लिए। इसका मतलब है कि एसक्यूएल मानता है कि मैं अपने आकार को छोड़कर पूरी पृथ्वी का चयन करने की कोशिश कर रहा हूं । कुछ लोग इसे "अंदर-बाहर" आकृतियों के रूप में वर्णित करते हैं।

से MSDN , जो frustratingly कहना नहीं है जो अंगूठी उन्मुखीकरण से एक का उपयोग करने के लिए है:

यदि हम geographyस्थानिक उदाहरण को संग्रहीत करने के लिए डेटा प्रकार का उपयोग करते हैं , तो हमें रिंग के उन्मुखीकरण को निर्दिष्ट करना चाहिए और उदाहरण के स्थान का सटीक वर्णन करना चाहिए।

यदि आप SQL 2008 में गलत रिंग ओरिएंटेशन का उपयोग करते हैं, तो यह निम्न त्रुटि के साथ क्रैश होता है (जोर मेरा):

उपयोगकर्ता परिभाषित रूटीन या "भूगोल" को निष्पादित करने के दौरान .NET .NET त्रुटि हुई: Microsoft.SqlServer.Types.GLArgumentException: 24205: निर्दिष्ट इनपुट एक मान्य भूगोल उदाहरण का प्रतिनिधित्व नहीं करता है क्योंकि यह एक गोलार्ध से अधिक है। प्रत्येक भूगोल उदाहरण एक गोलार्द्ध के अंदर फिट होना चाहिए। इस त्रुटि का एक सामान्य कारण यह है कि बहुभुज में गलत रिंग ओरिएंटेशन है।

ठीक काम geometryकरने के बजाय आकृतियों को आयात करना geography, लेकिन geographyअगर मैं कर सकता हूं तो मैं इसका उपयोग करना चाहूंगा ।

SQL 2012 में, इस समस्या को ठीक करने के लिए यह काफी तुच्छ प्रतीत होता है, लेकिन मैं 2008 से बंधा हुआ हूं।

मुझे आकृतियों को कैसे बदलना चाहिए?


1
+1 महान प्रश्न ... क्या आपके पास एक लिंक है जहां यह कहता है कि एसक्यूएल सर्वर बाएं हाथ के आकार को मानता है?
किर्क क्यूकेन्डल

@ किर्क धन्यवाद। मुझे आधिकारिक दस्तावेज खोजने में परेशानी हो रही है, लेकिन मैं MSDN से लिंक कर सकता हूं जहां यह "रिंग ओरिएंटेशन" मामलों को कहता है (हालांकि यह नहीं कहता है कि किस तरीके का उपयोग करना है)। मैं भी एक त्रुटि में डाल दिया जब यह दुर्घटनाओं।
माइकल - जहां

जवाबों:


14

स्थानिक एड के ब्लॉग का संक्षिप्त समाधान था। यहाँ कुछ SQL ट्रांसफॉर्मेशन का प्रदर्शन कर रहा है:

DECLARE @geom GEOMETRY = 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))';
DECLARE @geog GEOGRAPHY = @geom.MakeValid().STUnion(@geom.STStartPoint()).STAsText()

और एड के पोस्ट का एक अंश :

इस व्यवहार की कुंजी STUnion()विधि है। चूंकि यह एक ओजीसी-आधारित पद्धति है, किसी दिए गए फ़ीचर के लिए पूरे ज्यामिति पर काम करते हुए, यह बहुभुज को उस पद्धति के लिए आवश्यक अभिविन्यास में मजबूर करता है - जो केवल Geographyप्रकार के लिए उपयोग किया जाने वाला होता है [...]। ओवरहेड को छोटा [...] रखते हुए यह विधि सचित्र काफी कुशल है।


2
SQL सर्वर 2008 r2 पर, मुझे काम करने के लिए इसे प्राप्त करने के लिए STUnion () के अंदर .MakeValid () करना होगा: .STUnion (@ geom.MakeValid ()। STStnPoint और ())
Chris Smith

@Smitty जो उन मामलों के लिए समझ में आता है जहां SQL अन्यथा प्रारंभिक बिंदु निर्धारित नहीं कर सकता है। शायद अगर आकार अपने आप पर या अन्य विषम परिस्थितियों में दोगुना हो जाए?
माइकल - जहां

हाँ, मेरी परिस्थिति में आकार अजीब है और अतिव्यापी है।
क्रिस स्मिथ

0

में = = SQL सर्वर 2012, ReorientObject () विधि को इसे पूरा करना चाहिए। <SQL सर्वर 2012 के लिए, नीचे एक वैकल्पिक विधि है।

मौजूदा SQL भूगोल @g के लिए, नीचे दिए गए कोड बिंदुओं को निकालेंगे और रिवर्स ऑर्डर में बिंदुओं (कोने) के साथ एक बहुभुज को फिर से बनाएंगे:
(नोट 1: सरल बहुभुजों के लिए काम करता है, न कि मल्टीप्लगॉन या रिंगों / सेंट्रोइड्स के साथ बहुभुज) (नोट )
2: SRID 4326 (WGS 84) समन्वय प्रणाली का उपयोग करके)

--For existing geography @g
DECLARE @GeometryText varchar(max), @ReversedPolygon geography
DECLARE @GeometryType varchar(20) = 'POLYGON', @Count int
SET @Count = @g.STNumPoints()
WHILE @Count > 0
BEGIN
    SET @GeometryText = @GeometryText + CONVERT(varchar(30),CONVERT(decimal(12,8),@g.STPointN(@Count).Long)) + ' ' + CONVERT(varchar(30),CONVERT(decimal(12,8),@g.STPointN(@Count).Lat))
    SET @Count = @Count - 1
    IF @Count > 0 SET @GeometryText = @GeometryText + ','
END
SET @GeometryText = @GeometryType +'((' + @GeometryText + '))'
SET @ReversedPolygon = geography::STGeomFromText(@GeometryText, 4326); 

0

ऐसा लगता है कि मैं एसक्यूएल सर्वर स्थानिक उपकरण से एसक्यूएल और सी # के कुछ अपवित्र हाइब्रिड का उपयोग कर सकता हूं , जैसा कि स्टैक ओवरफ्लो पर सुझाव दिया गया है

नोट: जिस समय यह उत्तर पोस्ट किया गया था, उस समय बहुत अधिक जानकारी नहीं थी। कृपया इस विधि को तब तक न आजमाएं जब तक आपको पहले से ही किसी अन्य चीज़ के लिए SQL सर्वर स्थानिक उपकरण की आवश्यकता न हो। इसके बजाय, यहां या स्टैक ओवरफ्लो पर अन्य उत्तरों में से एक का प्रयास करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.