SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
T R I L H A
JAVASCRIPT
Sábado
12/10
UNICAP
Recife/PE
helderdarocha

helder@argonavis.com.br
como criar um
mapatemático
interativocom
dadosabertos
e D3.js
Tutorial prático
Usar dados abertos para construir um mapa temático iterativo usando

HTML, CSS, JavaScript, SVG, D3.js, CSV, GeoJSON.


Código
https://github.com/argonavisbr/tutorial-geojson
Playground
CodePen (links no Readme.md)
Shapefile: naturalearthdata.com
www.naturalearthdata.com/downloads/110m-cultural-vectors/
Converter para GeoJSON: mapshaper.org
ne_110m_admin_0_countries.zip
1
2
ne_110m_admin_0_countries.json
3
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", ... }, 

{ "type": "Feature", ... },
...
]
}
{
"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", ... }, 

{ "type": "Feature", ... },
...
]
}
GeoJSON
FeatureCollection
Propriedade feature contém
uma lista (array) de
elementos do tipo Feature
{
"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", ... }, 

{ "type": "Feature", ... },
...
]
}
GeoJSON
Cada elemento Feature
contém propriedades
properties, geometry, id
GeoJSON
Propriedade "id"
(opcional)
Propriedade "properties"
(conteúdo livre)
Propriedade "geometry"
(contém um tipo GeoJSON

ex: "Polygon", "Point", "MultiPolygon")
{
"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", ... }, 

{ "type": "Feature", ... },
...
]
}
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
IN
OUT
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": [ {...},{...},... ]
}
data
Coleção (array) de Features
GeoJSON
1. Parse JSON file
2. Then receive data Object
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]
UmFeature
Lista (array) de Features
Passo 3: Listar coordenadas de objetoGitHub: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]);
Geocoords to pixel coords
<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>
<svg height="500" width="960">
<path class="poly" d="M-10,0 L-3,10 L10,7 L10,-7 L-3,-10 Z">

</svg>
Estrutura SVG gerada
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);

}
<svg height="500" width="960">
<path d="conteúdo de pathData">

</svg>
Estrutura SVG gerada
Cria uma função geradora de
string de dados para <path>)
Usa a função para gerar um string de dados <path> a partir de um Feature GeoJSON)
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)
Cada Feature mapeada
a um objeto <path>
Cria função
Chama função para cada Feature e põe resultado no atrributo "d"
Mapeia cada Feature a um elemento ou placeholder
Cria um novo <path> para cada elemento
Selecione objetos para mapear (podem não existir)
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
Quemsoueu?WhoamI?Ктоя?
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.art.br
Slides, +código-fonte e +demonstrações
github.com/argonavisbr/tutorial-geojson
www.argonavis.com.br/download/tdc_2019_js.html
outubro/2019
helder da rocha
helder@argonavis.com.br
www.amazon.com/dp/B07PDBBHLLwww.amazon.com/dp/B07RFBV4PC

Mais conteúdo relacionado

Mais procurados

Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidJosé Alexandre Macedo
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Willian Magalhães
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasRodrigo Branas
 
Stored Procedures and Triggers
Stored Procedures and TriggersStored Procedures and Triggers
Stored Procedures and Triggersflaviognm
 
EQUAÇÃO EXPONENCIAL - Conceito e resolução
EQUAÇÃO EXPONENCIAL - Conceito e resoluçãoEQUAÇÃO EXPONENCIAL - Conceito e resolução
EQUAÇÃO EXPONENCIAL - Conceito e resoluçãobetontem
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)Alex Camargo
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetosCleyton Ferrari
 
Algoritmos - Lógica de Programação
Algoritmos - Lógica de ProgramaçãoAlgoritmos - Lógica de Programação
Algoritmos - Lógica de ProgramaçãoElaine Cecília Gatto
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosHelder da Rocha
 
Desenvolvimento de uma API RESTful com Java EE
Desenvolvimento de uma API RESTful com Java EEDesenvolvimento de uma API RESTful com Java EE
Desenvolvimento de uma API RESTful com Java EELuan Felipe Knebel
 
1ª lista de exercícios de pesquisa operacional com gabarito
1ª lista de exercícios de pesquisa operacional   com gabarito1ª lista de exercícios de pesquisa operacional   com gabarito
1ª lista de exercícios de pesquisa operacional com gabaritoAntonio Rodrigues
 
Automação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanAutomação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanLucas Amaral
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggersDaniel Maia
 
Plano de aula sobre Progressões
Plano de aula sobre ProgressõesPlano de aula sobre Progressões
Plano de aula sobre Progressõesxtganderson
 
Projeto de Planejamento - Função Quadrática
Projeto de Planejamento - Função QuadráticaProjeto de Planejamento - Função Quadrática
Projeto de Planejamento - Função Quadráticamauriciocampos10mjcg
 

