MKMetersPerMapPointAtLatitude 背后的数学
Posted
技术标签:
【中文标题】MKMetersPerMapPointAtLatitude 背后的数学【英文标题】:Math Behind MKMetersPerMapPointAtLatitude 【发布时间】:2015-05-19 13:17:30 【问题描述】:我正在尝试将一些 Apple 映射代码转换为 Java。除了对MKMetersPerMapPointAtLatitude
的几次调用之外,我的大部分内容都正确转换了
我有一个非常接近的解决方案……但它并不准确,我不确定为什么不这样做。有什么想法吗?
#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;
打印出以下内容
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
【问题讨论】:
你到底认为什么不起作用? 嗯,它不太准确,但我不知道为什么。如果我在纬度上加上 0.3,我的函数似乎几乎是准确的...... 猜测,这与地球是一个扁椭球体而不是一个完美的球体这一事实有关吗?它在赤道附近更胖。 【参考方案1】:对于初学者,我们可以重新排列您的函数以使其更具可读性:
double MyMetersPerMapPointAtLatitude(double latitude)
return cos(latitude * M_PI / 180.0) / POINTS_PER_METER;
现在,正如汤米指出的那样,问题在于您没有考虑地球变平的原因。你可以这样做:
double f = 1/298.257223563; // WGS84 flattening
double MyMetersPerMapPointAtLatitude(double latitude)
return (1-f) * cos(latitude * M_PI / 180.0) / POINTS_PER_METER;
这将错误降低到我将其归因于舍入和截断的程度。
【讨论】:
以上是关于MKMetersPerMapPointAtLatitude 背后的数学的主要内容,如果未能解决你的问题,请参考以下文章