2015-05-19 9 views
14

Ich versuche, einige Apple Mapping-Code in Java zu konvertieren. Ich habe das meiste davon korrekt konvertiert, bis auf ein paar Anrufe zu MKMetersPerMapPointAtLatitudeMath Hinter MKMetersPerMapPointAtLatitude

Ich habe eine sehr enge Lösung ... aber es ist nicht genau und ich bin mir nicht sicher, warum nicht. Irgendwelche Ideen?

#import <Foundation/Foundation.h> 
#import <Math.h> 
@import MapKit; 

#define MERCATOR_OFFSET 268435456.0/2.0 
#define MERCATOR_RADIUS (MERCATOR_OFFSET/M_PI) 
#define WGS84_RADIUS 6378137.0 
#define POINTS_PER_METER (MERCATOR_RADIUS/WGS84_RADIUS) 

double MyMetersPerMapPointAtLatitude(double latitude) { 
    return 1.0/(POINTS_PER_METER/cos(latitude * M_PI/180.0)); 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     double latitude = 33.861315; 
     for (int i = 0; i < 100; i++) { 
      double a = MKMetersPerMapPointAtLatitude(latitude); 
      double b = MyMetersPerMapPointAtLatitude(latitude); 

      NSLog(@"%f %f", a, b); 
      latitude += .1; 
     } 
    } 
    return 0; 
} 

Druckt die folgende

2015-05-19 09:13:00.334 Test[92619:5369062] 0.123522 0.123969 
2015-05-19 09:13:00.335 Test[92619:5369062] 0.123379 0.123824 
2015-05-19 09:13:00.335 Test[92619:5369062] 0.123236 0.123678 
2015-05-19 09:13:00.335 Test[92619:5369062] 0.123092 0.123532 
2015-05-19 09:13:00.335 Test[92619:5369062] 0.122948 0.123386 
2015-05-19 09:13:00.335 Test[92619:5369062] 0.122804 0.123239 
2015-05-19 09:13:00.335 Test[92619:5369062] 0.122659 0.123092 
...etc 
+1

Was genau denkst du funktioniert nicht? – jny

+0

Nun, es ist nicht ganz genau, aber ich bin mir nicht sicher warum. Es scheint, dass meine Funktion fast genau ist, wenn ich 0,3 zum Breitengrad hinzufüge ... – Shaun

+0

Bei einer Vermutung, etwas damit zu tun, dass die Erde ein abgeflachtes Ellipsoid ist, keine perfekte Kugel? Es ist dicker um den Äquator. – Tommy

Antwort

4

Für den Anfang, wir Ihre Funktion neu anordnen kann es ein bisschen besser lesbar zu machen:

double MyMetersPerMapPointAtLatitude(double latitude) { 
    return cos(latitude * M_PI/180.0)/POINTS_PER_METER; 
} 

Nun ist die Frage, wie Tommy Punkte aus, dass du nicht für die Abflachung der Erde verantwortlich bist. Sie können das tun, mit:

double f = 1/298.257223563; // WGS84 flattening 
double MyMetersPerMapPointAtLatitude(double latitude) { 
    return (1-f) * cos(latitude * M_PI/180.0)/POINTS_PER_METER; 
} 

, dass der Fehler wird bis zu dem Punkt, wo ich es Rundung und Abschneiden zuschreiben würde.