Я пытаюсь сделать карту мира похожей на карту США, представленную здесь (карта США ), но я сталкиваюсь с некоторыми проблемами. В настоящее время это то, что у меня есть для моего кода карты мира:
<!DOCTYPE html>
<style>
</style>
<svg width="960" height="600"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/topojson.v2.min.js"></script>
<script>
var svg = d3.select("svg");
var path = d3.geoPath();
d3.json("https://unpkg.com/world-atlas@1/world/50m.json", function(error, world)
{
if (error) throw error;
svg.append("g")
.selectAll("path")
.data(topojson.feature(world, world.objects.countries).features)
.enter().append("path")
.attr("d", path);
});
</script>
Однако карта, которую он показывает, занимает только верхнюю левую часть моего окна и выглядит неправильно. В настоящее время я немного смущен тем, что я могу делать неправильно. Если у кого-то есть понимание, я был бы признателен.
Спасибо.
РЕДАКТИРОВАТЬ: я действительно смог заставить его работать с предоставленным здесь кодом
<!DOCTYPE html>
<style>
.countries :hover
{
fill: red;
}
.country-borders
{
fill: none;
stroke: #FFF;
stroke-width: 0.5px;
stroke-linejoin: round;
stroke-linecap: round;
cursor: pointer;
}
</style>
<meta charset="utf-8">
<body>
<script src="http://d3js.org/d3.v4.min.js"></script>
<script src="http://d3js.org/topojson.v1.min.js"></script>
<script>
var format = d3.format(",");
var margin = {top: 0, right: 0, bottom: 0, left: 0},
width = 1200 - margin.left - margin.right,
height = 900 - margin.top - margin.bottom;
var path = d3.geoPath();
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height)
.append('g')
.attr('class', 'map');
var projection = d3.geoMercator()
.scale(170)
.translate( [width / 2, height / 1.5]);
var path = d3.geoPath().projection(projection);
d3.json("https://unpkg.com/world-atlas@1/world/50m.json", function( error, world )
{
svg.append("g")
.attr("class", "countries")
.selectAll("path")
.data(topojson.feature( world, world.objects.countries ).features )
.enter().append("path")
.attr("d", path);
svg.append("path")
.attr( "class", "country-borders" )
.attr("d", path(topojson.mesh( world, world.objects.countries, function( a, b)
{
return a !== b;
})));
});
</script>
</body>
</html>
Я считаю, что неправильно масштабировал и неправильно делал проекцию на карту. Если у кого-то есть какие-либо комментарии о том, как я это сделал, пожалуйста, дайте мне знать.