我一直在做一个涉及在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方法。
非常感谢任何帮助。
答案 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);
};