2012-11-30 47 views
5

मेरे पास एक रेल ऐप है जो आरजीओ 0.3.1 9 का उपयोग कर रहा है जो आरजीओ-एक्ट्रीकॉर्ड 0.4.5 मणि के साथ एक पोस्टजीआईएस 1.5 डेटाबेस से कनेक्ट प्रोजे 4 समर्थन के साथ है।आरजीओ प्रोजेक्टेड बफर पॉलीगॉन बहुत छोटा

मेरे ऐप में एक मॉडल नामक एक मॉडल है जिसमें भौगोलिक बिंदु, त्रिज्या और बहुभुज आकार शामिल है। जब कोई नया क्षेत्र सहेजने वाला होता है तो यह त्रिज्या और भौगोलिक बिंदु का उपयोग करके बहुभुज बनाने के लिए क्षेत्र के भू-भौतिकी के बफर फ़ंक्शन का उपयोग करता है।

यहाँ geofactory उस क्षेत्र मॉडल के लिए इस्तेमाल किया जा रहा है

GEOFACTORY = RGeo::Geographic.projected_factory(:buffer_resolution => 8, :projection_proj4 => '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +wktext +no_defs', :projection_srid => 3857) 

projection_srid मैं उपयोग कर रहा हूँ समस्या यह है कि एप्पल और गूगल मैप्स के मर्केटर प्रक्षेपण 3857. है कि बफर है कि बनाया जा रहा एक ही आकार नहीं है जैसा कि मैं या तो सेब मानचित्र या Google मानचित्र में चित्रित कर रहा हूं। उदाहरण के लिए, यदि मैं निर्मित मैककिट फ़ंक्शन एमकेसीर्कल

[MKCircle circleWithCenterCoordinate:self.coordinate radius:50]; 

सर्कल इस तरह आकर्षित और ओवरले करेगा। iOS Drawing Radius

लेकिन अगर मैं निर्देशांक बफर समारोह है कि डेटाबेस में बहुभुज आकृति को बनाने और गूगल मैप्स मैं इस मिल पर उन्हें साजिश प्रपत्र बनाए गए ले।

GoogleMaps Radius

आप देख सकते हैं, बहुभुज है कि एक ही प्रक्षेपण प्रणाली का उपयोग कर बनाया गया था छोटे की तुलना में यह होना चाहिए। परिभाषित त्रिज्या के आकार के आधार पर यह समस्या तेजी से नियंत्रण से बाहर हो जाती है। मैंने आरजीईओ में परिभाषित सरल_मेरेटर फैक्ट्री का उपयोग करने की भी कोशिश की है, जो एक ही परिणाम उत्पन्न करता है।

उम्मीद है कि किसी के पास कुछ अंतर्दृष्टि है क्यों, जब एक रेखांश, अक्षांश अनुमानित बिंदु buffered यह गलत तरीके से आकार का बहुभुज बनाता है।

उत्तर

9

जो आप यहां देख रहे हैं वह मर्केटर विरूपण है। एक मर्केटर प्रक्षेपण में "50" की दूरी वास्तविक ग्रह की सतह पर 50 मीटर के अनुरूप नहीं है, जब तक कि आप भूमध्य रेखा पर न हों।

आपके आईओएस मानचित्र द्वारा खींचा गया चक्र सही है: यह 50 मीटर त्रिज्या है। मुझे आपकी दूसरी छवि बनाने के लिए क्या संदेह था कि बिंदु को एक मर्केटर प्रक्षेपण में प्रस्तुत करना था (आपके द्वारा प्रदत्त प्रोज 4 के अनुसार)। फिर आप अनुमानित समन्वय प्रणाली में त्रिज्या 50 के साथ एक बफर बनाने के लिए आगे बढ़े। हालांकि, अक्षांश 40.61 पर 50 मर्केटर इकाइयां पृथ्वी की दूरी की सतह पर केवल 37.9 6 मीटर के अनुरूप होती हैं। तो जब आप उस बहुभुज को अक्षांश और देशांतर में वापस लाते हैं और इसे साजिश करते हैं, तो आप यही देखते हैं: एक 38-मीटर सर्कल।

इसे देखने का एक तरीका Google मानचित्र पर पूर्ण विश्व मानचित्र को देखना है। भूमध्य रेखा पर त्रिज्या 50 पिक्सल का एक चक्र बनाएं। और उसके बाद ग्रीनलैंड पर त्रिज्या 50 पिक्सल का एक और चक्र खींचें। मानचित्र पर (मर्केटर निर्देशांक में), वे मंडल एक ही आकार के हैं। लेकिन, यदि आप अपने मर्केटर प्रक्षेपण को जानते हैं, तो आप जानते हैं कि यह ग्रीनलैंड को विकृत करता है क्योंकि ग्रीनलैंड भूमध्य रेखा से बहुत दूर है, इसलिए ग्रीनलैंड पर आपका सर्कल वास्तव में भूमध्य रेखा के ऊपर आपके सर्कल की तुलना में वास्तविक जीवन में बहुत छोटा है। 40 डिग्री अक्षांश पर, विकृति उतनी गंभीर नहीं है, लेकिन यह अभी भी वहां है।

यदि आप इसे सही करना चाहते हैं, तो यह बहुत आसान है। मर्केटर प्रक्षेपण के कारण आकार विरूपण अक्षांश के प्रतिभा के लिए आनुपातिक है। यही है, भूमध्य रेखा पर 50 मर्केटर इकाइयां 50 मीटर के बराबर होती हैं, लेकिन अक्षांश एक्स (रेडियंस में) पर 50 मर्केटर इकाइयां 50/सेक (x) मीटर के अनुरूप होती हैं। तो यदि आप 50 मीटर की त्रिज्या चाहते हैं, तो 50 (सेकंड अक्षांश) से गुणा करें, और उस संख्या का उपयोग मर्केटर निर्देशांक में त्रिज्या के रूप में करें।आरजीओ-स्पीच में:

p_lonlat = GEOFACTORY.point(40.610355377197266, -75.38220214843749) 
p_proj = p_lonlat.projection 
buf_proj = p_proj.buffer(50.0 * (1/Math.cos(p_lonlat.y/180.0 * Math::PI))) 
buf_lonlat = GEOFACTORY.unproject(buf_proj) 
+0

संपादन के लिए धन्यवाद, मोबाइलऑवरलोर्ड। मैं भूल गया कि रुबी में एक सुरक्षित कार्य नहीं था। कोड को पोस्ट किए बिना मुझे यह पहले परीक्षण के बिना मिलता है ... :-) –