2011-12-13 8 views
5

मुझे मानचित्र के भीतर एक निश्चित सीमा तय करने की आवश्यकता है। मैं गूगल जियोकोडर बुला और व्यूपोर्ट संपत्ति लग रहा है जो की तरह पढ़ने से सीमा मिलती है:दृश्यमान मानचित्र दृश्य में एनई और एसड समन्वय वाली कुछ सीमाओं को कैसे फिट किया जाए?

{ 
    northeast =  { 
     lat = "30.4212235"; 
     lng = "-97.486942"; 
    }; 
    southwest =  { 
     lat = "30.1128403"; 
     lng = "-97.99917959999999"; 
    }; 
} 

मैं तो CLLocationCoordinate2D

NSDictionary *viewport = [[[results objectAtIndex:0] objectForKey:@"geometry"] 
                objectForKey:@"viewport"]; 
NSDictionary *NEDictionary = [viewport objectForKey:@"northeast"]; 
NSDictionary *SWDictionary = [viewport objectForKey:@"southwest"]; 

CLLocationCoordinate2D SWCoordinate = 
    CLLocationCoordinate2DMake(
     [[SWDictionary objectForKey:@"lat"] floatValue], 
     [[SWDictionary objectForKey:@"lng"] floatValue] 
    ); 
CLLocationCoordinate2D NECoordinate = 
    CLLocationCoordinate2DMake(
     [[NEDictionary objectForKey:@"lat"] floatValue], 
     [[NEDictionary objectForKey:@"lng"] floatValue] 
    );  

