2011-09-11 14 views
24

मुझे MKCoordinateSpan बनाने की आवश्यकता है जो लगभग 500 मीटर है।मीटर में MKCoordinateSpan?

एमकेसीऑर्डिनेटस्पैन कन्स्ट्रक्टर में पास करने के लिए मानों की गणना कैसे करूं?

किसी भी प्रोग्रामिंग (Obj-C, .Net) भाषा में उत्तर ठीक हैं।

उत्तर

88

एक अन्य विकल्प का उपयोग करने के लिए है MapKit के MKCoordinateRegionMakeWithDistance समारोह:

MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
    CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500); 

MKCoordinateSpanrgn.span में होगा।

+5

+1, यह आसान तरीका है - मुझे उस बारे में पता नहीं था! –

+2

यह वास्तव में अच्छा है – Eugene

39

जब तक आपको बड़ी सटीकता की आवश्यकता न हो, तो आप अनुमान के साथ इसे अधिक आसान बना सकते हैं। पहली समस्या 500 मीटर का प्रतिनिधित्व अक्षांश की डिग्री के अंश को खोजने के लिए है। अक्षांश की डिग्री किसी भी स्थान पर स्थिर है, लगभग 111 किमी। तो 500 मीटर .0045 डिग्री अक्षांश है।

फिर यह कठिन हो जाता है क्योंकि एक डिग्री की लंबाई की लंबाई अलग-अलग होती है, जहां आप हैं। यह

enter image description here

जहां अल्फा पृथ्वी के ध्रुवीय त्रिज्या, 6,378,137km, बी/एक 0.९,९६,६४,७१९ (सभी जीपीएस डिवाइस द्वारा उपयोग में WGC84 उपगोल मॉडल के लिए उपयोग में एक निरंतर) और enter image description here जहां फ़ाई है है के साथ अनुमान लगाया जा सकता अक्षांश की डिग्री है।

एक सेकंड के लिए कल्पना करें कि आप मेलबर्न में 37.783 डिग्री एस के अक्षांश के साथ भाग्यशाली हैं। उत्तर या दक्षिण यहां कोई फर्क नहीं पड़ता। बीटा 37.68 99 होने के लिए काम करता है और बाकी हिस्सों में अनुदैर्ध्य डिग्री 88 किमी की लंबाई देने के लिए हल होती है। तो 500 मीटर एक डिग्री के .0057 है। मेलबोर्न के लिए

परिणाम - MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);

आप अपने जवाब और अपने कोड with this online calculator

wiki article देशांतर पर इस पर एक बहुत अधिक विस्तार है जाँच कर सकते हैं (और यह यहाँ छवियों के स्रोत)

कोड:

#define EARTH_EQUATORIAL_RADIUS (6378137.0) 
#define WGS84_CONSTANT (0.99664719) 

#define degreesToRadians(x) (M_PI * (x)/180.0) 

// accepts decimal degrees. Convert from HMS first if that's what you have 
double spanOfMetersAtDegreeLongitude(double degrees, double meters) { 

    double tanDegrees = tanf(degreesToRadians(degrees)); 
    double beta = tanDegrees * WGS84_CONSTANT; 
    double lengthOfDegree = cos(atan(beta)) * EARTH_EQUATORIAL_RADIUS * M_PI/180.0; 
    double measuresInDegreeLength = lengthOfDegree/meters; 
    return 1.0/measuresInDegreeLength; 
} 
+3

वाह। अब यह एक जवाब है। बहुत बुरा मैं केवल आपको एक अंगूठे दे सकता हूं ... –

+1

कृपया इस उत्तर का उपयोग न करें। अंक प्राप्त करने के रूप में संतुष्ट होने के नाते, एमके कॉर्डिनेट रीजन मेकविथडिस्टेंस सही तरीका है। –

-2

MonoTouch में, तो इस समाधान का उपयोग आप इस सहायक विधि का उपयोग कर सकते हैं:

public static void ZoomToCoordinateAndCenter (MKMapView mapView, CLLocationCoordinate2D coordinate, double meters, bool showUserLocationToo, bool animate) 
    { 
     if (!coordinate.IsValid()) 
      return; 

     mapView.SetCenterCoordinate (coordinate, animate); 
     mapView.SetRegion (MKCoordinateRegion.FromDistance (coordinate, meters, meters), animate);  
    } 
+9

-1 मुझे Google मोनो टच को मजबूर करने के लिए। – sean

+0

एक मोनोचouch समाधान के साथ कुछ भी गलत नहीं है! –

संबंधित मुद्दे