SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
transformando

dados

públicos

emmapas
interativos
são paulo, julho/2019
helderdarocha

helder@argonavis.com.br
Quem sou eu? Who am I? Кто я?
Helder da Rocha
argonavis.com.br
Tecnologia * Ciência * Arte
HTML & tecnologias Web desde 1995
Autor de cursos e livros sobre

Java, XML e tecnologias Web
helderdarocha.com.br
Tutorial prático
• Como usar dados abertos para construir um mapa temático iterativo usando:
HTML, CSS, JavaScript, SVG, D3.js, CSV, GeoJSON.
• Obter shapefile de naturalearthdata.com
• Converter para GeoJSON usando mapshaper.org e filtrar dados
• Obter dados temáticos de portais públicos: un.data.org e geonames.org
• Gerar string para path SVG usando D3.js
• Aplicar escalas, cores, projeções e recursos interativos
• Código: https://github.com/argonavisbr/tutorial-geojson
• Playground: JSFiddle (use links do Readme.md)
Shapefile: naturalearthdata.com
www.naturalearthdata.com/downloads/110m-cultural-vectors/
Converter para GeoJSON: mapshaper.org
ne_110m_admin_0_countries.json
ne_110m_admin_0_countries.zip
1
23
JSON
Alternativas: aplicativo GIS ou GDAL
$ ogr2ogr -f GeoJSON resultado.geojson ne_110m_admin_0_countries.json.shp
gdal.org
qgis.org
GeoJSON
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"id": "FJI",
"properties": {
"name": "Fiji"
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[[ [180,-16.067132663642447],
...
[179.4135093629971,-16.379054277547404],
[180,-16.067132663642447] ]],
[[ ... ]], [[ ... ]]
]
}
},{
"type": "Feature",
...
}
},
...
]
}
Propriedade"id"
(opcional)
Propriedade"properties"
(conteúdolivre)
Propriedade"geometry"
(contémumtipoGeoJSON

ex:"Polygon","Point","MultiPolygon")
Remover propriedades desnecessárias
{
"type": "Feature",

"properties": {
"ISO_A3":"...",
"NAME":"...",
"ADMIN":"...",

...,

"MAPCOLOR7":"..."
},
"geometry": {...}
}
{
"type": "Feature",

"id":"...",

"properties": {
"name":"...",
},
"geometry": {...}
}
ParacadaFeature:
GitHub:tools/filter-map.js
D3.js
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
d3.json('../geo/world.geojson')

.then(function(data) {

console.log(data.features);
});
</script>
{
"type": "FeatureCollection",
"features": [ ... ]
}
Passo 1: Carregar o GeoJSON
GitHub:tutorial/map-1.html
Passo 2: Listar propriedades
GitHub:tutorial/map-2.html
const map = {};

d3.json('../geo/world.geojson')

.then(function(data) {

map.features = data.features;

draw();

});



function draw() {

const ol = d3.select("body").append("ol");

ol.selectAll("li")

.data(map.features)

.enter().append("li")

.text(d => d.properties.name +

" ("+ d.id + ")");

}
{ "type": "Feature",

"id":"...",

"properties": {
"name":"...",
},
"geometry": {...} }map.features[n]
Passo 3: Listar coordenadas de objeto
GitHub:tutorial/map-3.html
const country =

map.features.filter(k => k.id === "BRA")[0];



const body = d3.select("body");

body.append("h1")

.text(country.properties.name);



body.append("ul").selectAll("li.coord")

.data(country.geometry.coordinates[0])

.enter()

.append("li").attr("class", "coord")

.text(d => "Lon: "+d[0]+", Lat: "+d[1]);
<html lang="en">
<head>
<style>
.poly {
stroke: black;
stroke-width: .05;
fill: yellow;
}
</style>
</head>
<body>
<svg height="500" width="960" viewBox="7 -13 14 28">
<path d="M-10,0 L-3,10 L10,7 L10,-7 L-3,-10 L-10,0" class="poly" />
</svg>
</body>
</html>
Passo 4: SVG <path>
GitHub:tutorial/map-6a.html
Passo 5: SVG <path> em D3
GitHub:tutorial/map-8.html
<svg height="500" width="960"></svg>


