MKMapkit XY координаты в лат - PullRequest
1 голос
/ 28 июня 2011

Я работал над проектом, который включает добавление большого количества оверлеев в mkmapkit.

В настоящее время у меня есть рабочая формула для преобразования широты / долготы в 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;
}

Обе вышеперечисленные функции протестированы и отлично работают в моем проекте.

Мне нужно создать - (с плавающей точкой) CalculateLatitudeFromY: (с плавающей точкой) Y zoom: (int) метод масштабирования.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 28 июня 2011

Вы должны будете выполнить преобразование в 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

Я думаю, что две ключевые части информации, которые вы упускаете, это обратная логарифм и грех - е ^ х и атан соответственно.

Второй метод 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);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...