2012-05-11 18 views
18

मैं MKMapView में स्थानों के बीच मध्यबिंदु निर्धारित करने का प्रयास कर रहा हूं। मैं here (और here) के रूप में उल्लिखित विधि का पालन कर रहा हूं और इसे उद्देश्य-सी में फिर से लिखता हूं, लेकिन मानचित्र को बाफिन द्वीप के पूर्वोत्तर में केंद्रित किया जा रहा है, जो कि दो बिंदुओं के नजदीक नहीं है।2 कोरिडिनेनेट्स के बीच मिडपॉइंट निर्धारित करना

मेरे विधि ऊपर लिंक जावा पद्धति पर आधारित:

+(CLLocationCoordinate2D)findCenterPoint:(CLLocationCoordinate2D)_lo1 :(CLLocationCoordinate2D)_loc2 { 
    CLLocationCoordinate2D center; 

    double lon1 = _lo1.longitude * M_PI/180; 
    double lon2 = _loc2.longitude * M_PI/100; 

    double lat1 = _lo1.latitude * M_PI/180; 
    double lat2 = _loc2.latitude * M_PI/100; 

    double dLon = lon2 - lon1; 

    double x = cos(lat2) * cos(dLon); 
    double y = cos(lat2) * sin(dLon); 

    double lat3 = atan2(sin(lat1) + sin(lat2), sqrt((cos(lat1) + x) * (cos(lat1) + x) + y * y)); 
    double lon3 = lon1 + atan2(y, cos(lat1) + x); 

    center.latitude = lat3 * 180/M_PI; 
    center.longitude = lon3 * 180/M_PI; 

    return center; 
} 

2 मापदंडों निम्न डेटा है:

_loc1: 
    latitude = 45.4959839 
    longitude = -73.67826455 

_loc2: 
    latitude = 45.482889 
    longitude = -73.57522299 

ऊपर सही ढंग से नक्शे पर जगह कर रहे हैं (में मॉन्ट्रियल के आसपास) । मैं अपने विधि निम्नलिखित लौट 2 के बीच मध्य में नक्शे को केंद्रित करने के लिए कोशिश कर रहा हूँ, फिर भी:

latitude = 65.29055 
longitude = -82.55425 

जो आर्कटिक, में कहीं जब यह दक्षिण लगभग 500 मील की दूरी पर होना चाहिए।

उत्तर

11

बस एक झटका, लेकिन मैंने देखा कि आपके lon2 और lat2 चर की गणना M_PI/100 के साथ की जाती है और M_PI/180 नहीं।

double lon1 = _lo1.longitude * M_PI/180; 
double lon2 = _loc2.longitude * M_PI/100; 

double lat1 = _lo1.latitude * M_PI/180; 
double lat2 = _loc2.latitude * M_PI/100; 

180 में बदलने से आपको थोड़ा सा मदद मिल सकती है।

+0

हाँ ... यह होगा। –

-4

मुझे लगता है कि आप इसे थोड़ा सोच रहे हैं। बस करें:

float lon3 = ((lon1 + lon2)/2) 
float lat3 = ((lat1 + lat2)/2) 

lat3 और lon3 केंद्र बिंदु होगा।

+10

पृथ्वी फ्लैट नहीं है, यही कारण है कि डेवलपर्स अक्सर इस तरह एक साधारण एल्गोरिदम का उपयोग नहीं करना चाहते हैं। – Nate

+7

^^^ हेरेटिक !!!!!!!!! – wbarksdale

8

मामले में किसी को स्विफ्ट में कोड की जरूरत है, मैं स्विफ्ट में पुस्तकालय समारोह में लिखा है कई निर्देशांकों के बीच मध्य गणना करने के लिए:

//  /** Degrees to Radian **/ 

class func degreeToRadian(angle:CLLocationDegrees) -> CGFloat{ 

    return ( (CGFloat(angle))/180.0 * CGFloat(M_PI) ) 

} 

//  /** Radians to Degrees **/ 

class func radianToDegree(radian:CGFloat) -> CLLocationDegrees{ 

    return CLLocationDegrees( radian * CGFloat(180.0/M_PI) ) 

} 

class func middlePointOfListMarkers(listCoords: [CLLocationCoordinate2D]) -> CLLocationCoordinate2D{ 

    var x = 0.0 as CGFloat 

    var y = 0.0 as CGFloat 

    var z = 0.0 as CGFloat 



    for coordinate in listCoords{ 

     var lat:CGFloat = degreeToRadian(coordinate.latitude) 

     var lon:CGFloat = degreeToRadian(coordinate.longitude) 

     x = x + cos(lat) * cos(lon) 

     y = y + cos(lat) * sin(lon); 

     z = z + sin(lat); 

    } 

    x = x/CGFloat(listCoords.count) 

    y = y/CGFloat(listCoords.count) 

    z = z/CGFloat(listCoords.count) 



    var resultLon: CGFloat = atan2(y, x) 

    var resultHyp: CGFloat = sqrt(x*x+y*y) 

    var resultLat:CGFloat = atan2(z, resultHyp) 



    var newLat = radianToDegree(resultLat) 

    var newLon = radianToDegree(resultLon) 

    var result:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: newLat, longitude: newLon) 

    return result 

} 

विस्तृत जवाब पाया जा सकता है here

4

तेज उपयोगकर्ताओं के लिए, सही किया संस्करण @dinjas के रूप में

import Foundation 
import MapKit 
extension CLLocationCoordinate2D { 
    // MARK: CLLocationCoordinate2D+MidPoint 
    func middleLocationWith(location:CLLocationCoordinate2D) -> CLLocationCoordinate2D { 

     let lon1 = longitude * M_PI/180 
     let lon2 = location.longitude * M_PI/180 
     let lat1 = latitude * M_PI/180 
     let lat2 = location.latitude * M_PI/180 
     let dLon = lon2 - lon1 
     let x = cos(lat2) * cos(dLon) 
     let y = cos(lat2) * sin(dLon) 

     let lat3 = atan2(sin(lat1) + sin(lat2), sqrt((cos(lat1) + x) * (cos(lat1) + x) + y * y)) 
     let lon3 = lon1 + atan2(y, cos(lat1) + x) 

     let center:CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat3 * 180/M_PI, lon3 * 180/M_PI) 
     return center 
    } 
} 
+1

धन्यवाद - लेकिन दोस्त - क्या यह तथ्य इस तथ्य के लिए करता है कि यह प्रमुख मेरिडियन को पार कर सकता है? – Fattie

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