<script>

const svg = d3.select("svg");

const pathData = "M-10,0 L-3,10 L10,7 L10,-7 L-3,-10 Z";



svg.append("path").attr("class", "poly")

.attr("d", pathData);

</script>
Passo 6: Gerando um <path> com D3
GitHub:tutorial/map-9.html
const geoPath = d3.geoPath();



const map = {};

d3.json('../geo/world.geojson')

.then(function(data) {

map.features = data.features;

draw();

});



function draw() {

const country = map.features.filter(k => k.id === "BRA")[0];

const pathData = geoPath(country);

d3.select("svg").append("path")

.attr("d", pathData);

}
Passo 7: Mapeando dados ao DOM SVG
GitHub:tutorial/map-10.html
const geoPath = d3.geoPath();

svg.selectAll("path")

.data(map.features)

.enter().append("path")

.attr("d", geoPath)
Cadafeaturemapeada
aumobjeto<path>
Passo 8: Projeções geográficas
GitHub:tutorial/map-12.html
const geoPath = d3.geoPath();

const projection = d3.geoMercator(); //d3.geoOrthographic(), d3.geoMollweide()...

geoPath.projection(projection);
d3.geoMercator()
Coordenadas de cidades: geonames.org
geonameid;asciiname;latitude;longitude;population;timezone

3040051;les Escaldes;42.50729;1.53414;15853;Europe/Andorra

3041563;Andorra la Vella;42.50779;1.52109;20430;Europe/Andorra

290594;Umm al Qaywayn;25.56473;55.55517;44411;Asia/Dubai

291074;Ras al-Khaimah;25.78953;55.9432;115949;Asia/Dubai

291696;Khawr Fakkan;25.33132;56.34199;33575;Asia/Dubai

292223;Dubai;25.0657;55.17128;1137347;Asia/Dubai

292231;Dibba Al-Fujairah;25.59246;56.26176;30000;Asia/Dubai

292239;Dibba Al-Hisn;25.61955;56.27291;26395;Asia/Dubai

292672;Sharjah;25.33737;55.41206;543733;Asia/Dubai

292688;Ar Ruways;24.11028;52.73056;16000;Asia/Dubai

292878;Al Fujayrah;25.11641;56.34141;62415;Asia/Dubai

292913;Al Ain;24.19167;55.76056;408733;Asia/Dubai
GitHub:csv/cities15000.csv
(23505localidades)
Passo 9: Dados temáticos: cidades
GitHub:tutorial/map-15.html
Promise.all([

d3.json('../geo/world.geojson'),

d3.dsv(';', '../csv/cities15000.csv',
function(row) {

return {

name: row.asciiname,

coords: [+row.longitude, +row.latitude]

}

})

]).then(function([shapes, points]) {

map.features = shapes.features;

map.points = points;

draw();

});
svg.selectAll("circle.city")

.data(map.points)

.enter()

.append("circle").attr("class", "city")

.attr("cx", d => projection(d.coords)[0])

.attr("cy", d => projection(d.coords)[1])

.attr("r", d => 1)
Passo 10: Interatividade
GitHub:tutorial/map-19.html
Conclusões
• D3.js é uma poderosa biblioteca para visualização de dados
baseada em padrõesabertos
• Usada em grandes portais (NY Times, The Guardian, etc.) para
visualizações e mapas interativos e base para outros
frameworks de visualização
• Neste tutorial, foi mostrado como D3 pode ser usada para criar
mapastemáticos usando dadosabertos: uma ferramenta
essencial em jornalismo de dados
Slides, +código-fonte e +demonstrações
github.com/argonavisbr/tutorial-geojson
www.argonavis.com.br/download/
tdc_2019_js.html
julho/2019
helder da rocha
helder@argonavis.com.br
www.amazon.com/dp/B07PDBBHLLwww.amazon.com/dp/B07RFBV4PC

Weitere ähnliche Inhalte

Was ist angesagt?

FIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LDFIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LD
FIWARE
 