Mais procurados (20)

Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento Android
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
Node.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo BranasNode.js - #1 - Introdução - Rodrigo Branas
Node.js - #1 - Introdução - Rodrigo Branas
 
POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
Stored Procedures and Triggers
Stored Procedures and TriggersStored Procedures and Triggers
Stored Procedures and Triggers
 
EQUAÇÃO EXPONENCIAL - Conceito e resolução
EQUAÇÃO EXPONENCIAL - Conceito e resoluçãoEQUAÇÃO EXPONENCIAL - Conceito e resolução
EQUAÇÃO EXPONENCIAL - Conceito e resolução
 
CSS Cheat Sheet Reference PDF
CSS Cheat Sheet Reference PDFCSS Cheat Sheet Reference PDF
CSS Cheat Sheet Reference PDF
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
Algoritmos - Lógica de Programação
Algoritmos - Lógica de ProgramaçãoAlgoritmos - Lógica de Programação
Algoritmos - Lógica de Programação
 
TDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativosTDC 2019: transformando 
dados
públicos
em mapas interativos
TDC 2019: transformando 
dados
públicos
em mapas interativos
 
Desenvolvimento de uma API RESTful com Java EE
Desenvolvimento de uma API RESTful com Java EEDesenvolvimento de uma API RESTful com Java EE
Desenvolvimento de uma API RESTful com Java EE
 
1ª lista de exercícios de pesquisa operacional com gabarito
1ª lista de exercícios de pesquisa operacional   com gabarito1ª lista de exercícios de pesquisa operacional   com gabarito
1ª lista de exercícios de pesquisa operacional com gabarito
 
Java básico - Módulo 06: Array
Java básico - Módulo 06: ArrayJava básico - Módulo 06: Array
Java básico - Módulo 06: Array
 
Automação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanAutomação de testes de API utilizando Postman
Automação de testes de API utilizando Postman
 
Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggers
 
Programacao linear aula 3 metodo grafico
Programacao linear   aula 3 metodo graficoProgramacao linear   aula 3 metodo grafico
Programacao linear aula 3 metodo grafico
 
Plano de aula sobre Progressões
Plano de aula sobre ProgressõesPlano de aula sobre Progressões
Plano de aula sobre Progressões
 
Aula Introdução a Linguagem XML
Aula Introdução a Linguagem XMLAula Introdução a Linguagem XML
Aula Introdução a Linguagem XML
 
Projeto de Planejamento - Função Quadrática
Projeto de Planejamento - Função QuadráticaProjeto de Planejamento - Função Quadrática
Projeto de Planejamento - Função Quadrática
 

Semelhante a Como criar um mapa temático interativo com dados abertos e D3.js

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
 
Utilizando GeoTools para Manipulação de Dados Geográficos
Utilizando GeoTools para Manipulação de Dados GeográficosUtilizando GeoTools para Manipulação de Dados Geográficos
Utilizando GeoTools para Manipulação de Dados Geográficospcollares
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Jeison Barros
 
Operações com dados espaciais (Vetor) em R
Operações com dados espaciais (Vetor) em ROperações com dados espaciais (Vetor) em R
Operações com dados espaciais (Vetor) em RVitor Vieira Vasconcelos
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesLuis Gustavo Almeida
 
Sql4 devs geodatabases
Sql4 devs geodatabasesSql4 devs geodatabases
Sql4 devs geodatabasesResource IT
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)Luís Cobucci
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
TDC2016SP - Trilha BigData
TDC2016SP - Trilha BigDataTDC2016SP - Trilha BigData
TDC2016SP - Trilha BigDatatdc-globalcode
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomNelson Glauber Leal
 
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoJulio Monteiro
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Androidjoaobmonteiro
 
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaJoselito Nascimento
 

Semelhante a Como criar um mapa temático interativo com dados abertos e D3.js (20)

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.
 
Utilizando GeoTools para Manipulação de Dados Geográficos
Utilizando GeoTools para Manipulação de Dados GeográficosUtilizando GeoTools para Manipulação de Dados Geográficos
Utilizando GeoTools para Manipulação de Dados Geográficos
 
Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2Data mapping com Groovy - Part 2
Data mapping com Groovy - Part 2
 
Operações com dados espaciais (Vetor) em R
Operações com dados espaciais (Vetor) em ROperações com dados espaciais (Vetor) em R
Operações com dados espaciais (Vetor) em R
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e Routes
 
Sql4 devs geodatabases
Sql4 devs geodatabasesSql4 devs geodatabases
Sql4 devs geodatabases
 
jQuery básico (parte 3)
jQuery básico (parte 3)jQuery básico (parte 3)
jQuery básico (parte 3)
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
TDC2016SP - Trilha BigData
TDC2016SP - Trilha BigDataTDC2016SP - Trilha BigData
TDC2016SP - Trilha BigData
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com Room
 
