MKMapkit XY坐标到lat lon

时间:2011-06-27 22:45:00

标签: iphone objective-c math mapkit

我一直在做一个涉及在mkmapkit中添加大量叠加层的项目。

我目前有一个将lat / long转换为xy的工作公式,但是我发现我现在需要做相反的事情。

我目前使用的代码是:

-(CGPoint)calculateXYLatitude:(float)latitude longitude:(float)longitude zoom:(int)zoom
{
    CGPoint p;
    float zm = (float)zoom;
    float offset =  (pow(2.0, zm-1.0));
    float radius = offset/M_PI;

    p.x = (offset + radius * longitude * M_PI / 180.0);
    p.y = (offset - radius * logf((1.0 + sinf(latitude * M_PI / 180.0)) / (1.0 - sinf(latitude * M_PI / 180.0))) / 2.0);

    return p;
}

我已成功设法反转此功能的第一部分,这只是让我难倒的最后一行。

到目前为止,我有:

-(float)calculateLongitudeFromX:(float)x zoom:(int)zoom
{
    float zm = (float)zoom;
    float offset =  (pow(2.0, zm-1.0));
    float radius = offset/M_PI;

    float longitude = (x - offset) * 180 / radius / M_PI;
    return longitude;
}

上述两个功能都经过测试,在我的项目中完美运行。

我需要创建 - (float)calculateLatitudeFromY:(float)Y zoom:(int)zoom方法。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你必须自己转换为obj-c,但是现在你去了:

http://groups.google.com/group/google-maps-api/browse_thread/thread/8c0a5291c22c0946?pli=1

另外,请查看此页面的来源: http://code.google.com/apis/maps/documentation/javascript/examples/map-coordinates.html

我认为你遗漏的两个关键信息是log和sin的反转 - 分别是e ^ x和atan。

下面的第二个Javascript方法是您要问的问题的答案:

MercatorProjection.prototype.fromLatLngToPoint = function(latLng, opt_point) {
  var me = this;

  var point = opt_point || new google.maps.Point(0, 0);

  var origin = me.pixelOrigin_;
  point.x = origin.x + latLng.lng() * me.pixelsPerLonDegree_;
  // NOTE(appleton): Truncating to 0.9999 effectively limits latitude to
  // 89.189.  This is about a third of a tile past the edge of the world tile.
  var siny = bound(Math.sin(degreesToRadians(latLng.lat())), -0.9999, 0.9999);
  point.y = origin.y + 0.5 * Math.log((1 + siny) / (1 - siny)) * -me.pixelsPerLonRadian_;
  return point;
};

MercatorProjection.prototype.fromPointToLatLng = function(point) {
  var me = this;

  var origin = me.pixelOrigin_;
  var lng = (point.x - origin.x) / me.pixelsPerLonDegree_;
  var latRadians = (point.y - origin.y) / -me.pixelsPerLonRadian_;
  var lat = radiansToDegrees(2 * Math.atan(Math.exp(latRadians)) - Math.PI / 2);
  return new google.maps.LatLng(lat, lng);
};