рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рдЧреНрд▓реЛрдм - рдПрд╕рд╡реАрдЬреА рдмрдирд╛рдо рдХреИрдирд╡рд╕

рд╢реБрдн рджрд┐рди, рдкреНрд░рд┐рдп рдкрд╛рдардХ! рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдПрдХ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рд╣реЙрд░рдкрд▓реЗрдЯ рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдерд╛, рдЕрдм рдореИрдВ рдХрд╛рд░реНрдп рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдФрд░ рдкреГрдереНрд╡реА рдХреЗ рддреАрди-рдЖрдпрд╛рдореА рдореЙрдбрд▓ рдХреА рдУрд░ рдмрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЧреНрд▓реЛрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреНрд▓реЛрдм рдХрд░реЗрдВрдЧреЗ: рдПрд╕рд╡реАрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдХреИрдирд╡рд╕ рд╕рдВрд╕реНрдХрд░рдгред рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо d3.js рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдореЗрд░реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ, рдмреНрд▓реВ рдкреНрд▓реИрдиреЗрдЯ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

рдЧреНрд░рд╣ рдкреГрдереНрд╡реА

рдФрд░ рдХреИрд╕реЗ рдорд╣рд╛рджреНрд╡реАрдкреЛрдВ рдФрд░ рдорд╣рд╛рд╕рд╛рдЧрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рджреБрдирд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╢реБрд░реБрдЖрдд


рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЬрд┐рдпреЛрдбреЗрдЯрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣, рд╣рдо рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП TopoJSON рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрдк рдЗрд╕реЗ "рдХрд╛рд░реНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдореИрдЯрд░реНрд╕" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ TopoJSON рдлрд╝рд╛рдЗрд▓ world-110m.json m.json рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 1: 110,000,000, рдпрд╛ 1 рд╕реЗрдореА = 1,100 рдХрд┐рдореА (1 1, = 1,736 рдореАрд▓) рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдореИрдк рд╣реИ рдФрд░ рдлреЙрд░реНрдо id world-110m-country-names.tsv рдирд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ world-110m-country-names.tsv рдирд╛рдоред рджреЗрд╢ рдХрд╛ рдирд╛рдоред рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд╣рд░реА рдлрд╝рд╛рдЗрд▓ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдирд╛рдореЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ, рдЖрдк рджреБрдирд┐рдпрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЯрд┐рдкреНрдкрдгреА:
рд╣рдорд╛рд░реА рдкрд╕рдВрдж рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░, рдХреБрдЫ рдЫреЛрдЯреЗ рджреЗрд╢ рдЬреНрдпрд╛рдорд┐рддреАрдп рдЕрд░реНрдереЛрдВ рдореЗрдВ "рдкрддрд┐рдд" рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ 174 рджреЗрд╢ рд╣реИрдВред

рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЧреНрд▓реЛрдм рдбреНрд░рд╛ рдХрд░реЗрдВ


рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рдЧреНрд▓реЛрдм рд╣реЛрдЧрд╛ рдЬреЛ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Nice title</title> <script src="http://d3js.org/d3.v3.min.js"></script> <script src="http://d3js.org/queue.v1.min.js"></script> <script src="http://d3js.org/topojson.v1.min.js"></script> </head> <style> Your awesome CSS </style> <body> <h1>Cool Header</h1> <script> Your awesome d3.js code </script> </body> </html> 


рдореБрдЦреНрдп рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ DOM рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред

  var width = 600, height = 500, sens = 0.25, focused; //Setting projection var projection = d3.geo.orthographic() .scale(245) .rotate([0, 0]) .translate([width / 2, height / 2]) .clipAngle(90); var path = d3.geo.path() .projection(projection); //SVG container var svg = d3.select("body").append("svg") .attr("width", width) .attr("height", height); //Adding water svg.append("path") .datum({type: "Sphere"}) .attr("class", "water") .attr("d", path); var countryTooltip = d3.select("body").append("div").attr("class", "countryTooltip"), countryList = d3.select("body").append("select").attr("name", "countries"); 

sens рдЪрд░ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рд░реЛрдЯреЗрд╢рди рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ focused рдЙрдкрдпреЛрдЧ рдЪрдпрдирд┐рдд (рдХреЗрдВрджреНрд░рд┐рдд) рджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд░реВрдк focused рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдСрд░реНрдереЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдкреНрд░рдХреНрд╖реЗрдкрдг ред TheclipAngle () рд╡рд┐рдзрд┐ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╣рдо рдЧреЛрд▓реЗ рдХреЗ рдХрд┐рд╕ рднрд╛рдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ (рдпрд╛ рдмрд▓реНрдХрд┐ рджреЗрдЦреЗрдВрдЧреЗ), рдЖрдк рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: рдЫреЛрдЯреЗ рд╡реГрддреНрдд рдХреА рдХрддрд░рди ред рдмрд╛рдХреА рдХреЛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдХреНрдпреВ.рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

  queue() .defer(d3.json, "data/world-110m.json") .defer(d3.tsv, "data/world-110m-country-names.tsv") .await(ready); 