Android Firebase
Android FirebaseAndroid Firebase
Android Firebase
 
Minicurso groovy grails
Minicurso groovy grailsMinicurso groovy grails
Minicurso groovy grails
 
MongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documentoMongoDB: um banco de dados orientado a documento
MongoDB: um banco de dados orientado a documento
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
JQuery
JQuery JQuery
JQuery
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Android
 
Ajax em java
Ajax em javaAjax em java
Ajax em java
 
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosaChrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
Chrome Apps e NodeWebkit: traga seu webapp para o Desktop - #outubrorosa
 
Escrevendo plugins JQuery
Escrevendo plugins JQueryEscrevendo plugins JQuery
Escrevendo plugins JQuery
 
Android + firebase
Android + firebaseAndroid + firebase
Android + firebase
 

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
 
Threads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaThreads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaHelder 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 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
 
Threads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão MútuaThreads 05: Travas de Exclusão Mútua
Threads 05: Travas de Exclusão Mútua
 

Último

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.docx2m Assessoria
 
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.docx2m Assessoria
 
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 exemploDanilo Pinotti
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfNatalia Granato
 
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.docx2m Assessoria
 
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 CalisthenicsDanilo Pinotti
 

Último (6)

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
 
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
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
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
 

Como criar um mapa temático interativo com dados abertos e D3.js

  • 1. T R I L H A JAVASCRIPT Sábado 12/10 UNICAP Recife/PE helderdarocha
 helder@argonavis.com.br como criar um mapatemático interativocom dadosabertos e D3.js
  • 2. Tutorial prático Usar dados abertos para construir um mapa temático iterativo usando
 HTML, CSS, JavaScript, SVG, D3.js, CSV, GeoJSON. 
 Código https://github.com/argonavisbr/tutorial-geojson Playground CodePen (links no Readme.md)
  • 5. Converter para GeoJSON: mapshaper.org ne_110m_admin_0_countries.zip 1 2 ne_110m_admin_0_countries.json 3 JSON
  • 6. Alternativas: aplicativo GIS ou GDAL $ ogr2ogr -f GeoJSON resultado.geojson ne_110m_admin_0_countries.json.shp gdal.org qgis.org
  • 7. 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", ... }, 
 { "type": "Feature", ... }, ... ] }
  • 8. { "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", ... }, 
 { "type": "Feature", ... }, ... ] } GeoJSON FeatureCollection Propriedade feature contém uma lista (array) de elementos do tipo Feature
  • 9. { "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", ... }, 
 { "type": "Feature", ... }, ... ] } GeoJSON Cada elemento Feature contém propriedades properties, geometry, id
  • 10. GeoJSON Propriedade "id" (opcional) Propriedade "properties" (conteúdo livre) Propriedade "geometry" (contém um tipo GeoJSON
 ex: "Polygon", "Point", "MultiPolygon") { "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", ... }, 
 { "type": "Feature", ... }, ... ] }
  • 11. 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 IN OUT
  • 12.
  • 13. 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": [ {...},{...},... ] } data Coleção (array) de Features GeoJSON 1. Parse JSON file 2. Then receive data Object
  • 14. Passo 1: Carregar o GeoJSON GitHub:tutorial/map-1.html
  • 15.
  • 16.
  • 17. 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] UmFeature Lista (array) de Features
  • 18. Passo 3: Listar coordenadas de objetoGitHub: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]); Geocoords to pixel coords
  • 19. <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
  • 20. 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> <svg height="500" width="960"> <path class="poly" d="M-10,0 L-3,10 L10,7 L10,-7 L-3,-10 Z">
 </svg> Estrutura SVG gerada
  • 21. 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);
 } <svg height="500" width="960"> <path d="conteúdo de pathData">
 </svg> Estrutura SVG gerada Cria uma função geradora de string de dados para <path>) Usa a função para gerar um string de dados <path> a partir de um Feature GeoJSON)
  • 22. 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) Cada Feature mapeada a um objeto <path> Cria função Chama função para cada Feature e põe resultado no atrributo "d" Mapeia cada Feature a um elemento ou placeholder Cria um novo <path> para cada elemento Selecione objetos para mapear (podem não existir)
  • 23. 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()
  • 24. 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)
  • 25. 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)
  • 26. Passo 10: Interatividade GitHub:tutorial/map-19.html
  • 27. 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
  • 28. Quemsoueu?WhoamI?Ктоя? 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.art.br
  • 29. Slides, +código-fonte e +demonstrações github.com/argonavisbr/tutorial-geojson www.argonavis.com.br/download/tdc_2019_js.html outubro/2019 helder da rocha helder@argonavis.com.br www.amazon.com/dp/B07PDBBHLLwww.amazon.com/dp/B07RFBV4PC