오픈소스 GIS 교육 - PostGIS
오픈소스 GIS 교육 - PostGIS오픈소스 GIS 교육 - PostGIS
오픈소스 GIS 교육 - PostGIS
JungHwan Yun
 
Geo server 성능향상을 위한 튜닝 기법 20111028
Geo server 성능향상을 위한 튜닝 기법 20111028Geo server 성능향상을 위한 튜닝 기법 20111028
Geo server 성능향상을 위한 튜닝 기법 20111028
BJ Jang
 

Was ist angesagt? (20)

Java Cheat Sheet
Java Cheat SheetJava Cheat Sheet
Java Cheat Sheet
 
GeoTools와 GeoServer를 이용한 KOPSS Open API의 구현
GeoTools와 GeoServer를 이용한 KOPSS Open API의 구현GeoTools와 GeoServer를 이용한 KOPSS Open API의 구현
GeoTools와 GeoServer를 이용한 KOPSS Open API의 구현
 
PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS PostGIS - National Education Center for GIS: Open Source GIS
PostGIS - National Education Center for GIS: Open Source GIS
 
공간정보거점대학 1.geo server_고급과정
공간정보거점대학 1.geo server_고급과정공간정보거점대학 1.geo server_고급과정
공간정보거점대학 1.geo server_고급과정
 
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
Open Source GIS 기초교육 4일차 - GeoServer 기초 2014년 7월판
 
JSON-LD for RESTful services
JSON-LD for RESTful servicesJSON-LD for RESTful services
JSON-LD for RESTful services
 
LX 공간정보아카데미 PostGIS 강의자료
LX 공간정보아카데미 PostGIS 강의자료LX 공간정보아카데미 PostGIS 강의자료
LX 공간정보아카데미 PostGIS 강의자료
 
FIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LDFIWARE Training: JSON-LD and NGSI-LD
FIWARE Training: JSON-LD and NGSI-LD
 
jQuery Essentials
jQuery EssentialsjQuery Essentials
jQuery Essentials
 
C* Summit 2013: The World's Next Top Data Model by Patrick McFadin
C* Summit 2013: The World's Next Top Data Model by Patrick McFadinC* Summit 2013: The World's Next Top Data Model by Patrick McFadin
C* Summit 2013: The World's Next Top Data Model by Patrick McFadin
 
Spring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutesSpring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutes
 
Introduction to GraphQL
Introduction to GraphQLIntroduction to GraphQL
Introduction to GraphQL
 
오픈소스 GIS 교육 - PostGIS
오픈소스 GIS 교육 - PostGIS오픈소스 GIS 교육 - PostGIS
오픈소스 GIS 교육 - PostGIS
 
[JWPA-1]의존성 주입(Dependency injection)
[JWPA-1]의존성 주입(Dependency injection)[JWPA-1]의존성 주입(Dependency injection)
[JWPA-1]의존성 주입(Dependency injection)
 
gRPC 프레임워크를 만들며 알아보는 파이썬 - 파이콘2020
gRPC 프레임워크를 만들며 알아보는 파이썬  - 파이콘2020gRPC 프레임워크를 만들며 알아보는 파이썬  - 파이콘2020
gRPC 프레임워크를 만들며 알아보는 파이썬 - 파이콘2020
 
Geo server 성능향상을 위한 튜닝 기법 20111028
Geo server 성능향상을 위한 튜닝 기법 20111028Geo server 성능향상을 위한 튜닝 기법 20111028
Geo server 성능향상을 위한 튜닝 기법 20111028
 
공간정보 스터디 1주차
공간정보 스터디 1주차공간정보 스터디 1주차
공간정보 스터디 1주차
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com Zabbix
 
Getting started with Spring Security
Getting started with Spring SecurityGetting started with Spring Security
Getting started with Spring Security
 
11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos11 Java Script - Exemplos com eventos
11 Java Script - Exemplos com eventos
 

Ähnlich wie TDC 2019: transformando 
dados
públicos
em mapas interativos

Ähnlich wie TDC 2019: transformando 
dados
públicos
em mapas interativos (20)

