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

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

Ответ 1

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

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

Затем их можно обрезать с помощью проекционной системы D3s, в зависимости от установленного вами параметра 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);