Je suis nouveau dans la d3 - je vais essayer d'expliquer comment je comprends, mais je ne suis pas sûr d'avoir tout compris.
Le secret est de savoir que certaines méthodes vont opérer sur l'espace cartographique (latitude,longitude) et d'autres sur l'espace cartésien (x,y sur l'écran). L'espace cartographique (notre planète) est (presque) sphérique, l'espace cartésien (écran) est plat - pour faire correspondre l'un à l'autre, vous avez besoin d'un algorithme, qui est appelé projection . Cet espace est trop court pour approfondir le sujet fascinant des projections et la manière dont elles déforment les caractéristiques géographiques afin de transformer la sphère en plan ; certains sont conçus pour conserver les angles, d'autres les distances et ainsi de suite - il y a toujours un compromis (Mike Bostock a une une énorme collection d'exemples ).
![enter image description here]()
Dans d3, l'objet de projection a une propriété/un paramètre de centre, donné en unités de carte :
projection.center([location])
Si center est spécifié, définit le centre de la projection à l'emplacement spécifié, un tableau à deux éléments de longitude et de latitude en degrés et renvoie la projection. Si center n'est pas spécifié, renvoie le centre actuel qui a pour valeur par défaut ⟨0°,0°⟩.
Il y a aussi la translation, donnée en pixels - où se trouve le centre de projection par rapport à la toile :
projection.translate([point])
Si point est spécifié, définit le décalage de translation de la projection dans le tableau à deux éléments [x, y] spécifié et renvoie la projection. Si point n'est pas spécifié, renvoie le décalage de translation actuel, qui est par défaut de [480, 250]. Le décalage de translation détermine les coordonnées en pixels du centre de la projection. Le décalage de translation par défaut place ⟨0°,0°⟩ au centre d'une zone de 960×500.
Lorsque je veux centrer un élément dans le canevas, je préfère définir le centre de projection au centre de la boîte de délimitation de l'élément. mercator (WGS 84, utilisé dans google maps) pour mon pays (Brésil), jamais testé avec d'autres projections et hémisphères. Vous devrez peut-être faire des ajustements pour d'autres situations, mais si vous respectez ces principes de base, tout ira bien.
Par exemple, étant donné une projection et un chemin :
var projection = d3.geo.mercator()
.scale(1);
var path = d3.geo.path()
.projection(projection);
Le site bounds
méthode de path
renvoie la boîte de délimitation en pixels . Utilisez-le pour trouver l'échelle correcte, en comparant la taille en pixels avec la taille en unités cartographiques (0,95 vous donne une marge de 5% par rapport à la meilleure adaptation pour la largeur ou la hauteur). Géométrie de base ici, calcul de la largeur/hauteur d'un rectangle avec des coins diagonalement opposés :
var b = path.bounds(feature),
s = 0.95 / Math.max(
(b[1][0] - b[0][0]) / width,
(b[1][1] - b[0][1]) / height
);
![enter image description here]()
Utilisez le d3.geo.bounds
pour trouver la boîte de délimitation en unités cartographiques :
b = d3.geo.bounds(feature);
Définissez le centre de la projection au centre de la boîte de délimitation :
projection.center([(b[1][0]+b[0][0])/2, (b[1][1]+b[0][1])/2]);
Utilisez le translate
pour déplacer le centre de la carte vers le centre de la toile :
projection.translate([width/2, height/2]);
À présent, l'élément doit se trouver au centre de la carte, avec une marge de 5 %.