SVG Essencial
SVG EssencialSVG Essencial
SVG Essencial
 
TDC2016SP - Trilha BigData
TDC2016SP - Trilha BigDataTDC2016SP - Trilha BigData
TDC2016SP - Trilha BigData
 
Gráficos Vetoriais na Web com SVG
Gráficos Vetoriais na Web com SVGGráficos Vetoriais na Web com SVG
Gráficos Vetoriais na Web com SVG
 
Como criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.jsComo criar um mapa temático interativo com dados abertos e D3.js
Como criar um mapa temático interativo com dados abertos e D3.js
 
Design Responsivo com Sass
Design Responsivo com SassDesign Responsivo com Sass
Design Responsivo com Sass
 
Javascript + jQuery
Javascript + jQueryJavascript + jQuery
Javascript + jQuery
 
Html5
Html5Html5
Html5
 
Laboratório Web 2013-2014 - CSS3
Laboratório Web 2013-2014 - CSS3Laboratório Web 2013-2014 - CSS3
Laboratório Web 2013-2014 - CSS3
 
CSS 2022 um mundo novo de possibilidades
CSS 2022 um mundo novo de possibilidadesCSS 2022 um mundo novo de possibilidades
CSS 2022 um mundo novo de possibilidades
 
Curso de Desenvolvimento Web - Módulo 03 - JavaScript
Curso de Desenvolvimento Web - Módulo 03 - JavaScriptCurso de Desenvolvimento Web - Módulo 03 - JavaScript
Curso de Desenvolvimento Web - Módulo 03 - JavaScript
 
Geo on Rails - Um guia para manter o seu cabelo.
Geo on Rails - Um guia para manter o seu cabelo.Geo on Rails - Um guia para manter o seu cabelo.
Geo on Rails - Um guia para manter o seu cabelo.
 
Javascript no SAPO e libsapojs
Javascript no SAPO e libsapojsJavascript no SAPO e libsapojs
Javascript no SAPO e libsapojs
 
Backbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectadosBackbone.js + Rails - Front-end e back-end conectados
Backbone.js + Rails - Front-end e back-end conectados
 
Pew2012
Pew2012Pew2012
Pew2012
 
Less
LessLess
Less
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + Mongoose
 
Web em grande estilo com CSS 3
Web em grande estilo com CSS 3Web em grande estilo com CSS 3
Web em grande estilo com CSS 3
 
Web 3.0
Web 3.0Web 3.0
Web 3.0
 
Utilizando GeoTools para Manipulação de Dados Geográficos - Apresentação
Utilizando GeoTools para Manipulação de Dados Geográficos - ApresentaçãoUtilizando GeoTools para Manipulação de Dados Geográficos - Apresentação
Utilizando GeoTools para Manipulação de Dados Geográficos - Apresentação
 
Arquitetura CSS
Arquitetura CSSArquitetura CSS
Arquitetura CSS
 

Mehr von Helder da Rocha

Mehr von Helder da Rocha (20)

Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)Transforming public data into thematic maps (TDC2019 presentation)
Transforming public data into thematic maps (TDC2019 presentation)
 
Padrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemasPadrões essenciais de mensageria para integração de sistemas
Padrões essenciais de mensageria para integração de sistemas
 
Visualização de dados e a Web
Visualização de dados e a WebVisualização de dados e a Web
Visualização de dados e a Web
 
Eletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativosEletrônica Criativa: criando circuitos com materiais alternativos
Eletrônica Criativa: criando circuitos com materiais alternativos
 
Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)Introdução à Visualização de Dados (2015)
Introdução à Visualização de Dados (2015)
 
API de segurança do Java EE 8
API de segurança do Java EE 8API de segurança do Java EE 8
API de segurança do Java EE 8
 
Java 9, 10, 11
Java 9, 10, 11Java 9, 10, 11
Java 9, 10, 11
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7Minicurso de Segurança em Java EE 7
Minicurso de Segurança em Java EE 7
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
Curso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e StreamsCurso de Java: Introdução a lambda e Streams
Curso de Java: Introdução a lambda e Streams
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: Sincronizadores
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e Futures
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentes
 

