Git Product home page Git Product logo

state-codes's Introduction

datasets-br

Describing the datasets-br directives and using this project as point of generic discussions.

Dataset-BR directives

  1. To post qualified datasets in the Datahub.io;
  2. To unify, by curatory process, a set of Wikidata fragments if items, or commom instances of an item;
  3. To unify terminology to express CSV colunm names, table and column semantics (SchemaOrg conventions when possible)
  4. Digital preservation (CSV files and data dumps from original soruces) of the curated datasets;
  5. Monitoring/auditing Wikidata and OpenStreetMap changes, in the context of the curated datasets.

Use as an ecosystem of datasets

Example of use with 2 BR's datasets, state-codes and city-codes.

Operating with pure SQL or SQL-unifier will be easy to merge with other datasets... With PopstgreSQL you can offer datasets in an standard API with PostgreREST (or its descendents pREST and PostGraphile), or plug-and-play with SchemaOrg standards, FrictionlessData standards (and tools), etc.

Documentation

... under construction

Conventions for data provenance and prepare.


  Contents and data of this project are dedicated to

state-codes's People

Contributors

ppkrauss avatar rikenji avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

state-codes's Issues

Review and change field names

Now SchemaOrg have eg. https://pending.schema.org/termCode to complement a name in the context of DefinedTerm or CategoryCode.

Use also temporalCoverage, but checking the best format for CSV interchange. For ISO 3601 the open-end is possible by ".." in the future ISO version.


Suggestion:

[state|code ascii text +PK2;temporalCoverage +PK3; name text; region_code text; wd_id int +PK; ibge_id int +PK4; lexLabel ascii text +PK3; isCurrent boolean; info JSONb{bg:tomato}]

[region|code ascii text +PK2;temporalCoverage +PK3; name text;fullname text;wd_id int +PK;lexLabel ascii text  +PK3;isCurrent boolean; info JSONb]

[city|name text;state_code ascii text +PK2;temporalCoverage +PK2; wd_id int +PK;ibge_id int +PK3;lexLabel ascii text +PK2;isCurrent boolean; info JSONb{bg:sandybrown}]

[wd_synonym|name text +PK; synonym_type ascii text  +PK;wd_id int +PK;ref;isOfficial boolean;info JSONb]

[state]2..*---1[region]
[city]1..*--->in[state]

[wd_synonym]*----1[state]
[wd_synonym]*----1[city]
[wd_synonym]*----1[region]

Padronizar ordem das regiões

Ops, faltou critério de "order by" em br-region-codes.csv... E melhor evitar uso da data, usar nome completo ou abreviação como critério de ordenação. Tal como nos estados, em 2 grandes grupos, primeiro as regiões vigentes depois as extintas.

Rebatizar regiões extintas conforme seu ano de criação, com prefixo RG seguido do ano.
Por exemplo RG1940-NE para a antiga Região Nordeste, definida em 1940.

Corrigir atribuição de osm-relation SP na Wikidata

Foi atribuído código de relation do município ao invés de estado.

Sugestão: criar página ou tabela.md com links e instruções para poder rapidamente conferir mapas, visualmente. Se for possível gravar thumbs com algum recurso OSM melhor.

Inclusão dos anos de origem para garantir ordem de precedência

A decisão por uso de data arbitrária como referência para organização do dataset (fundação da República) é razoável, mas como existe ainda vigente uma legislação relativa à ordem de precedência entre os estados brasileiros, convém dar preferência para esta última.


Segundo wikipedia:

  • Bahia (1534)
  • Rio de Janeiro (1565)
  • Maranhão (1534, reconquistado em 1615)
  • Pará (1616)
  • Pernambuco (1534, reconquistado em 1643)
  • São Paulo (1709)
  • Minas Gerais (1720)
  • Goiás (1748)
  • Mato Grosso (1748)
  • Rio Grande do Sul (1760)
  • Ceará (1799)
  • Paraíba (1799)
  • Espírito Santo (1810)
  • Piauí (1811)
  • Rio Grande do Norte (1817)
  • Santa Catarina (1738)
  • Alagoas(1817)
  • Sergipe(1820)
  • Amazonas (1850)
  • Paraná (1853)
  • Acre (1962)
  • Mato Grosso do Sul (1979)
  • Rondônia (1982)
  • Tocantins (1988)
  • Roraima (1988)
  • Amapá (1988)
  • Distrito Federal (1960)

Merge de issues, novos campos

Merge de #19, #20 e inclusão de novos campos. Definições:

Incluir lib SQL e queries no src.

Reestruturar usando tabela de sinônimos

Assim que fixar padrão final para br-city-synonyms.csv, criar tabela similar (br-state-synonyms) para simplificar análise e recuperação de dados. A tabela de sinônimos também reforça a questão do controle terminológico — deixando a questão dos desmembramentos e redefinições espaciais por conta talvez de uma futura tabela (unificando estados e regiões tendo em vista que são espacialmente acoplados).

normalizar JSON

usar JSON canônico ou (supondo sempre JSONb portanto objetos canônicos) normalizado.
Por hora fechar na convenção do PHP. depois conferir com padrões.