рдЕрдм рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕реЗ ready рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреА рдбреНрд░реЙрдкрдбрд╛рдЙрди рд╕реВрдЪреА рдореЗрдВ рджреЗрд╢ рдХреЗ рдирд╛рдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реНрд╡ рдХреЗ рджреЗрд╢реЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

  function ready(error, world, countryData) { var countryById = {}, countries = topojson.feature(world, world.objects.countries).features; //Adding countries to select countryData.forEach(function(d) { countryById[d.id] = d.name; option = countryList.append("option"); option.text(d.name); option.property("value", d.id); }); //Drawing countries on the globe var world = svg.selectAll("path.land") .data(countries) .enter().append("path") .attr("class", "land") .attr("d", path) 

рдЖрдЗрдП рдорд╛рдЙрд╕ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ drag.origin () рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рдПрдХ рддрддреНрд╡ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддреЗ рд╕рдордп, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдЕрдХреНрд╖рд╛рдВрд╢ рдФрд░ рджреЗрд╢рд╛рдВрддрд░ рдореЗрдВ "рдореВрд▓" (рд╡рд╛рд╕реНрддрд╡рд┐рдХ) рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

  //Drag event .call(d3.behavior.drag() .origin(function() { var r = projection.rotate(); return {x: r[0] / sens, y: -r[1] / sens}; }) .on("drag", function() { var rotate = projection.rotate(); projection.rotate([d3.event.x * sens, -d3.event.y * sens, rotate[2]]); svg.selectAll("path.land").attr("d", path); svg.selectAll(".focused").classed("focused", focused = false); })) //Mouse events .on("mouseover", function(d) { countryTooltip.text(countryById[d.id]) .style("left", (d3.event.pageX + 7) + "px") .style("top", (d3.event.pageY - 15) + "px") .style("display", "block") .style("opacity", 1); }) .on("mouseout", function(d) { countryTooltip.style("opacity", 0) .style("display", "none"); }) .on("mousemove", function(d) { countryTooltip.style("left", (d3.event.pageX + 7) + "px") .style("top", (d3.event.pageY - 15) + "px"); }); 

рджреЗрд╢ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рджреЗрд╢ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ id рдХреЗ рдирд╛рдо рд╕реЗ рдЬрд┐рдпреЛрдбрд╛рдЯрд╛ рд▓реМрдЯрд╛рдПред рдЕрд╕рд▓ рдореЗрдВ, рдпрд╣рд╛рдБ рд╡рд╣ рд╣реИред

  function country(cnt, sel) { for(var i = 0, l = cnt.length; i < l; i++) { if(cnt[i].id == sel.value) {return cnt[i];} } }; 

рдЕрдм рдЖрдк рд╕реАрдзреЗ рд╕реВрдЪреА рд╕реЗ рдЪреБрдиреЗ рдЧрдП рджреЗрд╢ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ (рдХреЗрдВрджреНрд░рд┐рдд) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

  //Country focus on option select d3.select("select").on("change", function() { var rotate = projection.rotate(), focusedCountry = country(countries, this), p = d3.geo.centroid(focusedCountry); svg.selectAll(".focused").classed("focused", focused = false); //Globe rotating (function transition() { d3.transition() .duration(2500) .tween("rotate", function() { var r = d3.interpolate(projection.rotate(), [-p[0], -p[1]]); return function(t) { projection.rotate(r(t)); svg.selectAll("path").attr("d", path) .classed("focused", function(d, i) { return d.id == focusedCountry.id ? focused = d : false; }); }; }) .transition(); })(); }); 

рдпрд╣рд╛рдВ, рд╕рднреА рдирдордХ рдЯреНрд░рд╛рдВрд╕реНрдЬрд╝рд┐рдЯ рдореЗрдВ рд╣реИрдВред рдЯреНрд╡рд┐рди () , рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди (рд░реЛрдЯреЗрд╢рди) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдХрддрд╛рдИ, рдиреАрд▓реА рдЧреЗрдВрдж рдХреЛ рдХрддрд╛рдИред

рдпрд╣ рдмрд╛рдд рд╣реИ - рдПрд╕рд╡реАрдЬреА рдЧреНрд▓реЛрдм рддреИрдпрд╛рд░ рд╣реИред GitHub рдкрд░ рд╕реНрд░реЛрдд рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд╣рд╛рдВ рдЖрдк рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рд╢реНрди рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдХреЗрд╡рд▓- рд╣реИрдмреНрд░рд╣рд╛рдмреНрд░ рдкрд░ рдкрдврд╝рд╛ рд╣реИ ), рдФрд░ рдЖрдк bl.ocks.org рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдПрд╕рд╡реАрдЬреА рдХреЗ рдлрд╛рдпрджреЗ:


