D3.js - Geografias

As coordenadas geoespaciais são freqüentemente usadas para dados meteorológicos ou populacionais. D3.js nos dá três ferramentas para dados geográficos -

  • Paths - Eles produzem os pixels finais.

  • Projections - Eles transformam coordenadas de esfera em coordenadas cartesianas e

  • Streams - Eles aceleram as coisas.

Antes de aprender o que são geografias em D3.js, devemos entender os dois termos a seguir -

  • D3 Geo Path e
  • Projections

Vamos discutir esses dois termos em detalhes.

D3 Geo Path

É um gerador de caminhos geográficos. GeoJSON gera string de dados de caminho SVG ou renderiza o caminho para um Canvas. Um Canvas é recomendado para projeções dinâmicas ou interativas para melhorar o desempenho. Para gerar um Gerador de Dados Geo Path D3, você pode chamar a seguinte função.

d3.geo.path()

Aqui o d3.geo.path() A função de gerador de caminho nos permite selecionar qual projeção de mapa queremos usar para a conversão de coordenadas geográficas para coordenadas cartesianas.

Por exemplo, se quisermos mostrar os detalhes do mapa da Índia, podemos definir um caminho conforme mostrado abaixo.

var path = d3.geo.path()
svg.append("path")
   .attr("d", path(states))

Projeções

As projeções transformam a geometria poligonal esférica em geometria poligonal plana. D3 fornece as seguintes implementações de projeção.

  • Azimuthal - As projeções azimutais projetam a esfera diretamente em um plano.

  • Composite - Composto consiste em várias projeções que são compostas em uma única exibição.

  • Conic - Projeta a esfera em um cone e então desenrola o cone no plano.

  • Cylindrical - Projeções cilíndricas projetam a esfera em um cilindro recipiente e, em seguida, desenrolam o cilindro no plano.

Para criar uma nova projeção, você pode usar a seguinte função.

d3.geoProjection(project)

Ele constrói uma nova projeção a partir do projeto de projeção bruto especificado. A função de projeto leva a longitude e latitude de um determinado ponto em radianos. Você pode aplicar a seguinte projeção em seu código.

var width = 400
var height = 400
var projection = d3.geo.orthographic() 
var projections = d3.geo.equirectangular()
var project = d3.geo.gnomonic()
var p = d3.geo.mercator()
var pro = d3.geo.transverseMercator()
   .scale(100)
   .rotate([100,0,0])
   .translate([width/2, height/2])
   .clipAngle(45);

Aqui, podemos aplicar qualquer uma das projeções acima. Vamos discutir cada uma dessas projeções em breve.

  • d3.geo.orthographic()- A projeção ortográfica é uma projeção azimutal adequada para exibir um único hemisfério; o ponto de vista está no infinito.

  • d3.geo.gnomonic() - A projeção gnomônica é uma projeção azimutal que projeta grandes círculos como linhas retas.

  • d3.geo.equirectangular()- O equirretangular é a projeção geográfica mais simples possível. A função de identidade. Não tem área igual nem é conforme, mas às vezes é usado para dados raster.

  • d3.geo.mercator() - A projeção Spherical Mercator é comumente usada por bibliotecas de mapeamento lado a lado.

  • d3.geo.transverseMercator() - A projeção transversal de Mercator.

Exemplo de Trabalho

Vamos criar o mapa da Índia neste exemplo. Para fazer isso, devemos seguir as etapas a seguir.

Step 1 - Apply styles - Vamos adicionar estilos no mapa usando o código abaixo.

<style>
   path {
      stroke: white;
      stroke-width: 0.5px;
      fill: grey;
   }
   
   .stateTN { fill: red; }
   .stateAP { fill: blue; }
   .stateMP{ fill: green; }
</style>

Aqui, aplicamos cores específicas para o estado TN, AP e MP.

Step 2 - Include topojson script - TopoJSON é uma extensão do GeoJSON que codifica a topologia, que é definida a seguir.

