Клип круга и проекция с орфографическим D3

Я работаю над этим, и у меня возникают проблемы с обрезкой элементов красного круга, когда они появляются на глобусе даже после угол зажима 90˚. Кроме того, есть ли способ применить проекцию к красным кругам, чтобы они выглядели так, как будто они находятся на поверхности земного шара относительно орфографического угла? На данный момент они просто отображаются как 2d круги относительно экрана.


person Tom Stove    schedule 03.04.2013    source источник


Ответы (1)


Вместо использования элементов <circle> вы можете использовать геометрию точек GeoJSON:

{type: "Point", coordinates: [λ, φ]}

Затем их можно обрезать через проекционную систему D3, в зависимости от установленного вами clipAngle. Итак, у вас может быть что-то вроде:

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

data.forEach(function(d) {
  svg.append("path")
      .datum({type: "Point", coordinates: [d.Lon, d.Lat]})
      .attr("d", path.pointRadius(d.Magnitude));
});

Обратите внимание, как радиус точки задается через путь для каждой точки. Вы также можете установить pointRadius как функцию, чтобы вы могли сделать что-то вроде:

var path = d3.geo.path()
    .projection(…)
    .pointRadius(function(d) { return d.radius; });

svg.selectAll("path.point")
    .data(data)
  .enter().append("path")
    .datum(function(d) {
       return {type: "Point", coordinates: [d.Lon, d.Lat], radius: d.Magnitude};
    })
    .attr("class", "point")
    .attr("d", path);

Вторая часть вашего вопроса спрашивает, могут ли круги быть настоящими географическими кругами. d3.geo.circle может генерировать объекты географического круга (опять же, как GeoJSON), который будет правильно обрезан:

var path = d3.geo.path().projection(…),
    circle = d3.geo.circle();

svg.selectAll("path.point")
    .data(data)
  .enter().append("path")
    .datum(function(d) {
       return circle
           .origin([d.Lon, d.Lat])
           .angle(d.Magnitude)();
    })
    .attr("class", "point")
    .attr("d", path);
person Jason Davies    schedule 04.04.2013
comment
Спасибо, что нашли время дать ответ, я очень ценю это. Ваш код был именно тем, что мне было нужно. Кроме того, спасибо за все ваши замечательные вклады в D3! - person Tom Stove; 04.04.2013
comment
@ Джейсон, есть ли способ изменить угол / радиус d3.geo.circles? Как насчет происхождения? - person Fresheyeball; 06.05.2013
comment
Есть ли у вас какие-либо предложения о том, как лучше всего обрабатывать большие наборы данных? Я реализовал что-то похожее на ваше последнее предложение, но обнаружил значительное отставание с 2k+ точками на вращающемся глобусе (как и следовало ожидать). Интересно, есть ли какие-нибудь хитрости, чтобы немного сгладить ситуацию. - person ruddfawcett; 16.10.2017