2012-03-16 7 views
6

मेरी एसक्यूएल सर्वर में (2008 R2) में अंक से भूगोल बहुभुज बनाएं, वहाँ भौगोलिक Points (अक्षांश/देशांतर) का एक बहुत युक्त एक मेज है इस बिंदु से Polygon निर्धारित करने के लिए, मेरे कौन से स्टोर बिंदुओं द्वारा परिभाषित क्षेत्र में स्थित हैं।Azure पर T-SQL

क्या टी-एसक्यूएल में दिए गए बिंदुओं से बहुभुज बनाने का मूल और तेज़ तरीका है? The solutions I found बहुभुज बनाने के लिए STGeomFromText/STGeomFomWKB विधियों का उपयोग कर रहे हैं, जो मुझे बहुत बोझिल और धीमा लगता है।

कुछ की तरह:

SET @POLY = geometry::STPolyFromPoints(SELECT Position FROM MyPoints) 

उत्तर

3

जहाँ तक मुझे पता है, वहाँ कोई देशी समारोह है कि पैरामीटर के रूप में एक मेज लेता है और एक बहुभुज में धर्मान्तरित है।

आपका सबसे अच्छा एक स्केलर उपयोगकर्ता परिभाषित फ़ंक्शन को गठबंधन करना है जो परिणाम के कॉलम को एक अल्पविराम सेपरेटेड स्ट्रिंग में STPOLyFromText के साथ जोड़ता है जिसे आपने पहले ही पढ़ा है।

UDF to Concatenate Column to CSV String

MSDN - STPolyFromText

+1

हम एक फ़ंक्शन का उपयोग कर रहे हैं जो बिंदुओं को जोड़ता है अपने बाइनरी प्रतिनिधित्व में और उस स्ट्रिंग पर 'STGeomFromWKB' को कॉल करें। यह हमारे उद्देश्य के लिए पर्याप्त तेज़ है, लेकिन यह अभी भी बदसूरत है। – Gene

+0

एक और सुझाव आपके स्वयं के .NET CLR उपयोगकर्ता परिभाषित फ़ंक्शन को लिखा जाएगा जो तालिका पैरामीटर (वास्तविक भौगोलिक बिंदुओं का स्तंभ) लेता है, और एक ज्यामिति देता है। मैंने अभी तक इसके साथ काम नहीं किया है, लेकिन एसक्लगोमेट्रीबिल्डर वादा करता है: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.types.sqlgeometrybuilder.aspx –

+0

AFAIK सीएलआर कार्यों के लिए कोई समर्थन नहीं है एसक्यूएल एज़ूर मैंने भी उस संभावना के बारे में सोचा। – Gene

3

मान लिया जाये कि हम एक मेज आदेश दिया देशांतर और इस तालिका में लाट्स से भरा है:

CREATE TABLE [dbo].[LongAndLats](
    [Longitude] [decimal](9, 6) NULL, 
    [Latitude] [decimal](9, 6) NULL, 
    [SortOrder] [int] NULL 
    ) 

यह एक बहुभुज में उन बिंदुओं में परिवर्तित कर देंगे:

DECLARE @BuildString NVARCHAR(MAX) 
SELECT @BuildString = COALESCE(@BuildString + ',', '') + CAST([Longitude] AS NVARCHAR(50)) + ' ' + CAST([Latitude] AS NVARCHAR(50)) 
FROM dbo.LongAndLats 
ORDER BY SortOrder 

SET @BuildString = 'POLYGON((' + @BuildString + '))'; 
DECLARE @PolygonFromPoints geography = geography::STPolyFromText(@BuildString, 4326); 
SELECT @PolygonFromPoints 

कुछ नोट्स:

  • बहुभुज को बंद करने की आवश्यकता है। अर्थात। पहला और अंतिम बिंदु वही होना चाहिए।
  • न्यूनतम 4 अंक होना चाहिए।
  • अंक का क्रम महत्वपूर्ण है। इसे "बाएं हाथ/पैर नियम" का पालन करना चाहिए (अंक के बीच खींची गई रेखा के बाईं ओर स्थित क्षेत्रों को पॉलीगॉन के अंदर माना जाता है)
+0

मैं जानना चाहूंगा कि वास्तविक सॉर्टिंग भाग कैसे करें, क्योंकि आपका उपरोक्त समाधान बहुत अच्छा है। मेरा लटका हुआ है कि "बाएं हाथ/पैर नियम" में बिंदुओं को कैसे क्रमबद्ध करें। मैं एक बहुभुज के साथ समाप्त हो रहा हूं जो स्वयं पर ओवरलैप कर रहा है क्योंकि मेरा lat/long ordering सही नहीं है। –

+0

उदाहरण: 'DECLARE @geom GEOMETRY = ' पॉलीगॉन (( -116।77953600883484 \t 33.103710174560547 , -117,03299999237061 \t 32,547900199890137 , -117,11846709251404 \t 33,469111442565918 , -117,38499999046326 \t 33,202700138092041 , -117,38700008392334 \t 33,206999778747559 , -117,39700007438660 \t 33,209300041198730 , -116,77953600883484 \t 33,103710174560547 )) ' घोषित @geog भूगोल = @ geom.MakeValid()। STUnion (@ geom.MakeValid()। STStartPoint()) STAsText() @ geog' –

+0

@Smitty का चयन करें, ऑर्डरिंग जानी चाहिए '[dbo] में डालने से पहले। [LongAndLats] 'तालिका। यदि बिंदुओं का आदेश नहीं दिया जाता है, तो मुझे विश्वसनीय गैर-अंतरण क्रमबद्ध क्रम निर्धारित करने के किसी भी तरीके से अवगत नहीं है, मुझे ऐसा नहीं लगता है क्योंकि संभवतः ऑर्डर ऑर्डर हो सकते हैं। – g2server