मैं जानता हूँ कि मैं एक MKMapRect (या MKMapRegion उत्पन्न करने के लिए की जरूरत में इन कनवर्ट करते हैं, जो भी आसान हो) इन निर्देशांकों से और फिर [mapView setVisibleRect: newRect एनिमेटेड: YES] (या [mapView setRegion: newRegion एनिमेटेड: हाँ] लेकिन मुझे यकीन नहीं है कि वहां कैसे पहुंचे। मुझे सीमाओं को रूपांतरित करने के लिए एक विधि चाहिए उचित डेटा संरचना, कुछ:

- (MKMapRect) mapRectThatFitsBoundsSW:(CLLocationCoordinate2D)sw 
            NE:(CLLocationCoordinate2D)ne { 
    // CGFloat x = ?? 
    // CGFloat y = ?? 
    // CGFloat width = ?? 
    // CGFloat height = ?? 
    MKMapRect mapRectFromBounds = MKMapRectMake(x,y,width,height); 
    return mapRectFromBounds; 
} 

कोई विचार?

उत्तर

2

अपने सीमा 180 वां मध्याह्न अवधि कर सकते हैं, तो आप रूपांतरण में है कि के लिए खाते में करने के लिए है:: मैं इस के साथ जा रहा समाप्त हो गया

- (MKMapRect) mapRectThatFitsBoundsSW:(CLLocationCoordinate2D)sw 
            NE:(CLLocationCoordinate2D)ne 
{ 
    MKMapPoint pSW = MKMapPointForCoordinate(sw); 
    MKMapPoint pNE = MKMapPointForCoordinate(ne); 

    double antimeridianOveflow = 
     (ne.longitude > sw.longitude) ? 0 : MKMapSizeWorld.width;  

    return MKMapRectMake(pSW.x, pNE.y, 
         (pNE.x - pSW.x) + antimeridianOveflow, 
         (pSW.y - pNE.y)); 
} 

लेकिन सावधान रहना उन MKMapRect कि anitmeridian अवधि, क्योंकि वे उस देश से आते हैं जहां ड्रेगन रहते हैं। यदि आप वहां मौजूद कुछ खतरों के बारे में जानना चाहते हैं, तो MKMapRect and displaying map overlays that span 180th meridian पर एक नज़र डालें। आपको चेतावनी दी गई है!

8

ऐसा करने के कई तरीके हैं।

center बिंदु का पता लगाकर आप MKCoordinateRegion बना सकते हैं और फिर span कोनों के बीच डिग्री में पूर्ण अंतर है।

या आप MapKit फ़ंक्शन MKMapPointForCoordinate का उपयोग कर MKMapRect बना सकते हैं। origin प्राप्त करने के लिए, उत्तर पश्चिमी समन्वय को समझें और इसे MKMapPoint पर परिवर्तित करें। width और height प्राप्त करने के लिए, कोनों के बीच मैपॉइंट्स में पूर्ण अंतर प्राप्त करें (समन्वय से कोने को पहले से फ़ंक्शन का उपयोग करके MKMapPoint से कनवर्ट करें)।

MKMapRectUnion फ़ंक्शन का उपयोग करके एक और त्वरित तरीका थोड़ा सा चाल है। प्रत्येक से एक शून्य आकार MKMapRect बनाएं समन्वय और फिर समारोह का उपयोग कर एक बड़ा RECT में दो rects विलय:

MKMapPoint swPoint = MKMapPointForCoordinate(SWCoordinate); 
MKMapRect swRect = MKMapRectMake(swPoint.x, swPoint.y, 0, 0); 

MKMapPoint nePoint = MKMapPointForCoordinate(NECoordinate); 
MKMapRect neRect = MKMapRectMake(nePoint.x, nePoint.y, 0, 0); 

MKMapRect rect = MKMapRectUnion(swRect, neRect); 

याद रखें कि मानचित्र दृश्य अभी भी रेक्ट अनुपात के आधार पर आप का अनुरोध करने के लिए अपने स्वयं के समायोजन कर देगा मानचित्र दृश्य और आवश्यक ज़ूम का। (यदि आप जानना चाहते हैं कि समायोजित रेक्ट क्या होगा, तो मानचित्र दृश्य की mapRectThatFits: विधि पर कॉल करें।)

+0

यह वास्तव में एक सरल चाल है। कम से कम गणित-वाई होने के लिए अधिक उत्साह का हकदार है। – Adam

0

मुझे कुछ ऐसा लगता है जो काम करता है।

- (MKMapRect) mapRectThatFitsBoundsSW:(CLLocationCoordinate2D)sw 
            NE:(CLLocationCoordinate2D)ne { 
    MKMapPoint nePoint = MKMapPointForCoordinate(ne); 
    MKMapPoint swPoint = MKMapPointForCoordinate(sw); 
    CGFloat width = ABS(nePoint.x - swPoint.x); 
    CGFloat height = ABS(nePoint.y - swPoint.y); 
    MKMapRect newMapRect = MKMapRectMake(
     MIN(swPoint.x, nePoint.x), 
     MIN(swPoint.y, nePoint.y), 
     width, 
     height 
    ); 

    // if (!MKMapRectSpans180thMeridian(newMapRect)) { 
     return newMapRect; 
    // } else { 
     // ???? 
    // } 
} 
+0

यदि आप निश्चित रूप से जानते हैं कि एनई और एसडब्ल्यू अंक सही हैं (और एनडब्लू और एसई या जो कुछ भी नहीं बदला जाता है) तो आपको एबीएस की आवश्यकता नहीं है। यदि आप सुनिश्चित नहीं हैं कि वे सही कोनों होंगे, तो आपको MKMapRectMake पर अपने पहले पैरामीटर के रूप में कम से कम दो संभावित एक्स कोरों को प्राप्त करने की आवश्यकता होगी। वाई के लिए वही बेशक, यह सब आपके ऊपर निर्भर करता है कि एंटी-मेरिडियन को पार करने वाले कोई भी बॉक्स न हों। – Craig

+0

मैं देख सकता हूं कि यह क्यों अच्छा होगा कि एनई या एसडब्ल्यू के समन्वय के बारे में चिंता न करें, बस अगर वे गलती से स्वैप हो जाएंगे, तो मैंने MIN को MKMapRect x और y में जोड़ा है। हम एंटी-मेरिडियन मुद्दे को कैसे संभालेंगे? – jmcopeland

+0

चूंकि MKMapView डेटालाइन पर नहीं जाता है, इसलिए आप इसे किसी भी बॉक्स को खींचने में सक्षम नहीं हैं। यह निर्धारित करने के लिए कि क्या आपको दिए गए कॉरर्स वास्तव में लाइन को पार करते हैं या तो आपको यह सुनिश्चित करने की आवश्यकता है कि एनई कौन सा है और जो बॉक्स के लिए एसडब्ल्यू है, फिर जांच करें कि पूर्वोत्तर एसडब्ल्यू से अधिक 'पश्चिम' है (-180 के बीच में और +180) यदि ऐसा है तो बॉक्स लाइन को पार करता है। यदि आप नहीं जानते कि कौन सा समन्वय शीर्ष-दाएं/नीचे-बाएं में है, तो अपने देशांतर मूल्यों में पूर्ण अंतर प्राप्त करें। > 180 का मतलब है कि यह दुनिया के दूसरी तरफ जाने के लिए छोटा होगा। – Craig

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