Calculer SVG Chemin du Centre de gravité avec D3.js
Je suis en utilisant le format SVG situé à http://upload.wikimedia.org/wikipedia/commons/3/32/Blank_US_Map.svg dans un projet et interagir avec elle, avec d3.js. J'aimerais créer un cliquez pour effet de zoom comme http://bl.ocks.org/2206590, cependant que l'exemple s'appuie sur le chemin d'accès des données stockées dans un objet JSON pour calculer le centre de gravité. Est-il possible de charger les données de la trajectoire en d3 à partir d'un SVG pour obtenir le centre de gravité?
Mon (hackish) tentative à ce jour:
function get_centroid(sel){
var coords = d3.select(sel).attr('d');
coords = coords.replace(/*[LC] */g,'],[').replace(/*M */g,'[[[').replace(/*z */g,']]]').replace(//g,'],[');
return d3.geo.path().centroid({
"type":"Feature",
"geometry":{"type":"Polygon","coordinates":JSON.parse(coords)}
});
}
Cela semble fonctionner sur certains états, comme le Missouri, mais d'autres, comme Washington échouer parce que mon SVG données d'analyse est si rudimentaire. Ne d3 soutien à quelque chose comme ça en natif?
- Voici le interface DOM de SVG chemins. Il pourrait être un bon point de départ.
Vous devez vous connecter pour publier un commentaire.
La D3 toutes les fonctions semblent partir du principe que vous débutez avec GeoJSON. Cependant, je ne pense pas que vous devez le centre de gravité de cette - ce que vous avez vraiment besoin est la boîte englobante, et c'est heureusement disponible directement à partir de l'SVG interface DOM:
C'est en fait légèrement mieux que le vrai centre de gravité pour le but de zoom, car elle permet d'éviter une certaine projection problèmes que vous pourriez rencontrer.
Accepté la réponse a été très bien fonctionné pour moi jusqu'à ce que j'ai testé à Bord. Je ne peux pas commenter car je n'ai pas assez de karma, ou que ce soit, mais a l'aide de cette solution, et trouvé un problème avec Microsoft Edge, qui n'utilise pas x ou y, juste en haut/gauche/bas/droite, etc.
Donc le code ci-dessus devrait être: