Создание файла топойсона с помощью d3.js (районы Нью-Йорка и участки переписи)
Вот первый topojson
вопрос по так. У меня проблемы с рендерингом карты (районы Нью-Йорка), и я не могу понять, почему. Приведенный ниже код является просто копией этого примера с другим файлом topojson. Я загрузил файл здесь. Ниже также приведены подробности о том, как я создал файл. Прямо сейчас я получаю хаотические линии. Возможно, причина в файле topojson, но я не знаю, что не так.
PS: я не смог пометить это как topojson
потому что тег не был использован ранее
Файл TopoJSON
1) Скачать шейп-файл отсюда
(В разделе "Районы и районы сообщества" файл "Районы" (слева), ArcView Shapefile)
2) Упростить шейп-файл с помощью QGis
3) Конвертировать в TopoJSON с
ogr2ogr -f geoJSON nybb-geo.json nybb.shp
topojson -o nybb.json nybb-geo.json
HTML/JS Code
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.boundary {
fill: none;
stroke: #000;
stroke-width: .5px;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script src="http://d3js.org/topojson.v0.min.js"></script>
<script>
var width = 960,
height = 500;
var path = d3.geo.path();
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
d3.json("/geo/nybb.json", function(error, topology) {
svg.append("path")
.datum(topojson.object(topology, topology.objects['nybb-geo'].geometries[0]))
.attr("d", path)
.attr("class", "boundary");
});
</script>
1 ответ
Как также предложено в комментарии пользователя 10579, мне удалось решить эту проблему, заново спроецировав шейп-файл на NAD83 (EPSG 4269). После создания файла topojson из перепроектированного шейп-файла d3.js показывает карту с
var projection = d3.geo.albers();
var path = d3.geo.path().projection(projection);
Вторая проблема, с которой я столкнулся, была связана с правильным центром, масштабом и значениями перевода. С кодом выше nyc будет просто маленькой точкой с большим количеством пробелов. Поиск правильного центра, масштаба и перевода значений может быть немного утомительным. В конце я добавил приведенный ниже код, который позволяет перетаскивать карту и прокручивать ее, чтобы изменить параметр масштаба. Значения отображаются после каждого изменения, так что легко расположить карту в нужном месте и просто принять последние параметры из вывода консоли.
svg.call(d3.behavior.zoom()
.translate(projection.translate())
.scale(projection.scale())
.on("zoom", redraw));
function redraw() {
if (d3.event) {
projection
.translate(d3.event.translate)
.scale(d3.event.scale);
}
map.datum(topojson.object(topology, topology.objects.nyct2010))
.attr("d", path)
.attr("class", "boundary");
console.log("Current scale:" + projection.scale())
console.log("Current translate:" + projection.translate())
console.log("Current rotate:" + projection.rotate())
}