Я новачок у d3 - спробую пояснити, наскільки я це розумію, але я не впевнений, що все в мене правильно.
Секрет полягає в тому, що деякі методи будуть діяти на картографічному просторі (широта, довгота), а інші - на декартовому просторі (x, y на екрані). Картографічний простір (наша планета) є (майже) сферичним, декартовий простір (екран) плоский - для того, щоб відобразити один над одним потрібний алгоритм, який називається проекцією . Цей простір занадто короткий, щоб заглибитись у захоплюючий предмет проекцій і як вони спотворюють географічні особливості, щоб перетворити сферичну в площину; деякі призначені для збереження кутів, інші - заощадження відстаней тощо - завжди є компроміс (Майк Босток має величезну колекцію прикладів ).
У d3 об’єкт проекції має властивість / сеттер центра, задану в одиницях карти:
projection.center ([розташування])
Якщо центр вказаний, встановлює центр проекції на вказане місце, двоелементний масив довготи та широти у градусах та повертає проекцію. Якщо центр не вказано, повертає поточний центр, який за замовчуванням становить ⟨0 °, 0 °⟩.
Існує також переклад, поданий у пікселях - там, де центр проекції стоїть відносно полотна:
projection.translate ([точка])
Якщо вказана точка, встановлюється зміщення перекладу проекції на вказаний двоелементний масив [x, y] і повертає проекцію. Якщо точка не вказана, повертає поточний зсув перекладу, який за замовчуванням дорівнює [480, 250]. Зсув перекладу визначає піксельні координати центру проекції. Зсув перекладу за замовчуванням розміщує ⟨0 °, 0 °⟩ в центрі області 960 × 500.
Коли я хочу зосередити функцію на полотні, мені подобається встановити проектний центр на центр вікна, що обмежує функцію - це працює для мене, коли для моєї країни (Бразилія) використовується Меркатор (WGS 84, який використовується в картах Google), ніколи не тестували за допомогою інших проекцій і півкуль. Можливо, вам доведеться вносити корективи в інші ситуації, але якщо ви дотримуєтесь цих основних принципів, вам буде добре.
Наприклад, задані проекція та шлях:
var projection = d3.geo.mercator()
.scale(1);
var path = d3.geo.path()
.projection(projection);
bounds
Метод з path
повертає обмежує прямокутник в пікселях . Використовуйте його, щоб знайти правильну шкалу, порівнюючи розмір у пікселях із розміром у одиницях карти (0,95 дає 5% -ний запас над найкращим розміром для ширини чи висоти). Основна геометрія тут, обчислення ширини / висоти прямокутника, заданих діагонально протилежними кутами:
var b = path.bounds(feature),
s = 0.9 / Math.max(
(b[1][0] - b[0][0]) / width,
(b[1][1] - b[0][1]) / height
);
projection.scale(s);
Використовуйте d3.geo.bounds
метод для пошуку обмежувального поля в одиницях карти:
b = d3.geo.bounds(feature);
Встановіть центр виступу на центр обмежувальної коробки:
projection.center([(b[1][0]+b[0][0])/2, (b[1][1]+b[0][1])/2]);
Використовуйте translate
метод, щоб перемістити центр карти до центру полотна:
projection.translate([width/2, height/2]);
На даний момент у вас має бути функція в центрі карти, збільшена із 5% запасом.