2015-05-19 9 views
14

Sto provando a convertire un codice di mappatura Apple in Java. Ho convertito la maggior parte correttamente tranne alcune chiamate a MKMetersPerMapPointAtLatitudeMath Behind MKMetersPerMapPointAtLatitude

Ho una soluzione molto vicina ... ma non è esatto e non sono sicuro perché no. Qualche idea?

#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; 
} 

stampa il seguente

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

Che cosa pensi che non funzioni? – jny

+0

Beh, non è abbastanza preciso, ma non sono sicuro del perché. Sembra che la mia funzione sia quasi precisa se aggiungo 0,3 alla latitudine ... – Shaun

+0

Ad una ipotesi, qualcosa ha a che fare con il fatto che la Terra è un ellissoide oblato, non una sfera perfetta? È più grasso attorno all'equatore. – Tommy

risposta

4

Per cominciare, siamo in grado di riorganizzare la funzione per renderlo un po 'più leggibile:

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

Ora, il problema è, come punti di Tommy fuori, che non stai tenendo conto dell'appiattimento della Terra. È possibile farlo con:

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

che ottiene l'errore fino al punto in cui vorrei attribuire a arrotondamento e troncamento.