Kürzlich hochgeladen

Kürzlich hochgeladen (9)

ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 

TDC 2019: transformando 
dados
públicos
em mapas interativos

  • 2. Quem sou eu? Who am I? Кто я? Helder da Rocha argonavis.com.br Tecnologia * Ciência * Arte HTML & tecnologias Web desde 1995 Autor de cursos e livros sobre
 Java, XML e tecnologias Web helderdarocha.com.br
  • 3. Tutorial prático • Como usar dados abertos para construir um mapa temático iterativo usando: HTML, CSS, JavaScript, SVG, D3.js, CSV, GeoJSON. • Obter shapefile de naturalearthdata.com • Converter para GeoJSON usando mapshaper.org e filtrar dados • Obter dados temáticos de portais públicos: un.data.org e geonames.org • Gerar string para path SVG usando D3.js • Aplicar escalas, cores, projeções e recursos interativos • Código: https://github.com/argonavisbr/tutorial-geojson • Playground: JSFiddle (use links do Readme.md)
  • 6. Converter para GeoJSON: mapshaper.org ne_110m_admin_0_countries.json ne_110m_admin_0_countries.zip 1 23 JSON
  • 7. Alternativas: aplicativo GIS ou GDAL $ ogr2ogr -f GeoJSON resultado.geojson ne_110m_admin_0_countries.json.shp gdal.org qgis.org
  • 8. GeoJSON { "type": "FeatureCollection", "features": [ { "type": "Feature", "id": "FJI", "properties": { "name": "Fiji" }, "geometry": { "type": "MultiPolygon", "coordinates": [ [[ [180,-16.067132663642447], ... [179.4135093629971,-16.379054277547404], [180,-16.067132663642447] ]], [[ ... ]], [[ ... ]] ] } },{ "type": "Feature", ... } }, ... ] } Propriedade"id" (opcional) Propriedade"properties" (conteúdolivre) Propriedade"geometry" (contémumtipoGeoJSON
 ex:"Polygon","Point","MultiPolygon")
  • 9. Remover propriedades desnecessárias { "type": "Feature",
 "properties": { "ISO_A3":"...", "NAME":"...", "ADMIN":"...",
 ...,
 "MAPCOLOR7":"..." }, "geometry": {...} } { "type": "Feature",
 "id":"...",
 "properties": { "name":"...", }, "geometry": {...} } ParacadaFeature: GitHub:tools/filter-map.js
  • 10.
  • 12. Passo 1: Carregar o GeoJSON GitHub:tutorial/map-1.html
  • 13.
  • 14.
  • 15. Passo 2: Listar propriedades GitHub:tutorial/map-2.html const map = {};
 d3.json('../geo/world.geojson')
 .then(function(data) {
 map.features = data.features;
 draw();
 });
 
 function draw() {
 const ol = d3.select("body").append("ol");
 ol.selectAll("li")
 .data(map.features)
 .enter().append("li")
 .text(d => d.properties.name +
 " ("+ d.id + ")");
 } { "type": "Feature",
 "id":"...",
 "properties": { "name":"...", }, "geometry": {...} }map.features[n]
  • 16. Passo 3: Listar coordenadas de objeto GitHub:tutorial/map-3.html const country =
 map.features.filter(k => k.id === "BRA")[0];
 
 const body = d3.select("body");
 body.append("h1")
 .text(country.properties.name);
 
 body.append("ul").selectAll("li.coord")
 .data(country.geometry.coordinates[0])
 .enter()
 .append("li").attr("class", "coord")
 .text(d => "Lon: "+d[0]+", Lat: "+d[1]);
  • 17. <html lang="en"> <head> <style> .poly { stroke: black; stroke-width: .05; fill: yellow; } </style> </head> <body> <svg height="500" width="960" viewBox="7 -13 14 28"> <path d="M-10,0 L-3,10 L10,7 L10,-7 L-3,-10 L-10,0" class="poly" /> </svg> </body> </html> Passo 4: SVG <path> GitHub:tutorial/map-6a.html
  • 18. Passo 5: SVG <path> em D3 GitHub:tutorial/map-8.html <svg height="500" width="960"></svg> 
 <script>
 const svg = d3.select("svg");
 const pathData = "M-10,0 L-3,10 L10,7 L10,-7 L-3,-10 Z";
 
 svg.append("path").attr("class", "poly")
 .attr("d", pathData);
 </script>
  • 19. Passo 6: Gerando um <path> com D3 GitHub:tutorial/map-9.html const geoPath = d3.geoPath();
 
 const map = {};
 d3.json('../geo/world.geojson')
 .then(function(data) {
 map.features = data.features;
 draw();
 });
 
 function draw() {
 const country = map.features.filter(k => k.id === "BRA")[0];
 const pathData = geoPath(country);
 d3.select("svg").append("path")
 .attr("d", pathData);
 }
  • 20. Passo 7: Mapeando dados ao DOM SVG GitHub:tutorial/map-10.html const geoPath = d3.geoPath();
 svg.selectAll("path")
 .data(map.features)
 .enter().append("path")
 .attr("d", geoPath) Cadafeaturemapeada aumobjeto<path>
  • 21. Passo 8: Projeções geográficas GitHub:tutorial/map-12.html const geoPath = d3.geoPath();
 const projection = d3.geoMercator(); //d3.geoOrthographic(), d3.geoMollweide()...
 geoPath.projection(projection); d3.geoMercator()
  • 22. Coordenadas de cidades: geonames.org geonameid;asciiname;latitude;longitude;population;timezone
 3040051;les Escaldes;42.50729;1.53414;15853;Europe/Andorra
 3041563;Andorra la Vella;42.50779;1.52109;20430;Europe/Andorra
 290594;Umm al Qaywayn;25.56473;55.55517;44411;Asia/Dubai
 291074;Ras al-Khaimah;25.78953;55.9432;115949;Asia/Dubai
 291696;Khawr Fakkan;25.33132;56.34199;33575;Asia/Dubai
 292223;Dubai;25.0657;55.17128;1137347;Asia/Dubai
 292231;Dibba Al-Fujairah;25.59246;56.26176;30000;Asia/Dubai
 292239;Dibba Al-Hisn;25.61955;56.27291;26395;Asia/Dubai
 292672;Sharjah;25.33737;55.41206;543733;Asia/Dubai
 292688;Ar Ruways;24.11028;52.73056;16000;Asia/Dubai
 292878;Al Fujayrah;25.11641;56.34141;62415;Asia/Dubai
 292913;Al Ain;24.19167;55.76056;408733;Asia/Dubai GitHub:csv/cities15000.csv (23505localidades)
  • 23. Passo 9: Dados temáticos: cidades GitHub:tutorial/map-15.html Promise.all([
 d3.json('../geo/world.geojson'),
 d3.dsv(';', '../csv/cities15000.csv', function(row) {
 return {
 name: row.asciiname,
 coords: [+row.longitude, +row.latitude]
 }
 })
 ]).then(function([shapes, points]) {
 map.features = shapes.features;
 map.points = points;
 draw();
 }); svg.selectAll("circle.city")
 .data(map.points)
 .enter()
 .append("circle").attr("class", "city")
 .attr("cx", d => projection(d.coords)[0])
 .attr("cy", d => projection(d.coords)[1])
 .attr("r", d => 1)
  • 25. Conclusões • D3.js é uma poderosa biblioteca para visualização de dados baseada em padrõesabertos • Usada em grandes portais (NY Times, The Guardian, etc.) para visualizações e mapas interativos e base para outros frameworks de visualização • Neste tutorial, foi mostrado como D3 pode ser usada para criar mapastemáticos usando dadosabertos: uma ferramenta essencial em jornalismo de dados
  • 26. Slides, +código-fonte e +demonstrações github.com/argonavisbr/tutorial-geojson www.argonavis.com.br/download/ tdc_2019_js.html julho/2019 helder da rocha helder@argonavis.com.br www.amazon.com/dp/B07PDBBHLLwww.amazon.com/dp/B07RFBV4PC