<script src = "http://d3js.org/topojson.v0.min.js"></script>

Podemos incluir esse script em nossa codificação.

Step 3 - Define variables - Adicione variáveis ​​em seu script, usando o código abaixo.

var width = 600;
var height = 400;
var projection = d3.geo.mercator()
   .center([78, 22])
   .scale(680)
   .translate([width / 2, height / 2]);

Aqui, a largura do SVG é 600 e a altura é 400. A tela é um espaço bidimensional e estamos tentando apresentar um objeto tridimensional. Assim, podemos distorcer gravemente o tamanho / forma do terreno usando od3.geo.mercator() função.

O centro é especificado [78, 22], isso define o centro da projeção para o local especificado como uma matriz de dois elementos de longitude e latitude em graus e retorna a projeção.

Aqui, o mapa foi centralizado em 78 graus Oeste e 22 graus Norte.

A escala é especificada como 680, isso define o fator de escala da projeção para o valor especificado. Se a escala não for especificada, ele retornará o fator de escala atual, cujo padrão é 150. É importante observar que os fatores de escala não são consistentes nas projeções.

Step 4 - Append SVG - Agora, anexe os atributos SVG.

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

Step 5 - Create path - A seguinte parte do código cria um novo gerador de caminho geográfico.

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

Aqui, o gerador de caminho (d3.geo.path ()) é usado para especificar um tipo de projeção (.projection), que foi definido anteriormente como uma projeção Mercator usando a projeção variável.

Step 6 - Generate data - indiatopo.json - Este arquivo contém muitos registros, que podemos facilmente baixar do seguinte anexo.

Baixar indiatopo.json file

Após o download do arquivo, podemos adicioná-lo em nossa localização D3. O formato de amostra é mostrado abaixo.

{"type":"Topology","transform":{"scale":[0.002923182318231823,0.0027427542754275428],
"translate":[68.1862,8.0765]},"objects":
{"states":{"type":"GeometryCollection",
"geometries":[{"type":"MultiPolygon","id":"AP","arcs":
[[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
25,26,27,28,29,30,31,32,33,34]],[[35,36,37,38,39,40,41]],[[42]],
[[43,44,45]],[[46]],[[47]],[[48]],[[49]],[[50]],[[51]],[[52,53]],
[[54]],[[55]],[[56]],[[57,58]],[[59]],[[60]],[[61,62,63]],[[64]],
[[65]],[[66]],[[67]],[[68]],[[69]],[[-41,70]],
[[71]],[[72]],[[73]],[[74]],[[75]]],
"properties":{"name":"Andhra Pradesh"}},{"type":"MultiPolygon",
"id":"AR","arcs":[[[76,77,78,79,80,81,82]]],
"properties":{"name":"Arunachal Pradesh"}},{"type":"MultiPolygon",
"id":"AS","arcs":[[[83,84,85,86,87,88,89,90,
91,92,93,94,95,96,97,98,99,100,101,102,103]],
[[104,105,106,107]],[[108,109]]], ......

........................................

Step 7 - Draw map - Agora, leia os dados do indiatopo.json arquivo e desenhe o mapa.

d3.json("indiatopo.json", function(error, topology) {
   g.selectAll("path")
   .data(topojson.object(topology, topology.objects.states)
   .geometries)
   .enter()
   .append("path")
   .attr("class", function(d) { return "state" + d.id; })
   .attr("d", path)
});

Aqui, carregaremos o arquivo TopoJSON com as coordenadas do mapa da Índia (indiatopo.json). Em seguida, declaramos que vamos atuar em todos os elementos de caminho do gráfico. É definido como g.selectAll (“caminho”). Em seguida, extrairemos os dados que definem os países do arquivo TopoJSON.

.data(topojson.object(topology, topology.objects.states)
   .geometries)

Finalmente, vamos adicioná-lo aos dados que vamos exibir usando o .enter() método e, em seguida, acrescentamos esses dados como elementos de caminho usando o .append(“path”) método.