Comment puis-je utiliser SVG traduire à un centre de d3.js projection à des valeurs de latitude et longitude?
Je suis à l'aide de d3 pour rendre une projection de Mercator d'un GeoJSON carte du monde.
Je voudrais être en mesure d'utiliser d3 à l'échelle et déplacer la carte pour connaître la latitude et la longitude des valeurs comme les étapes de l'utilisateur par le biais de mon application.
projection.center
(https://github.com/mbostock/d3/wiki/Geo-Projections#wiki-center) fait ce que je voudrais, combiné avec transition().duration()
, mais cela nécessite de redessiner la carte et, par conséquent, semble cher de le répéter. Je voudrais utiliser le natif translate()
et scale()
méthodes de SVG (https://developer.mozilla.org/en-US/docs/SVG/Attribute/transform).
J'ai trouvé quelques exemples utiles, comme Mike Bostock (http://bl.ocks.org/mbostock/4699541), et des questions utiles, comme ce qui suit à propos de centrage d'une carte pour un GeoJSON objet (Centre d'une carte en d3 donné un geoJSON objet), mais j'ai du mal à envelopper ma tête autour d'eux.
Svp quelqu'un pourrait-il m'aider à le centre de ma projection à des valeurs de latitude et longitude en utilisant SVG est transform="translate(x, y)"
?
Merci beaucoup à l'avance.
Modifier
@Lars: tout d'Abord, je vous remercie. J'ai essayé votre suggestion, et le mouvement se produit, mais la projection semble aller trop loin. J'ai joint une capture d'écran et ma projection code, ci-dessous:
var SFMap = {
initialise: function() {
var width = "752";
var height = "420";
SFMap.projection = d3.geo.mercator()
.scale(100)
.translate([width/2, height/2])
.center([0, 0]);
SFMap.path = d3.geo.path()
.projection(SFMap.projection);
SFMap.svg = d3.select("#sf__map")
.append("svg")
.attr("width", width)
.attr("height", height);
SFMap.g = SFMap.svg.append("g");
d3.json("world-110m.topo.json", SFMap.draw);
},
draw: function(error, topology) {
SFMap.g
.selectAll("path")
.data(topojson.feature(topology, topology.objects.countries)
.features)
.enter()
.append("path")
.attr("d", SFMap.path)
.attr("class", "feature");
},
Ci-dessus se produit lorsque translate
ing à Londres - 51.5171° N, 0.1062° W - en utilisant le code suivant:
var coordinates = SFMap.projection([0.1062, 51.5171]);
SFMap.g.attr("transform", "translate(" + (-coordinates[0]) + "," + (-coordinates[1]) + ")");
J'ai aussi essayé en inversant les valeurs un deuxième temps.
OriginalL'auteur Check12 | 2013-05-28
Vous devez vous connecter pour publier un commentaire.
En supposant que le centre de votre projection est (0,0), tout ce que vous devez faire est de donner les coordonnées du point que vous voulez centrer votre fonction de projection (à traduire dans les coordonnées de l'utilisateur) et de donner à l'inverse de ce que
translate
. Quelque chose commeSi vous avez traduit la projection ainsi, vous avez besoin de prendre cela en compte, par exemple,
La chose qui interfère voici la traduction que vous ajoutez à la projection elle-même. Je vais mettre à jour la réponse. Aussi, votre largeur et la hauteur doivent vraiment être des nombres, pas des chaînes de caractères.
Qui était-il! Je vous remercie pour votre aide, et pour repérer le type d'erreur. 🙂
OriginalL'auteur Lars Kotthoff