SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

Introdução ao Flyway
Introdução ao FlywayIntrodução ao Flyway
Introdução ao FlywayJadson Santos
 
Estrutura de Dados - Aula 01
Estrutura de Dados - Aula 01Estrutura de Dados - Aula 01
Estrutura de Dados - Aula 01thomasdacosta
 
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e WebdriverJúlio de Lima
 
Introdução a programação para a Internet
Introdução a programação para a InternetIntrodução a programação para a Internet
Introdução a programação para a InternetLeonardo Soares
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaProgramação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaDaniel Brandão
 
Treinamento de SQL Básico
Treinamento de SQL BásicoTreinamento de SQL Básico
Treinamento de SQL BásicoIgor Alves
 
Utilizando views, stored procedures e triggers
Utilizando views, stored procedures e triggersUtilizando views, stored procedures e triggers
Utilizando views, stored procedures e triggersDaniel Maia
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Desenvolvimento em Três Camadas com PHP, MVC e Ajax
Desenvolvimento em Três Camadas com PHP, MVC e AjaxDesenvolvimento em Três Camadas com PHP, MVC e Ajax
Desenvolvimento em Três Camadas com PHP, MVC e AjaxAlmir Neto
 
PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX Sérgio Souza Costa
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisFabrício Lopes Sanchez
 

Was ist angesagt? (20)

Introdução ao Flyway
Introdução ao FlywayIntrodução ao Flyway
Introdução ao Flyway
 
Node.js e Express
Node.js e ExpressNode.js e Express
Node.js e Express
 
Aula 5 - Cookies e Sessões em PHP
Aula 5 - Cookies e Sessões em PHPAula 5 - Cookies e Sessões em PHP
Aula 5 - Cookies e Sessões em PHP
 
Padrões MVC
Padrões MVCPadrões MVC
Padrões MVC
 
Estrutura de Dados - Aula 01
Estrutura de Dados - Aula 01Estrutura de Dados - Aula 01
Estrutura de Dados - Aula 01
 
Introdução a Framework Flask
Introdução a Framework FlaskIntrodução a Framework Flask
Introdução a Framework Flask
 
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
 
Introdução a programação para a Internet
Introdução a programação para a InternetIntrodução a programação para a Internet
Introdução a programação para a Internet
 
Programação Orientação a Objetos - Herança
Programação Orientação a Objetos - HerançaProgramação Orientação a Objetos - Herança
Programação Orientação a Objetos - Herança
 
Plano de aula sobre HTML básico
Plano de aula sobre HTML básicoPlano de aula sobre HTML básico
Plano de aula sobre HTML básico
 
Treinamento de SQL Básico
Treinamento de SQL BásicoTreinamento de SQL Básico
Treinamento de SQL Básico
 
Utilizando views, stored procedures e triggers
Utilizando views, stored procedures e triggersUtilizando views, stored procedures e triggers
Utilizando views, stored procedures e triggers
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Modelos de processos de software
Modelos de processos de softwareModelos de processos de software
Modelos de processos de software
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
Ordenação
OrdenaçãoOrdenação
Ordenação
 
Desenvolvimento em Três Camadas com PHP, MVC e Ajax
Desenvolvimento em Três Camadas com PHP, MVC e AjaxDesenvolvimento em Três Camadas com PHP, MVC e Ajax
Desenvolvimento em Três Camadas com PHP, MVC e Ajax
 
PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentaisEstrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Conceitos fundamentais
 

Ähnlich wie Mapa interativo com D3.js e dados abertos

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
 

Ähnlich wie Mapa interativo com D3.js e dados abertos (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
 

Mehr von 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
 

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
 

Mapa interativo com D3.js e dados abertos

  • 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