SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

Mais procurados

Sht vol-9-movimentacao-mecanica-de-cargas
Sht vol-9-movimentacao-mecanica-de-cargasSht vol-9-movimentacao-mecanica-de-cargas
Sht vol-9-movimentacao-mecanica-de-cargasAna Cristina Vieira
 
Avaliação em ed. física
Avaliação em ed. físicaAvaliação em ed. física
Avaliação em ed. físicaMarcos Dieison
 
Feedback em Aprendizagem Motora
Feedback em Aprendizagem MotoraFeedback em Aprendizagem Motora
Feedback em Aprendizagem MotoraCassio Meira Jr.
 
Exercicios e-postura
Exercicios e-posturaExercicios e-postura
Exercicios e-posturaTatiana Lage
 
II convenção01 - Treinamento Físico
II convenção01 - Treinamento FísicoII convenção01 - Treinamento Físico
II convenção01 - Treinamento Físicofabricioboscolo
 
abordagem desenvolvimentista
abordagem desenvolvimentistaabordagem desenvolvimentista
abordagem desenvolvimentistaj2012p
 
Instruções operação com paleteiras
Instruções operação com paleteirasInstruções operação com paleteiras
Instruções operação com paleteirasWilliam Nascimento
 
TREINAMENTO-DE-EMPILHADEIRA-TWE.pdf
TREINAMENTO-DE-EMPILHADEIRA-TWE.pdfTREINAMENTO-DE-EMPILHADEIRA-TWE.pdf
TREINAMENTO-DE-EMPILHADEIRA-TWE.pdfssuser22319e
 
Orientação ao aluno cadeirante
Orientação ao aluno cadeiranteOrientação ao aluno cadeirante
Orientação ao aluno cadeirantedenisegava
 
Pontes rolantes e talhas recomendacoes para uso correto
Pontes rolantes e talhas   recomendacoes para uso corretoPontes rolantes e talhas   recomendacoes para uso correto
Pontes rolantes e talhas recomendacoes para uso corretoLuizBreim
 
APRENDIZAGEM MOTORA, PSICOMOTRICIDADE E SUAS VARIAVEIS.pdf
APRENDIZAGEM MOTORA, PSICOMOTRICIDADE E SUAS VARIAVEIS.pdfAPRENDIZAGEM MOTORA, PSICOMOTRICIDADE E SUAS VARIAVEIS.pdf
APRENDIZAGEM MOTORA, PSICOMOTRICIDADE E SUAS VARIAVEIS.pdfSimoneGiovenardi1
 
Apresentação CIST Eng Rubem Penteado de Melo
Apresentação CIST Eng Rubem Penteado de MeloApresentação CIST Eng Rubem Penteado de Melo
Apresentação CIST Eng Rubem Penteado de MeloRubem Penteado de Melo
 
Operador de Empilhadeira - Reciclagem - NR-11 - Curso online
Operador de Empilhadeira - Reciclagem - NR-11 - Curso onlineOperador de Empilhadeira - Reciclagem - NR-11 - Curso online
Operador de Empilhadeira - Reciclagem - NR-11 - Curso onlineGAC CURSOS ONLINE
 
Compreendendo o Desenvolvimento Motor-Bebês-Crianças-Adolescentes e Adultos -...
Compreendendo o Desenvolvimento Motor-Bebês-Crianças-Adolescentes e Adultos -...Compreendendo o Desenvolvimento Motor-Bebês-Crianças-Adolescentes e Adultos -...
Compreendendo o Desenvolvimento Motor-Bebês-Crianças-Adolescentes e Adultos -...vkarmo
 

Mais procurados (20)

Sht vol-9-movimentacao-mecanica-de-cargas
Sht vol-9-movimentacao-mecanica-de-cargasSht vol-9-movimentacao-mecanica-de-cargas
Sht vol-9-movimentacao-mecanica-de-cargas
 
Avaliação em ed. física
Avaliação em ed. físicaAvaliação em ed. física
Avaliação em ed. física
 
Feedback em Aprendizagem Motora
Feedback em Aprendizagem MotoraFeedback em Aprendizagem Motora
Feedback em Aprendizagem Motora
 
Exercicios e-postura
Exercicios e-posturaExercicios e-postura
Exercicios e-postura
 
II convenção01 - Treinamento Físico
II convenção01 - Treinamento FísicoII convenção01 - Treinamento Físico
II convenção01 - Treinamento Físico
 
abordagem desenvolvimentista
abordagem desenvolvimentistaabordagem desenvolvimentista
abordagem desenvolvimentista
 
Corrida de orientação na escola
Corrida de orientação na escolaCorrida de orientação na escola
Corrida de orientação na escola
 
