Почему точность моего перевода долготы в широту уменьшается ниже экватора?

Я получил некоторую помощь с предыдущим вопросом о том, как перевести мою карту на заданные значения долготы и широты, здесь: Как я могу использовать перевод SVG для центрирования проекции d3.js на заданные значения широты и долготы? Я написал метод, который перемещается в указанное место в заданном масштабе:

zoomTo: function(point, scale) {
    var lat = -SFMap.projection(point)[0] * scale;
    var lon = -SFMap.projection(point)[1] * scale;
    var x = (SFMap.config.width / 2) + lat;
    var y = (SFMap.config.height / 2) + lon;

    SFMap.g
        .transition()
        .duration(500)
        .attr("transform", "translate("+ x +","+ y +") scale("+ scale +")");
}

Я прекрасно могу «масштабировать» Европу, но когда я переезжаю в Джакарту, Индонезия, центральная точка четко лежит над океаном.

Лондон — SFMap.zoomTo([0.1062, 51.5171], 1300) Лондон

ДжакартаSFMap.zoomTo([106.7500, 6.1333], 1300); Джакарта

И эта проблема подчеркивается, если я пробую Австралию - я ее даже не вижу.

Я должен отметить, что я использую d3 для визуализации проекции Меркатора и получения значений долготы и широты из поиска Google.

Пожалуйста, может кто-нибудь предложить, почему это происходит? Я знаю, что за кулисами много математики, но я надеялся, что d3 позаботится об этом.

Изменить:

Прочитав комментарий Пабло, я решил удалить из уравнения свой метод zoomTo() и просто проверить, может ли d3 правильно center([106.7500, 6.1333]) работать на Jarkata при фиксированном scale(1000), но это не так; он все еще сбрасывает вас в океан.


person Check12    schedule 30.05.2013    source источник
comment
Вы возвращаете группу в масштаб проекции между трансформациями? Когда вы применяете проекцию, вы используете масштаб проекции в качестве отправной точки, а не текущий масштаб фигуры. Ошибки совпадают? Если вы идете от A, B, а затем к C, у вас будет та же ошибка, что и при переходе от B, A, а затем C?   -  person Pablo Navarro    schedule 30.05.2013
comment
@PabloNavarro, у тебя интересный момент. Я не передаю корректировки масштаба обратно в SFMap.projection(), потому что я полагал, что мне это не нужно, если я рассчитывал масштаб влияния на перевод в моем методе преобразования, zoomTo(), как показано выше. Я изучу передачу scale в проекцию, прежде чем использовать ее значения, когда вернусь домой с работы. Я отвечу соответственно. :) Большое спасибо.   -  person Check12    schedule 30.05.2013


Ответы (1)


К своему стыду, я обнаружил глупую ошибку, связанную с использованием координат долготы и широты.

Хотя я передавал координаты projection([106.7500, 6.1333]) на обратной стороне после получения их из Google, я не заметил важности ориентации (или основного направления), которую также давал Google.

6.1333° S, 106.7500° E означает, что Джакарта находится на 6,1333 градуса южнее от экватора.

Итак, моя проблема возникла из-за того, что я не передал projection() отрицательное значение для южной координаты - это означает, что моя проекция всегда должна была быть на 6,1333 градуса выше экватора, когда она должна была быть ниже.

person Check12    schedule 31.05.2013