Calculer SVG Path Centroid avec D3.js

J'utilise le SVG situé à http://upload.wikimedia.org/wikipedia/commons/3/32/Blank_US_Map.svg dans un projet et en interagissant avec d3.js. Je voudrais créer un clic pour agrandir l'effet comme http://bl.ocks.org/2206590 , mais cet exemple repose sur les données du chemin stockées dans un objet JSON pour calculer le centroïde. Existe-t-il un moyen de charger des données de chemin dans d3 à partir d'un SVG existant pour obtenir le centroïde?

Ma tentative (hackish) jusqu'à présent:

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 échouent car mon analyse de données SVG est si rudimentaire. Est-ce que d3 prend en charge quelque chose de tel nativement?

Les fonctions D3 semblent toutes présumer que vous commencez par GeoJSON. Cependant, je ne pense pas vraiment que vous ayez besoin du centroïde pour cela – ce dont vous avez vraiment besoin, c'est la boîte de délimitation, et heureusement, cela est disponible directement depuis l'interface DOM de SVG:

 function getBoundingBoxCenter (selection) { // get the DOM element from a D3 selection // you could also use "this" inside .each() var element = selection.node(); // use the native SVG interface to get the bounding box var bbox = element.getBBox(); // return the center of the bounding box return [bbox.x + bbox.width/2, bbox.y + bbox.height/2]; } 

C'est en fait un peu mieux que le véritable centroïde dans le but de zoom, car il évite certains problèmes de projection que vous pourriez rencontrer autrement.