Passo 3 2007 1
Passo 3 2007 1Passo 3 2007 1
Passo 3 2007 1
 
Instruções operação com paleteiras
Instruções operação com paleteirasInstruções operação com paleteiras
Instruções operação com paleteiras
 
(807549847) ponte rolante-power-point (1)
(807549847) ponte rolante-power-point (1)(807549847) ponte rolante-power-point (1)
(807549847) ponte rolante-power-point (1)
 
Biomecânica - Aula 6 maquinas simples
Biomecânica - Aula 6   maquinas simplesBiomecânica - Aula 6   maquinas simples
Biomecânica - Aula 6 maquinas simples
 
TREINAMENTO-DE-EMPILHADEIRA-TWE.pdf
TREINAMENTO-DE-EMPILHADEIRA-TWE.pdfTREINAMENTO-DE-EMPILHADEIRA-TWE.pdf
TREINAMENTO-DE-EMPILHADEIRA-TWE.pdf
 
PONTES ROLANTES 001.ppt
PONTES ROLANTES 001.pptPONTES ROLANTES 001.ppt
PONTES ROLANTES 001.ppt
 
Fuerza
FuerzaFuerza
Fuerza
 
Orientação ao aluno cadeirante
Orientação ao aluno cadeiranteOrientação ao aluno cadeirante
Orientação ao aluno cadeirante
 
Pontes rolantes e talhas recomendacoes para uso correto
Pontes rolantes e talhas   recomendacoes para uso corretoPontes rolantes e talhas   recomendacoes para uso correto
Pontes rolantes e talhas recomendacoes para uso correto
 
APRENDIZAGEM MOTORA, PSICOMOTRICIDADE E SUAS VARIAVEIS.pdf
APRENDIZAGEM MOTORA, PSICOMOTRICIDADE E SUAS VARIAVEIS.pdfAPRENDIZAGEM MOTORA, PSICOMOTRICIDADE E SUAS VARIAVEIS.pdf
APRENDIZAGEM MOTORA, PSICOMOTRICIDADE E SUAS VARIAVEIS.pdf
 
Apresentação CIST Eng Rubem Penteado de Melo
Apresentação CIST Eng Rubem Penteado de MeloApresentação CIST Eng Rubem Penteado de Melo
Apresentação CIST Eng Rubem Penteado de Melo
 
Operador de Empilhadeira - Reciclagem - NR-11 - Curso online
Operador de Empilhadeira - Reciclagem - NR-11 - Curso onlineOperador de Empilhadeira - Reciclagem - NR-11 - Curso online
Operador de Empilhadeira - Reciclagem - NR-11 - Curso online
 
Compreendendo o Desenvolvimento Motor-Bebês-Crianças-Adolescentes e Adultos -...
Compreendendo o Desenvolvimento Motor-Bebês-Crianças-Adolescentes e Adultos -...Compreendendo o Desenvolvimento Motor-Bebês-Crianças-Adolescentes e Adultos -...
Compreendendo o Desenvolvimento Motor-Bebês-Crianças-Adolescentes e Adultos -...
 

Semelhante a TDC 2019: transformando 
dados
públicos
em mapas interativos

TDC2016SP - Trilha BigData
TDC2016SP - Trilha BigDataTDC2016SP - Trilha BigData
TDC2016SP - Trilha BigDatatdc-globalcode
 
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 SVGHelder da Rocha
 
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.jsHelder da Rocha
 
Design Responsivo com Sass
Design Responsivo com SassDesign Responsivo com Sass
Design Responsivo com SassVitor Garcia
 
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 possibilidadesFellyph Cintra
 
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.Guilherme Vinicius Moreira
 
Javascript no SAPO e libsapojs
Javascript no SAPO e libsapojsJavascript no SAPO e libsapojs
Javascript no SAPO e libsapojscodebits
 
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 conectadosHenrique Gogó
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseLuiz Duarte
 
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çãopcollares
 

Semelhante a 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
 

Mais de Helder da Rocha

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)Helder da Rocha
 
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 sistemasHelder da Rocha
 
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 WebHelder da Rocha
 
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 alternativosHelder da Rocha
 
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)Helder da Rocha
 
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 8Helder da Rocha
 
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)Helder da Rocha
 
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)Helder da Rocha
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
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)Helder da Rocha
 
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 7Helder da Rocha
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)Helder da Rocha
 
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 StreamsHelder da Rocha
 
Threads 07: Sincronizadores
Threads 07: SincronizadoresThreads 07: Sincronizadores
Threads 07: SincronizadoresHelder da Rocha
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e FuturesHelder da Rocha
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentesHelder da Rocha
 

Mais de 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
 

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