2011-06-27 160 views
1

我一直在工作一個項目,涉及添加大量的覆蓋到mkmapkit。MKMapkit XY座標到緯度

我目前有一個工作公式將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)縮放方法。

任何幫助將不勝感激。

+0

你轉換屏幕座標地圖座標? –

+0

不,我將地圖上的lat和lon轉換爲google maps x和y座標系 –

+0

我不知道MapKit直接暴露了Google的Mercator座標。 (還要注意CGPoint使用浮點數,它只能精確到180度左右的1米左右)。 –

回答

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); 
}; 
+0

如果我的回答很有幫助,您是否會像在帖子左側的投票箭頭下勾選勾號那樣友善?謝謝 : ) – Steve