Gravar backup do JSON Wikidata

http://Wikidata.org é a nossa principal fonte de dados depois que nomes e códigos estão devidamente homologados. O presente repositório, a principio, é apenas um backup dos dados Wikidata. Pode também ser um recurso para manter versões estáveis da Wikidata, se houverem algoritmos de consistência e auditoria das atualizações realizadas.

Incluir cópias dos dados JSON em /data/wikidata como arquivos nomeEstado.json, e manter o atualizador de backups como state-codes/src/etc/dumpWikidata.php. Muito parecido com city-codes/src/etc/dumpWikidata.php.

garantir LF

Quando usuário Windows colabora, há risco de gerar modificação não-intencional sistemática nos arquivos, por inclusão do CRLF. Medidas para evitar o problema:

  1. Convenção global do datasets-br, usar LF (Unix end-o-line)
  2. Boa prática no git, git config --global core.autocrlf input
  3. (mais importante!) mudar o .gitattributes

Convenção:

# Plase configure your git as Linux to properly handle line endings
#  git config --global core.autocrlf input

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Declare files that will always have LF line endings (Linux mode) on checkout.
* text eol=lf

# Denote all files that are truly binary and should not be modified.
*.pdf binary
*.png binary
*.jpg binary
*.zip binary

renomear JSONs e incluir OSM

Lembrar que os dados JSON são dataset dumps de outras fontes. Para enfatizar isso renomear data/wikidata para data/dump_wikidata.


NOTA SOBRE COMPLETEZA DOS DADOS

Reparar que auditando, por simples
grep P402 data/dump_wikidata/* | wc -l (resultou em 24 na v1.2.0)
a falta de referência aos polígonos pode ser evidenciada. Algum trabalho de revisão e homologação também precisa ser feito antes de lançar a v1.3.0 com os polígonos.

  • UFs correntes sem polígono indicado na Wikidata: AM, DF, MA.
  • Idem todos os mapas históricos: FN, GB, GU, IG, PP, RB.

Revisão final de nomes e cotroles

Principais sugestões pendentes no controle de qualidade e consistência com outros repositórios:

  • reunir num só SQL conforme modelo https://github.com/datasets-br/datasets-br

  • validar código IBGE contra dados Wikidata para garantir consistência. (já lembrado antes na issue #11)

  • Cruzamento e consistência com municípios e com demais dados Wikidata.

  • Avaliar se vale mudar campos de nome para manter padrão já usado por outros como https://github.com/mapaslivres/localidades ou fontes oficiais IBGE

  • Avaliar o que fazer com dumps: passar para git OSM-BR ou manter por aqui (PostGIS com shapes IBGE).

Área e zona UTM no PostGIS

Complemento à issue #15, referente a área. A zona utm é um código com demanda ainda nos dias de hoje, e fácil de se obter a partir dos dados PostGIS, que podem ser de origem do OpenStreetMap ou outra fonte.


Teste com NaturalEarth-10m-cultural

wget https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_1_states_provinces.zip
unzip ne_10m_admin_1_states_provinces.zip
shp2pgsql ne_10m_admin_1_states_provinces.shp | psql postgres trydatasets
SELECT iso_3166_2, 
               round(st_area(geom,true)::numeric/1000000.0) area_km2, 
               array_to_string(  get_utmzone_names(geom), ' ') utm_name  
FROM  ne_10m_admin_1_states_provinces 
WHERE iso_3166_2 like 'BR-%';

Resultados: problema com área, compare com Wikidata,

iso_3166_2 area_km2 utm_name
BR-RS 272283 21S 22S
BR-RR 224746 20N 21N 20S
BR-PA 1230800 21N 22N 21S 22S 23S
BR-AC 153863 18S 19S
BR-AP 139181 21N 22N 22S
BR-MS 356042 21S 22S
BR-PR 198666 21S 22S
BR-SC 95097 22S
BR-AM 1565685 19N 20N 21N 18S 19S 20S 21S
BR-MT 902952 20S 21S 22S
BR-RO 237942 19S 20S 21S
BR-MA 326134 22S 23S 24S
BR-PI 252011 23S 24S
BR-CE 150228 24S
BR-RN 52812 26N 24S 25S
BR-PB 56516 24S 25S
BR-PE 97630 24S 25S
BR-AL 27619 24S 25S
BR-RJ 43978 23S 24S
BR-SP 248638 22S 23S
BR-SE 21606 24S
BR-BA 560050 23S 24S
BR-ES 45806 24S 26S
BR-MG 586372 22S 23S 24S
BR-TO 278973 22S 23S
BR-GO 341247 22S 23S
BR-DF 5792 22S 23S

lib

CREATE FUNCTION get_srname(p_srid int, p_reduce int default 0) RETURNS text AS $f$
   SELECT trim( (regexp_matches(srtext,CASE
      WHEN $2=1 THEN 'PROJCS\["[^"]*/([^"]+)"'
      WHEN $2=2 THEN 'PROJCS\["[^"]*/\s*UTM zone\s*([^"]+)"'
      ELSE 'PROJCS\["([^"]+)"' END
   ))[1] )
   FROM spatial_ref_sys
   WHERE srid=$1
