Topojson преобразуется в geojson при передаче в d3.geoPath - вы можете использовать любой из них.Однако, так как API topojson предоставляет метод merge , у topojson есть ключевое преимущество: мы можем использовать файл topojson us.json
в вашем примере, чтобы нарисовать карту.
Чтобы нарисовать коллекциюсостояний как одна функция, нам просто нужно объединить их в одну функцию.Для этого мы используем:
topojson.merge(us, us.objects.states.geometries.filter( /* some test */ )
Где мы тестируем каждое состояние, чтобы увидеть, принадлежит ли оно в данный регион.Эта строка возвращает объект геойсона, содержащий объединенные объекты топойсона.Затем мы можем передать это в d3.geoPath
.
Чтобы работать с файлом us.json
, на который ссылается ваш пример, нам нужно рассмотреть, как (и если) состояния идентифицируются в данных.
Файл us.json
не сопровождается сопутствующим описанием его метаданных, но я могу сказать, что идентификатором каждого состояния является числовой код FIPS .Поэтому, если мы не хотим указать регионы в числовом виде, нам нужно переводить между числом и аббревиатурой (или какой-либо другой узнаваемой формой).Я просто использую простой объект, чтобы получить аббревиатуру от номера FIPS:
var lookup = {
"53" : "WA",
"41" : "OR",
"6" : "CA",
// ...
}
И теперь мы можем указать регионы, например:
var regions = [
{"name": "northwest", "contains":[ "WA","OR","CA" ] }
// ...
];
Теперь мы можем нарисовать наши регионы:
var lookup = {
"53" : "WA",
"41" : "OR",
"6" : "CA",
// ...
}
var regions = [
{"name": "northwest", "contains":[ "WA","OR","CA" ] }
// ...
];
d3.json("us.json").then(function(us) {
svg.selectAll(null)
.data(regions)
.enter()
.append("path")
.attr("d", function(region) {
var feature = topojson.merge(us, us.objects.states.geometries.filter(function(state) {
return region.contains.indexOf(lookup[state.id]) > -1;
}))
return path(feature);
})
});
Если вы тоже хотите наброски штатов - просто нарисуйте штаты в дополнение к регионам. Вот западное побережье , используя описанный выше метод, чтобы нарисовать дополнительные регионы, просто добавьте их в массив регионов (при этом добавив необходимые коды состояния в объект поиска).