最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to display property text on mouseover in d3 map - Stack Overflow

programmeradmin1浏览0评论

I am new to d3 and trying to figure out how to get a property ("NAME") to show up when hovering over a polygon in a map. I am aware that I should be doing something along the lines of .on("mouseover", function(d,i) { some function that returns properties.NAME } but can't figure out where to go from there. Here is the js as written, which just statically places the NAME property on each polygon:

        <script>

        var width = 950,
        height = 650;

        var projection = d3.geo.albers()
        .scale(120000)
        .center([22.85, 40.038]);

        var path = d3.geo.path()
        .projection(projection);

        var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height);

        d3.json("newnabes.json", function(error, topology) {
                var nabes = topojson.object(topology, topology.objects.temp);

                svg.selectAll("path")
                .data(nabes.geometries)
                .enter().append("path")
                .attr("d", path);

                svg.selectAll(".subunit-label")
                .data(nabes.geometries)
                .enter().append("text")
                .attr("class", function(d) { return "subunit-label " + d.id; })
                .attr("transform", function(d) { return "translate(" + path.centroid(d) + ")"; })
                .attr("dy", ".35em")
                .text(function(d) { return d.properties.NAME; });
            });

        </script>

Here is a small chunck of the json

{"type":"Topology",
  "transform":{
  "scale":[0.00003242681758896625,0.000024882264664420337],
  "translate":[-75.28010087738252,39.889167081829875]},
  "objects":{
    "temp":{
      "type":"GeometryCollection",
      "geometries":[{
         "type":"Polygon",
         "id":1,
         "arcs":[[0,1,2,3,4,5,6]],
         "properties":{"NAME":"Haddington"}
       },{
         "type":"Polygon",
         "id":2,
         "arcs":[[7,8,9,10,-3,11]],
         "properties":{"NAME":"Carroll Park"}
       }...

Thanks

I am new to d3 and trying to figure out how to get a property ("NAME") to show up when hovering over a polygon in a map. I am aware that I should be doing something along the lines of .on("mouseover", function(d,i) { some function that returns properties.NAME } but can't figure out where to go from there. Here is the js as written, which just statically places the NAME property on each polygon:

        <script>

        var width = 950,
        height = 650;

        var projection = d3.geo.albers()
        .scale(120000)
        .center([22.85, 40.038]);

        var path = d3.geo.path()
        .projection(projection);

        var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height);

        d3.json("newnabes.json", function(error, topology) {
                var nabes = topojson.object(topology, topology.objects.temp);

                svg.selectAll("path")
                .data(nabes.geometries)
                .enter().append("path")
                .attr("d", path);

                svg.selectAll(".subunit-label")
                .data(nabes.geometries)
                .enter().append("text")
                .attr("class", function(d) { return "subunit-label " + d.id; })
                .attr("transform", function(d) { return "translate(" + path.centroid(d) + ")"; })
                .attr("dy", ".35em")
                .text(function(d) { return d.properties.NAME; });
            });

        </script>

Here is a small chunck of the json

{"type":"Topology",
  "transform":{
  "scale":[0.00003242681758896625,0.000024882264664420337],
  "translate":[-75.28010087738252,39.889167081829875]},
  "objects":{
    "temp":{
      "type":"GeometryCollection",
      "geometries":[{
         "type":"Polygon",
         "id":1,
         "arcs":[[0,1,2,3,4,5,6]],
         "properties":{"NAME":"Haddington"}
       },{
         "type":"Polygon",
         "id":2,
         "arcs":[[7,8,9,10,-3,11]],
         "properties":{"NAME":"Carroll Park"}
       }...

Thanks

Share Improve this question edited Jan 25, 2013 at 16:30 gaborsch 15.8k6 gold badges40 silver badges50 bronze badges asked Jan 25, 2013 at 16:05 rysloanrysloan 6155 silver badges19 bronze badges 1
  • Possibly of help: stackoverflow./questions/12723018/… – Lars Kotthoff Commented Jan 25, 2013 at 18:46
Add a ment  | 

1 Answer 1

Reset to default 4

So I figured it out, courtesy of: Show data on mouseover of circle

The simplest solution is to just append the names to the svg title attribute:

svg.selectAll("path")
 .data(nabes.geometries)
 .append("svg:title")
 .attr("class", function(d) { return "path " + d.id; })
 .attr("transform", function(d) { return "translate(" + path.centroid(d) + ")"; })
 .attr("dy", ".35em")
 .text(function(d) { return d.properties.NAME; });

Still investigating a more stylish solution to the problem (eg tipsy).

发布评论

评论列表(0)

  1. 暂无评论