2015-07-04 3 views
0

Я был вдохновлен замечательной серией отображаемых карт D3 here от maptimelex. Я пытаюсь воспроизвести его, но с использованием карты страны Гаити, а не штата Кентукки.Простая D3 Карта страны

См. Мой JSFiddle here.

Я использую файл JSON с простыми границами Гаити. Он не включает никаких административных границ (отделов, коммун и т. Д.). Кажется, что карта не отображается должным образом, и я не уверен, в чем проблема.

Я получаю ошибки, предполагающие, что файл JSON не загружается и не отображается должным образом. Одна ошибка говорит: «XMLHttpRequest не может загружаться: запросы на кросс-начало поддерживаются только для схем протокола: http, data, chrome, chrome-extension, https, chrome-extension-resource.» Другая ошибка говорит: «Uncaught TypeError: Невозможно прочитать свойства« null ».

Вот мой код JavaScript:

// set height and width of viz  
var width = window.innerWidth, 
    height = window.innerHeight; 

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

// define JSON map data 
d3.json("https://gist.github.com/29a1f4a91c1c8d615595.git", function (json) { 

    // create a first guess for the projection 
    var center = d3.geo.centroid(json); 
    var scale = 150; 
    var offset = [width/2, height/2]; 

    var projection = d3.geo.mercator() 
     .center(center) 
     .rotate([85.8, 0]) 
     .scale(scale) 
     .translate(offset); 

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

    svg.append("g") 
     .selectAll("path") 
     .data(json.coordinates) 
     .enter() 
     .append("path") 
     .attr("d", geoPath); 
}); 

ответ

1

В дополнение к ответу @ noveyak ваш JSON содержит GeometryCollection и поэтому имеет свойство .geometries не .coordinates. Кроме того, ваш масштаб слишком мал, и поворот не нужен.

Сведя вместе:

// create a first guess for the projection 
var center = d3.geo.centroid(json); 

var scale = 8000; 
var offset = [width/2, height/2]; 

var projection = d3.geo.mercator() 
    .center(center) 
    .scale(scale) 
    .translate(offset); 

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

svg.append("g") 
    .selectAll("path") 
    .data(json.geometries) //<-- geometries 
    .enter() 
    .append("path") 
    .attr("d", geoPath); 

Обновлено example.

+0

Это отлично работает - спасибо. Я вижу сейчас. Однако у меня все еще есть проблема, если я попытаюсь загрузить JSON локально (т. Е. Haiti.json в том же каталоге, что и haiti.html). Я получаю сообщение об ошибке в консоли JS: «XMLHttpRequest не может загрузить файл: ///Users/matt/Desktop/haiti/haiti.json. Запросы на кросс-начало поддерживаются только для схем протокола: http, data, chrome, chrome-extension , https, chrome-extension-resource. " Если я связываюсь с JSON, хранящимся на сервере (т. Е. Http: //), то он работает. Любая идея, почему это так и как я могу заставить ее работать с локально сохраненным JSON? – mattbowlby

+1

@mattbowlby, похоже, что вы просто запускаете это с локального диска. Вам необходимо обслуживать контент с веб-сервера. См. Дальнейшее объяснение [здесь] (http://stackoverflow.com/questions/20041656/xmlhttprequest-cannot-load-file-cross-origin-requests-are-only-supported-forhh) – Mark

+0

Благодарим вас за объяснение. Совершенно ясно. – mattbowlby

1

ошибка говорит, что вы наклоняете нагрузку https://gist.github.com/29a1f4a91c1c8d615595.git becuase она исходит от другого происхождения и не поддерживает CORS. Вы можете попробовать загрузить файл JSON локально и указать ваш скрипт на этот файл вместо удаленного места.

+0

Моя ошибка - теперь загружает JSON по этой ссылке https://rawgit.com/mattbowlby/29a1f4a91c1c8d615595/raw/9aac80c757f6af814ad425c45e130bec25e68354/haiti.json – mattbowlby

+0

Но карта еще не отображается правильно. Есть идеи? – mattbowlby

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