20

में एक बिंदु खोजें मैं SQL Server 2008 स्थानिक डेटा प्रकारों का उपयोग कर रहा हूं। मेरे पास डेटा के प्रकार GEOMETRY के रूप में सभी राज्यों (बहुभुज के रूप में) के साथ एक टेबल है। अब मैं यह जांचना चाहता हूं कि डेटा के प्रकार के रूप में एक बिंदु के निर्देशांक (अक्षांश, अक्षांश), उस राज्य के अंदर है या नहीं।एसक्यूएल सर्वर 2008 स्थानिक: पॉलीगॉन

मुझे नए स्थानिक डेटा प्रकारों का उपयोग करके कोई उदाहरण नहीं मिला। वर्तमान में, मेरे पास एक कामकाज है जिसे कई साल पहले लागू किया गया था, लेकिन इसमें कुछ कमीएं हैं।

मेरे पास SQL ​​Server 2008 और 2012 दोनों हैं। यदि नए संस्करण में कुछ संवर्धन हैं, तो मैं इसमें भी काम करना शुरू कर सकता हूं।

धन्यवाद।

अद्यतन 1:

मैं थोड़ा और अधिक स्पष्टता के लिए एक कोड नमूना जोड़ने कर रहा हूँ।

declare @s geometry --GeomCol is of this type too. 
declare @z geography --GeogCol is of this type too. 

select @s = GeomCol 
from AllStates 
where STATE_ABBR = 'NY' 

select @z = GeogCol 
from AllZipCodes 
where ZipCode = 10101 
+0

यह प्रदर्शन गरीब है है यदि आप डेटाबेस में विशाल रिकॉर्ड है, मैं 1600000 अधिक रिकॉर्ड इस क्वेरी की कोशिश की और यह करने के लिए औसत 2 मिनट लग गए पूर्ण। –

उत्तर

26

मुझे लगता है कि भूगोल विधि STIntersects() तुम क्या चाहते हो जाएगा:

DECLARE @g geography; 
DECLARE @h geography; 
SET @g = geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326); 
SET @h = geography::Point(47.653, -122.358, 4326) 

SELECT @g.STIntersects(@h) 
+0

धन्यवाद। लेकिन मेरे बहुभुज, राज्य, एक GEOMETRY डेटा प्रकार में है। क्या मुझे इसे पहले एक भौगोलिक चर में बदलना चाहिए? – Farhan

+0

आह ... अरेप्स। मैं इसके उस हिस्से को याद किया। क्या कोई कारण है कि आपके राज्य (भौगोलिक डेटा) को ज्यामितीय डेटा के रूप में संग्रहीत किया जाता है? –

+0

वास्तव में, इसके लिए कोई कारण नहीं है। जैसे-जैसे मैं कुछ ट्यूटोरियल्स के माध्यम से जा रहा था, मैंने अभी माना है कि डेटा प्रकार जीईजीजीपी निर्देशांक/अंक के लिए है और जीओएमईटीआरई क्षेत्र/बहुभुज के लिए है। – Farhan

2

आप GEOGRAPHY को संग्रहीत बहुभुज के लिए डेटा प्रकार नहीं बदल सकते हैं तो आप इनपुट अक्षांश बदलने और कर सकते हैं GEOMETRY के लिए देशांतर और परिवर्तित मूल्य के विरुद्ध STContains या STIntersects का उपयोग करें।

DECLARE @PointGeography GEOGRAPHY = geography::Point(43.365267, -80.971974, 4326) 
DECLARE @PointGeometry GEOMETRY = geometry::STGeomFromWKB(@PointGeography.STAsBinary(), 4326); 

SELECT @PolygonGeometry.STContains(@PointGeometry); 

विपरीत दिशा जा रहे हैं - GEOGRPAHY को GEOMETRY बहुभुज परिवर्तित करने के लिए कोशिश कर रहा है - त्रुटि प्रवण और मेरे अनुभव से असफल होने की संभावना है।

और ध्यान दें कि यदि आप अक्षांश और देशांतर मूल्यों से सीधे GEOMETRY बिंदु बनाने की कोशिश तो STContains (या STIntersects) काम नहीं करेगा (अर्थात एक मैच जब वे चाहिए नहीं देंगे)।

0
declare @g geometry 
set @g=geometry::STGeomFromText('POLYGON((-33.229869 -70.891988, -33.251124 -70.476616, -33.703094 -70.508045, -33.693931 -70.891052,-33.229869 -70.891988))',0) 

DECLARE @h geometry; 

SET @h = geometry::STGeomFromText('POINT(-33.3906300 -70.5725020)', 0); 
SELECT @g.STContains(@h); 
0
  1. आप ज्यामिति और भूगोल मिश्रण नहीं किया जाना चाहिए। ज्यामिति फ्लैट प्लान के लिए है, भूगोल SPHEROIDS (पृथ्वी की तरह) के लिए है।
  2. आपको इस से निपटने के लिए एसआरआईडी को "मिलना" चाहिए। प्रत्येक एसआरआईडी (उदाहरण के लिए 2 9 13 = एनजेडजी 2000) एक परिवर्तन संबंध का वर्णन करता है। प्रत्येक एसआरआईडी का उपयोग एक समान क्षेत्र से/मानचित्र करने के लिए किया जा सकता है, जो कि आप एक से दूसरे में कैसे जाते हैं।
  3. जब तक आप दोनों मानों पर "समान" एसआरआईडी नहीं पहुंचते हैं, तब तक .STxXX फ़ंक्शंस के लिए कई लोग वापस लौटाएंगे (आपके पास दोनों मामलों में डिफ़ॉल्ट 0 हो सकता है)
  4. यदि वे समान नहीं हैं लेकिन आप दिखाते हैं कि वे हैं, आपको किनारे के मामलों में त्रुटियां हो सकती हैं।
  5. यदि आप कुछ "precalc" समय बिताते हैं, तो आप बाउंडिंग रीक्ट्स (और उन्हें स्टोर) के लिए शीर्ष/बाएं और नीचे/दाएं बिंदु निर्धारित कर सकते हैं, और रिकॉर्ड करने के लिए रिकॉर्ड्स को सीमित करने के लिए इंडेक्स में उन मानों का उपयोग कर सकते हैं। जब तक एटी/एल < बी बी/आर और एबी/आर> बीटी/एल वे ओवरलैप नहीं कर सकते हैं, जिसमें आपके कहां एक उदाहरण मैं SRID में इस्तेमाल अपने STWithin की जाँच करता है

यहाँ तक सीमित कर देगा एक सरल 4 और संख्यात्मक जांच का मतलब 2193।एक भी बिंदु का एक 3 किमी के दायरे में सभी सड़कों, और एक विशिष्ट स्कूल क्षेत्र के अंदर

DECLARE @g geometry 

SELECT @g = GEO2193 FROM dbo.schoolzones WHERE schoolID = 319 

SELECT DD.full_road_name, MIN(convert(int, dd.address_number)), MAX(convert(int, dd.address_number)) 
FROM (

select A.* from dbo.[street-address] A 

WHERE (((A.Shape_X - 1566027.50505) * (A.Shape_X - 1566027.50505)) + ((A.Shape_Y - 5181211.81675) * (A.Shape_Y - 5181211.81675))) < 9250000 

and a.shape_y > 5181076.1943481788 

and a.shape_y < 5185097.2169968253 

and a.shape_x < 1568020.2202472512 

and a.shape_x > 1562740.328937705 

and a.geo2193.STWithin(@g) = 1 
) DD 
GROUP BY DD.full_road_name 
ORDER BY DD.full_road_name