2013-09-16 1 views
7

Я использую библиотеку D3.js для создания карт из шейп-файлов США. Я ищу, чтобы создать всю карту США, что не представляет проблемы, и карту для каждого штата.Оказание только части карты топойсона с использованием D3.js

В моем рабочем потоке используются данные переписи, которые были изменены по необходимости ogr2ogr в командной строке, а затем преобразованы в topojson или geojson на shpescape.com из-за ошибок в загрузке модуля topojson (см. Ниже для редактирования решение этой конкретной проблемы).

Мой вопрос скорее практический вопрос, чем все остальное - когда представлено с этим кодом (моделируемой прочь http://bl.ocks.org/mbostock/4707858):

  var width = 640, 
       height = 500; 

      var projection = d3.geo.albers(); 

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

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

      d3.json("mt_geo.json", function(error, mt_topo) { 
       var states = topojson.feature(mt_topo, mt_topo.objects.states), 
        state = states.features.filter(function(d) { return d.id === 34; })[0]; 
       projection 
        .scale(1) 
        .translate([0,0]); 
       var b = path.bounds(state), 
        s = .95/Math.max ((b[1][0]-b[0][0])/width, (b[1][1]-b[0][1])/height), 
        t = [(width-s*(b[1][0]+b[0][0]))/2, (height-s*(b[1][1]+b[0][1]))/2]; 
       projection 
        .scale(s) 
        .translate(t); 
       svg.append("path") 
        .datum(states) 
        .attr("class", "feature") 
        .attr("d", path); 
       svg.append("path") 
        .datum(topojson.mesh(us, us.objects.states,function(a, b) {return a !== b;})) 
        .attr("d", path); 
       svg.append("path") 
        .datum(state) 
        .attr("class", "outline") 
        .attr("d", path); 

не только бросить ошибку на «вар состояний» линии в котором говорится: «Невозможно прочитать тип свойства неопределенным», но я также не знаю, что я должен переходить в анонимную функцию, или о том, что должно ссылаться на mt_topo.objects.states. Нет никакой хорошей документации по этому виду GIS. У всех карт переписи есть «государственные» функции? Вы теряете эту информацию при сжатии .shp в topojson?

Просто, если d3.json принимает (объект, функция (ошибка, json)), будет ли пример того, что работает на самом деле?

EDIT: обходного пути WINDOWS 7 идиосинкразии -----

Большинство учебников посоветует использовать модуль из Node.js, но я на Windows7 и каноническое командной строки «НПМ установки -g topojson «не удается» при контекстации ». Создатель прислал мне хороший link, чтобы обойти эту проблему.

Это важно, потому что в командной строке для topojson есть флаг, в котором вы можете упаковать существующие функции в geojson в доступный объект в topojson. Например, приведенный выше код использует «состояния» в topojson - то, что не имеет смысл и недоступные, если не использовать следующую команду:

topojson -o us.topojson -- states=us_states.json 

Пространства между двойным дефисом и государство имеет важное значение. Затем вы можете получить доступ к состояниям через us.objects.states, как показано в исходном коде выше.

+0

Вы посмотрели [учебник] (http://bost.ocks.org/mike/map/)? Атрибуты зависят от того, что находится в данных, то есть полностью определяется пользователем. –

+0

@LarsKotthoff - да, я прочитал учебник довольно широко. Я думаю, что я понял проблемы с областью; как вы сказали, это только местозаполнитель. Моя оригинальная проблема становится яснее. Спасибо за вашу помощь. – kgilvi3

+0

@ kgilvi3: если вы нашли способ обойтись, пожалуйста, поделитесь ответом, мы будем рады +1 ему. – Hugolpz

ответ

1

Вы очень близко. Не проверяя код, я вижу одну важную проблему. Второй параметр вашего JSON обратного вызова mt_topo, который используется при определении

var states = topojson.feature(mt_topo, mt_topo.objects.states)

Однако позже использовать us в качестве объекта обратного вызова, по-видимому, потому, что это то, что Майк Босток, используемый в примере вы цитируемой.Вместо этого, он должен быть таким:

svg.append("path") 
.datum(topojson.mesh(mt_topo, mt_topo.objects.states,function(a, b) {return a !== b;})) 
.attr("d", path); 

говорится, ваш вопрос действительно становится в том или нет карты переписи имеет «государство» функция. Я предполагаю, что любая геометрия, которую вы используете, не имеет функции состояний, и именно поэтому вы получаете ошибку. При использовании инструмента командной строки topojson, имя функции (т.е. data.objects.x), как правило, независимо от входного файла был назван, поэтому, если ваш файл был US_Census_2010.shp, вы хотели бы, чтобы определить состояния как

var states = topojson.feature(mt_topo, mt_topo.objects.US_Census_2010)

Откройте файл mt_geo.json и узнайте, что назвали ваши функции. Надеюсь, это поможет!

+0

Поскольку я потратил некоторое время на это, я думаю, что стоит положить все это: @jczaplew, вы определенно правы. Я добавляю то, что изначально было здесь для ответа в качестве обходного пути. – kgilvi3

0

Файл GeoJSON, представляющий карту, обычно имеет одну или несколько функций. Каждая функция может иметь ноль или более свойств. Как правило, свойства используются для хранения метаданных мест (имя штата, графства и т. Д.). Вы можете прочитать свой файл GeoJSON и посмотреть, какие у него есть свойства, и использовать эти свойства для отображения или скрытия функций.

При преобразовании файла из GeoJSON в TopoJSON, you can preserve or remove the original properties. Например, функции и точки в файле uk.json из учебника Let's Make a Map имеют свойство name.

Смежные вопросы