$f$ LANGUAGE SQL IMMUTABLE;

CREATE FUNCTION get_utmzone(
  p_geom geometry(POINT)
) RETURNS integer AS $f$
  SELECT CASE
    WHEN p_geom IS NULL OR GeometryType(p_geom) != 'POINT' THEN NULL
    ELSE floor((ST_X(p_geom)+180.0)/6.0)::int
         + CASE WHEN ST_Y(p_geom)>0.0 THEN 32601 ELSE 32701 END
    END
$f$ LANGUAGE SQL IMMUTABLE;

CREATE FUNCTION get_utmzone_bydump(p_geom geometry) RETURNS integer[] AS $f$
  SELECT array_agg( DISTINCT get_utmzone(geom) )
  FROM ST_DumpPoints( p_geom )
$f$ LANGUAGE SQL IMMUTABLE;

CREATE FUNCTION get_utmzone_names(
  p_geom geometry, 
  p_type int DEFAULT 2
) RETURNS text[] AS $wrap$
  SELECT array_agg(get_srname(x,p_type)) 
  FROM unnest(get_utmzone_bydump(p_geom)) t(x)
$wrap$ LANGUAGE SQL IMMUTABLE;

Incluir P402 de MA e DF na Wikidata

Conforme log de atualização,

  • DF: Q119158 ERROR, no osmId or P402 for DF. ERROR, empty json for DF.
  • MA: Q1155409 ERROR, no osmId or P402 for MA. ERROR, empty json for MA.

Fronteiras entre estados

Usando mapa oficial do IBGE de 2017.

uf_vigente faz_fronteira_com
AC AM
AL BA PE SE
AM AC MT PA RO RR
AP PA
BA AL ES GO MG PE PI SE TO
CE PB PE PI RN
DF GO MG
ES BA MG RJ
GO BA DF MG MS MT TO
MA PA PI TO
MG BA DF ES GO MS RJ SP
MS GO MG MT PR SP
MT AM GO MS PA RO TO
PA AM AP MA MT RR TO
PB CE PE RN
PE AL BA CE PB PI
PI BA CE MA PE TO
PR MS SC SP
RJ ES MG SP
RN CE PB
RO AM MT
RR AM PA
RS SC
SC PR RS
SE AL BA
SP MG MS PR RJ
TO BA GO MA MT PA PI
CREATE FUNCTION lib.id_ibge2uf(p_id text) REtURNS text AS $$
  SELECT ('{
    "12":"AC", "27":"AL", "13":"AM", "16":"AP", "29":"BA", "23":"CE", 
    "53":"DF", "32":"ES", "52":"GO", "21":"MA", "31":"MG", "50":"MS", 
    "51":"MT", "15":"PA", "25":"PB", "26":"PE", "22":"PI", "41":"PR", 
    "33":"RJ", "24":"RN", "11":"RO", "14":"RR", "43":"RS", "42":"SC", 
    "28":"SE", "35":"SP", "17":"TO"
  }'::jsonb)->>$1
$$ language SQL immutable;

SELECT a_nm, array_to_string(array_agg(b_nm),' ') faz_fronteira_com 
FROM (
  SELECT DISTINCT a_nm, b_nm 
  FROM (
     SELECT lib.id_ibge2uf(a.cd_geocuf) a_nm, 
                    lib.id_ibge2uf(b.cd_geocuf) b_nm, 
                    ST_Relate(a.geom,b.geom) rel 
     FROM brufe250gc_sir a, brufe250gc_sir b 
     WHERE a.cd_geocuf!=b.cd_geocuf AND a.geom && b.geom
  ) t 
WHERE rel!='FF2FF1212'
ORDER BY 1,2) tt  group by 1 order by 1

Pode-se conferir os valores rel com a função lib.ST_Relate_summary().

PS: as relações são reduzidas a interseções de área com st_buffer(a.geom,0.0001), restando 51 casos de interseção tipo rel='212101212'.

Área e população corrente

A população corrente de uma divisão territorial revela a sua importância, segundo diversos critérios:

  • Relevância humana: quanto maior a população, maior a quantidade de indivíduos merecedores do mesmo "direito à vida" e demais direitos fundamentais. A maioria dos indicadores de demanda por recursos básicos (ex. saúde e educação) também é proporcional à população.

  • Democrática: quanto maior a população, maior a expressividade eleitoral dentro da nação.

  • Econômica: forte correlação entre riqueza e população, dentro de uma região com mesmo perfil de distribuição de renda.

  • etc.

De modo que filtros simples para interface, etc. podem requerer o uso de dados sobre população. Como a densidade de habitantes é uma métrica derivada igualmente importante, e a própria área da região outro parâmetro interessante para filtros básicos... Convém acrescentar ambas, área e população, viabilizando o cálculo da densidade populacional.


Problema de completeza com a Wikidata, no metadado de population (P1082) dos estados: grep P1082 data/dump_wikidata/*.json | wc -l resultando em 14.

Por hora a Wikidata seria apenas referência de validação, a fonte principal continua sendo IBGE.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.