2012-07-27 21 views
8

से एक एसक्यूएलजीओजी पॉलीगॉन-सर्कल बनाएं, मैं सी # का उपयोग कर एक एसक्यूएल-सर्वर 2008 भूगोल क्षेत्र में एक सर्कल को सहेजना चाहता हूं।एक केंद्र और त्रिज्या

सी # में अक्षांश, एक रेखांश और त्रिज्या है लेकिन मुझे बहुभुज की गणना करने का कोई तरीका नहीं मिल रहा है जो सर्कल का प्रतिनिधित्व करेगा और SqlGeography इसे से बनाएगा।

private List<Coordinate> getCirclePoints(Coordinate center, int radius, int speed) //speed 1: draws 360 sides, 2 draws 180 etc... 
    { 
     var centerLat = (center.Latitude * Math.PI)/180.0; //rad 
     var centerLng = (center.Longitude * Math.PI)/180.0; //rad 
     var dist = (float)radius/6371.0;    //d = angular distance covered on earth's surface 
     var circlePoints = new List<Coordinate>(); 
     for (int x = 0; x <= 360; x += speed) 
     { 
      var brng = x * Math.PI/180.0;   //rad 
      var latitude = Math.Asin(Math.Sin(centerLat) * Math.Cos(dist) + Math.Cos(centerLat) * Math.Sin(dist) * Math.Cos(brng)); 
      var longitude = ((centerLng + Math.Atan2(Math.Sin(brng) * Math.Sin(dist) * Math.Cos(centerLat), Math.Cos(dist) - Math.Sin(centerLat) * Math.Sin(latitude))) * 180.0)/Math.PI; 
      circlePoints.Add(new Coordinate((latitude * 180.0)/Math.PI, longitude)); 
     } 
     return circlePoints; 
    } 

और फिर एक parsable स्ट्रिंग को यह List<Coordinate> बदलने की कोशिश:

मैं समारोह निम्नलिखित बहुभुज बनाने के लिए करने की कोशिश की

 var s = "POLYGON((" + string.Join(",", points.ConvertAll(p => p.Longitude + " " + p.Latitude).ToArray()) + "))"; 
     var poly = SqlGeography.STPolyFromText(new System.Data.SqlTypes.SqlChars((SqlString)s), 4326); 

लेकिन यह हमेशा शिकायत बहुभुज हो गया है एक गोलार्ध पर, जहां मुझे यकीन है कि यह मामला है।

क्या मैं सही रास्ते पर हूं? क्या ऐसा करने के लिए कोई अन्य (सरल) तरीका है?

उत्तर

19

ठीक है, मेरे उत्तर का जवाब मिला।

var param = new SqlParameter(@"Polygon", poly); 
param.UdtTypeName = "Geography"; 
command.Parameters.Add(param); 

आशा: चाल

var poly = point.BufferWithTolerance(radiusInMeter, 0.01, true); //0.01 is to simplify the polygon to keep only a few sides 

तो आप बस एक SqlCommand बना सकते हैं बिंदु के आसपास एक बफर बनाने एक बिंदु

var point = SqlGeography.Point(latitude, longitude, 4326); 

तो बना सकते हैं और पैरामीटर के रूप में बहुभुज जोड़ने के लिए है जो भविष्य में किसी और की मदद करेगा!

+0

बहुत सराहना की महोदय, धन्यवाद! – EdGs

+1

यह बहुत उपयोगी था, इसके लिए धन्यवाद। थोड़ा और पढ़ने के बाद, मैंने सोचा कि यह कहना उचित होगा कि .01 सहिष्णुता मूल्य 33 प्वाइंट पॉलीगॉन (मानक एसक्यूएल भू सर्कल) के परिणामस्वरूप होगा। अगर कुछ त्रुटि स्वीकार्य है, तो बड़े मूल्य का उपयोग करके उपयोग किया जा सकता है। मैं अपने त्रिज्या को 5 से 50 मीटर तक कहीं भी होने की उम्मीद कर रहा हूं, इसलिए मैं दक्षता में सुधार के लिए अपने सहनशीलता मूल्य के लिए 3 का उपयोग कर रहा हूं। –

+0

आपकी टिप्पणी के लिए धन्यवाद मैंने अभी कुछ परीक्षण चलाए और मेरी सहिष्णुता को 0.08 में बदल दिया जो छोटे-आश त्रिज्या के लिए 16 पक्ष बहुभुज देने लगता है। – Johann