рдкреГрдереНрд╡реА рдЧреНрд░рд╣ рдПрдиреАрдореЗрд╢рди


рдПрд╕рд╡реАрдЬреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реБрд▓рдЭрд╛ рд╣реБрдЖ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрдирд╡рд╛рд╕ рдкрд░ рдРрд╕рд╛ рдХреБрдЫ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдкреГрдереНрд╡реА рдХреЗ рдШреВрд░реНрдгрди рдХрд╛ рдПрдХ рд╕рд░рд▓ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдПрдВред рдпрд╣рд╛рдВ рдмрд╣реБрдд рдХреБрдЫ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдХреЛрдб рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд▓рд╛рдКрдВрдЧрд╛ред

  var width = 800, height = 500; var projection = d3.geo.orthographic() .scale(245) .rotate([180, 0]) .translate([width / 2, height / 2]) .clipAngle(90); var canvas = d3.select("body").append("canvas") .attr("width", width) .attr("height", height); var c = canvas.node().getContext("2d"); var path = d3.geo.path() .projection(projection) .context(c); function getImage(path, callback) { var img = new Image(); img.src = path; img.onload = callback(null, img); } queue() .defer(d3.json, "data/world-110m.json") .defer(d3.tsv, "data/world-110m-country-names.tsv") .defer(getImage, "data/space.jpg") .await(ready); //Main function function ready(error, world, countryData, space) { var globe = {type: "Sphere"}, land = topojson.feature(world, world.objects.land), borders = topojson.mesh(world, world.objects.countries, function(a, b) { return a !== b; }); //Earth rotating (function transition() { d3.transition() .duration(15000) .ease("linear") .tween("rotate", function() { var r = d3.interpolate(projection.rotate(), [-180, 0]); return function(t) { projection.rotate(r(t)); c.clearRect(0, 0, width, height); c.drawImage(space, 0, 0); c.fillStyle = "#00006B", c.beginPath(), path(globe), c.fill(); c.fillStyle = "#29527A", c.beginPath(), path(land), c.fill(); c.strokeStyle = "#fff", c.lineWidth = .5, c.beginPath(), path(borders), c.stroke(); projection.rotate([180, 0]); }; }) .transition().duration(30).ease("linear") .each("end", transition); })(); }; 

рд░реЛрдЯреЗрд╢рди рдХреЛ рдмрд┐рдВрджреБ [180, 0] рд╕реЗ рдмрд┐рдВрджреБ [-180, 0] рддрдХ рдШреБрдорд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, "рдЗрдВрдЯрд░рдкреЛрд▓рд░", рдХреИрдЪ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рд╡рд╣ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рд╣рдо рдХреИрдирд╡рд╛рд╕ рдкрд░ рдкреЗрдВрдЯрд┐рдВрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рджреЗрд╢реЛрдВ рдХреА рдкреГрд╖реНрдарднреВрдорд┐, рдХреНрд╖реЗрддреНрд░, рдорд╣рд╛рджреНрд╡реАрдк рдФрд░ рд╕реАрдорд╛рдПрдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред transition рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗ рдХрд╛рд░рдг рд╣рдореЗрдВ рдЕрдирдВрдд рд░реЛрдЯреЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред

"рдФрд░ рдлрд┐рд░ рднреА рд╡рд╣ рдШреВрдорддреА рд╣реИ!"

рдЦреИрд░, рд╣рдордиреЗ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдпрд╛ред GitHub рдкрд░ рд╕реНрд░реЛрдд рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк bl.ocks.org рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рджреГрд╢реНрдпреЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдХреИрдирд╡рд╛рд╕ рдХреЗ рд▓рд╛рднреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЕрджреНрднреБрдд d3.js рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрд╛ред рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди, рджреГрд╢реНрдп рдФрд░ рдХрд╛рдлреА рд░реЛрдЪрдХ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдПрд╕рд╡реАрдЬреА рдФрд░ рдХреИрдирд╡рд╕ рдХреЗ рдмреАрдЪ рд▓рдбрд╝рд╛рдИ рдореЗрдВ, рджреЛрд╕реНрддреА рдЕрдВрддрддрдГ рдЬреАрдд рдЧрдИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛рд░реНрдЯреЛрдЧреНрд░рд╛рдлреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рддреЛ рдПрд╕рд╡реАрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рдЖрдк рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреИрдирд╡рд╛рд╕ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗред D3.js рдХреЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдЕрдЪреНрдЫреА рдХрд┐рд╕реНрдордд рдФрд░ рд╕рдлрд▓рддрд╛!

Source: https://habr.com/ru/post/In186532/


All Articles