2013-02-27 161 views
16

शायद मुझे कुछ याद आ रहा है। मेरे पास "भूगोल" डेटाटाइप का एक एसक्यूएल सर्वर कॉलम है।एसबीएल भूगोल dbgeography करने के लिए?

मैं अपने सी # कोड में डीबीजीओोग्राफी प्रकार का उपयोग करना चाहता हूं। एसक्यूएल की भूगोल से डीजीजीोग्राफी में डालने या परिवर्तित करने का कोई तरीका?

उत्तर

24

देर से प्रतिक्रिया के लिए खेद है - लेकिन यह कुछ और खोज के दौरान देखा। मदद करता है कि

DbGeography theGeography; 
SqlGeography newGeography = SqlGeography.Parse(theGeography.AsText()).MakeValid(); 

आशा:

आप निम्न कार्य करें:

SqlGeography theGeography; 
int srid = 4326; // or alternative 

DbGeography newGeography = DbGeography.FromText(theGeography.ToString(), srid); 

यह रिवर्स करने के लिए!

+0

मैं वास्तव में एक और प्रोजेक्ट पर हूं जहां यह फिर से आया, इसलिए धन्यवाद, बस मैं जो खोज रहा था। – radpin

+0

मैंने इसे कुछ बार अनुशंसित देखा है लेकिन .NET में उपयोग किए जाने पर MakeValid विधि SqlGeography प्रकार पर उपलब्ध प्रतीत नहीं होता है। क्या मैं कुछ भूल रहा हूँ? – joelmdev

+0

@ jm2 अगर आपने माइक्रोसॉफ्ट का संदर्भ दिया है। SQL सर्वर। यह आपके लिए उपलब्ध होना चाहिए। –

1

प्रदान किया गया समाधान ठीक है यदि आप EF6 नहीं चला रहे हैं। शुरुआती संस्करणों के साथ ठीक है, लेकिन ईएफ 6 के साथ, हमें इस असेंबली के संदर्भ नहीं देना चाहिए। यह ईएफ लिटल पागल हो जाता है।

+0

क्या आप अधिक विशिष्ट हो सकते हैं? वास्तव में क्या होता है और सही समाधान क्या है? – grahamesd

+1

इसे पढ़ने के लिए किसी और के लिए, मैं अभी भी ** शून्य ** समस्याओं के साथ ईएफ 6 के साथ मेरे प्रदत्त समाधान का उपयोग करता हूं। –

1

आपको उपरोक्त वर्णित असेंबली का संदर्भ जोड़ना होगा। निम्नलिखित पोस्ट आप link मदद मिल सकती है, link2

8

जब प्रदर्शन किसी भी महत्व का है, अच्छी तरह से ज्ञात द्विआधारी प्रसिद्ध पाठ के बजाय इस्तेमाल किया जाना चाहिए:

var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value); 

का उपयोग कर एक अधिभार नहीं है एक एसआरआईडी, अगर यह महत्वपूर्ण है। 1,000 यथोचित जटिल बहुभुज के साथ अपने साधारण परीक्षण में द्विआधारी आधारित दृष्टिकोण 4 बार की तुलना में तेजी है पाठ आधारित एक:

int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326; 
SqlGeography g = SqlGeography.Point(lat, lon, coordSys); 
return DbSpatialServices.Default.GeographyFromProviderValue(g); 

नहीं serializing:

* Binary-based conversion 
Run 1: 1948 
Run 2: 1944 
Run 3: 1959 
Run 4: 1979 
Run 5: 1988 
Average: 1963.6 

* Text-based conversion 
Run 1: 8527 
Run 2: 8553 
Run 3: 8596 
Run 4: 8535 
Run 5: 8496 
Average: 8541.4 
+0

भयानक अद्यतन, प्रदर्शन को टक्कर देने का शानदार तरीका। – radpin

+1

रिवर्स ऑपरेशन के लिए: 'SqlGeography.STGeomFromWKB (नया SqlBytes (value.AsBinary()), value.CoordinateSystemId) ' –

0

मैं एक काम कर समाधान के रूप में यह पाया/स्ट्रिंग (डब्लूकेटी) या बाइनरी (डब्ल्यूकेबी) में कनवर्ट करना जो प्रदर्शन को मारता है।

यह एफई 6.1.3, SqlServer 2016 SP1 और Microsoft.SqlServer.Types.14.0.314.76

+0

मैं जोड़ दूंगा कि यदि आप v10 (SQL 2008) से अधिक SqlGeography का उपयोग कर रहे हैं, तो यह विधि फेंक जाएगी एक त्रुटि, जिसका अर्थ है कि यदि आपको SQL 2012 और उसके बाद की किसी भी सुविधा की आवश्यकता है, तो आप खराब हो गए हैं। हालांकि प्रदर्शन अच्छा है। –

+0

मुझे लगता है कि कोई रिवर्स विधि भी नहीं है? –

+0

एक रिवर्स विधि होनी चाहिए। अभी नहीं बता सकते हैं। –

1

ILSpy में EntityFramework.SqlServer.dll की मेरी पढ़ने के आधार पर पर मेरे लिए काम कर रहा है, मैं तेज तरीका मानना ​​है कि SqlGeography से DbGeography कन्वर्ट करने के लिए है:

var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo); 

इस विधि लाभ यह है कि कोई द्विआधारी रूपांतरण और पार्स की आवश्यकता है है। यह आसानी से एसक्यूजीजीोग्राफी का उपयोग आंतरिक प्रदाता मूल्य के रूप में एक डीबीजीगोग्राफी देता है।