GeoSampa é oficializado como base oficial

Boas notícias sobre o GeoSampa, um dos projetos desenvolvidos e apoiados pela SIGMA Geosistemas.

O GeoSampa é um portal de informações geográficas, disponibilizado pela PRODAM e pela SMUL (Secretaria Municipal de Urbanismo e Licenciamento), contendo mais de 180 camadas de informações geográficas.

A prefeitura de São Paulo, oficializou a plataforma como base de dados oficial do município, aumentando ainda mais a relevância da mesma, através do decreto 57.770, editado pelo prefeito João Dória.

A plataforma já era bastante utilizada pela população e pelos colaboradores municipais, agora tem o status de base de dados oficial, possuindo mais de cem mil acessos mensais únicos.

Este é um passo importante para a correta institucionalização do sistema, permitindo uma sinergia entre os diversos interessados nos dados existentes e publicados através da mesma.

Entre os artigos do decreto, um me chama bastante atenção, oficializando o GeoSampa como plataforma integradora:

Art. 6º Os sistemas de dados e informações municipais de qualquer natureza deverão ser estruturados pelos órgãos responsáveis de forma a permitir sua interoperabilidade e integração com os demais sistemas, facilitando seu escalonamento, reuso e manutenção, e deverão:

I – garantir a simplificação do acesso, de forma a possibilitar à Administração Municipal o uso eficiente de suas informações no atendimento às demandas internas e externas;

II – dar transparência às ações de governo, de forma a permitir o acesso público a todas as informações que não sejam de uso restrito, em conformidade com a legislação pertinente, em especial o Decreto nº 53.623, de 12 de dezembro de 2012;

III – garantir que não haja a sobreposição de ações, evitando o dispêndio desnecessário de recursos e a duplicidade de dados da Administração Municipal.

Parágrafo único. O mecanismo de integração deverá garantir ao usuário acesso à informação atualizada por meio do sincronismo entre os sistemas e as bases externas com periodicidade definida e da atualização da base geoespacial.

O artigo 6° é uma comprovação de nossa filosofia de trabalho: o geoprocessamento pode e deve ser usado de forma inteligente, de maneira aumentar a eficiência do planejamento e redução de custos para a administração pública.

A SIGMA Geosistemas ajuda e ajudou na construção desta plataforma, utilizando apenas tecnologias livres. Dentre os serviços executados, desenvolvemos todas as ferramentas de análise, disponíveis por enquanto na intranet – como filtros, pesquisas geoespaciais, geração de gráficos e agrupamentos.

Em tempo, gostaria de parabenizar a toda equipe envolvida no GeoSampa e ao prefeito, por uma decisão acertada.

Ainda teremos muitas novidades sobre esta plataforma. Fique ligado!

Django Topology

Olá pessoal!

Aqui na SIGMA sempre estamos desenvolvendo ferramentas úteis para nós e que talvez também sejam úteis para outras pessoas.

Nossa ideia principal, é contribuir um pouco com esse enorme ecossistema Python/Django existente. Como já disseram, estamos sobre os ombros de gigantes.

Bem, desenvolvemos o Django Topology com o objetivo de simplificar a validação de dados geométricos/geográficos que encontramos em nosso dia a dia.

É muito comum, por exemplo, ter de validar a entrada de um polígono e precisamos garantir que ele esteja dentro de outro polígono. Ou garantir que este polígono específico não esteja sobrepondo outro polígono de uma mesma classe.

Para isso desenvolvemos o Django Topology. Através dele você consegue configurar suas validações dentro do banco de dados e executá-las de forma simples.

O fluxo é simples e o pacote já conta com três validações:

  • must be contained – garante que o modelo A deve estar contido no modelo B;
  • must not overlap – garante que o modelo A não pode sobrepor nenhum outro registro em A;
  • must not overlap with – garante que o modelo A não pode sobrepor o modelo B;

O pacote é facilmente extensível e você desenvolver suas próprias validações topológicas.

Um exemplo simples:

        rule = Rule(
            name='regra de validação 1',
            description='A deve estar contido em B',
            message='deve estar contido',
            method='topology.rules.must_be_contained'
        )
        rule.save()
        topology_rule = TopologyRule(
            content_type_a=ContentType.objects.get(app_label='seuapp', model='item'),
            content_type_b=ContentType.objects.get(app_label='seuapp', model='container'),
            geom_field_b='geom',
            rule=rule
        )
        topology_rule.save()

Até aqui, definimos nossa regra topológica, de que A (qualquer instância do modelo Item) deve estar contida em B (Container).

Veja como realizar a validação:

        item_a = Item(geom=unit_polygon(Point(x=0.0, y=0.0, srid=4326)))
        item_a.save()
        container = Container(geom=unit_polygon(Point(x=0.0, y=0.0, srid=4326), size=3))
        container.save()

        errors = topology_rule.validate(item_a)
        len(errors)
>>> 3

No exemplo acima, calculamos os erros diretamente pela regra topológica (TopologyRule) e não foi encontrado nenhum erro.

Os erros gerados pelo TopologyRule não são persistidos no banco de dados, ficando a cargo do desenvolvedor a determinar o melhor momento para tal. As vezes nem será necessário, como por exemplo, em uma validação de formulário Django.

Também desenvolvemos um análogo ao TopologyChecker do QGIS e ele tem o mesmo nome. Sua função é executar todas as validações associadas a um determinado modelo, de uma vez, e persisti-las (ou não).

Veja como usá-lo:

        # definindo as regras
        rule1 = Rule(
            name='A não deve sobrepor A',
            description='A não deve sobrepor A',
            message='sobrepõe',
            method='topology.rules.must_not_overlap'
        )
        rule1.save()
        rule2 = Rule(
            name='A não deve sobrepor B',
            description='A não deve sobrepor B',
            message='sobrepõe',
            method='topology.rules.must_not_overlap_with'
        )
        rule2.save()
        topology_rule1 = TopologyRule(
            content_type_a=ContentType.objects.get(app_label='seuapp', model='item'),
            rule=rule1
        )
        topology_rule1.save()
        topology_rule2 = TopologyRule(
            content_type_a=ContentType.objects.get(app_label='seuapp', model='item'),
            content_type_b=ContentType.objects.get(app_label='seuapp', model='container'),
            geom_field_b='geom',
            rule=rule2
        )
        topology_rule2.save()

        item1 = Item(geom=unit_polygon(Point(x=0.0, y=0.0, srid=4326)))
        item1.save()
        item2 = Item(geom=unit_polygon(Point(x=0.0, y=0.0, srid=4326)))
        item2.save()
        container = Container(geom=unit_polygon(Point(x=0.0, y=0.0, srid=4326), size=2))
        container.save()

        # até aqui, criamos nossas regras e os registros de item e container

        topo_checker = TopologyChecker()

        errors = topo_checker.validate_all(Item)

O TopologyChecker retorna um dicionário, usando como chave o nome da validação executada e uma lista associada, com N erros detectados. No caso acima, o topologychecker encontrou 4 erros:

  • item 1 sobrepõe item 2;
  • item 2 sobrepõe item 1;
  • item 1 sobrepõe Container 1;
  • item 2 sobrepõe COntainer 1;

Estamos usando o Django Topology em produção no Geoadmin um produto que trabalha intensivamente com dados geográficos.

Você pode extender o mesmo com suas próprias validações. Basta criar um método com a seguinte assinatura:

def minha_validacao(rule, feature, **kwargs):
    # sua validacao aqui
    # deve retornar uma lista de TopologyError (sem salvar no banco)
    if feature.geom.intersects(outra_geometria):
        return [TopologyError()]

    return []

Com este método pronto, você só precisa criar uma Rule, apontando o atributo method para o caminmho qualificado da sua função:

rule = Rule(
    name='name'
    method='foo.bar.minha_validacao
)

Quer ajudar? Estamos aí, confere o repositório e bora lá.

Mágicas com UTM

A projeção UTM (Universal Transverse Mercator) é muito utilizada para todos os tipos de cartografia.

Ela nem sempre se aplica a todos os casos e deveria ser menos utilizada em algumas aplicações, mas com toda certeza é bastante comum no Brasil e no mundo.

Uma das características marcantes desta projeção, é que ela não é uma projeção única. São 60 zonas com parâmetros diferentes, para cada local do planeta, dividido a cada 6 graus de longitude.

Vou ensinar algumas mágicas utilizando princípios simples para se descobrir maiores informações, necessárias quando estamos trabalhando com essas zonas.

Zona UTM > Meridiano Central

O meridiano central de uma zona UTM é o local que possui a menor distorção da projeção.

Podemos calculá-lo, seguindo a fórmula:

MC = (6 * Z) - 183

Veja o exemplo:

MC = (22 * 6) - 183
MC = 132 - 183
MC = -51

Um outro exemplo, com a zona 30:

MC = (30 * 6) - 183
MC = 180 - 183
MC = -3

Para encontrar os limites de uma zona UTM, adicione 3 graus para o limite oeste e subtraia 3 graus para o limite leste.

MC = -51
Limite Leste = -51 - 3
Limite Leste = -54
Limite Oeste = -51 + 3
Limite Oeste = -48

Longitude > Meridiano Central

Este cálculo é importante: baseado no valor X (ou longitude), você consegue descobrir qual é o meridiano central da zona daquela coordenada.

# nota a divisão de longitude por 6 deve considerar apenas valores inteiros
MC = (6 * int(longitude/6)) + 3
MC = (6 * (-48/6)) + 3
MC = (6 * -8) + 3
MC = -45

Meridiano Central > Zona UTM

Com este cálculo, você informa o meridiano central e descobre qual zona UTM ele está inserido.

UTMZ = 30 - absoluto(int(MC/6))
UTMZ = 30 - absoluto(int(-45/6))
UTMZ = 30 - absoluto(int(-7.5))
UTMZ = 23

São três continhas fáceis de serem realizadas, que ajudam muito na hora de trabalhar com UTM.

SIG com Python

Este é um tema vasto e pretendo falar sobre alguns conceitos como: Datum, Sistemas de Coordenadas, Projeção, Sistema de Referência e conceitos de SIG (Sistemas de Informações Geográficas).
Não conseguiremos cobrir os conceitos de operações espaciais, porém na demonstração isto será ilustrado em linhas gerais.

Este é um artigo derivado do screencast SIG com Python, disponível no YouTube.

O ambiente em que executamos esta aplicação está disponível no servidor de código fonte da sigma em: https://gitlab.sigmageosistemas.com.br/screencasts/gis-hands_on, neste repositório você tem o Dockerfile e no repositório https://gitlab.sigmageosistemas.com.br/dev/dockerize você encontra instruções de como buildar e montar esta imagem.

Localização e Medições

Localizar e Medir são uma necessidade inerente ao ser humano desde as sociedades mais antigas.

Com o passar dos séculos, foi preciso definir medidas mais precisas e padronizá-las permitindo às pessoas em qualquer local do planeta, entender e realizar medições, para estimar distancias, áreas e locais, definindo precisamente as fronteiras de um pais, estado, cidade, fazendas e terrenos.

A Geodésia é a área de conhecimento que estuda e aprimora os métodos de medição do planeta.

O planeta terra tem forma similar à uma batata, sendo sua forma matemática mais aproximada, uma elipse, sendo assim, o primeiro passo para calcular as medidas do planeta é a definição de uma elipsoide de referência.

Devido a deformidade do planeta, a forma eliptica se encaixa melhor em variadas regiões, conforme alteramos os parâmetros de tamanho e posição deste em relação ao eixo da Terra. A estes parâmetros que definimos para o elipse chamamos de Datum.

Com base no Datum, podemos determinar em radianos o posicionamento de algo no globo terrestre, ou até mesmo em métros.
Porém quando precisamos representar esta informação em um mapa, em outras palavras, precisamos transformar uma bola em uma folha de papel, é necessário projetar do dado geográfico, projeção é um modelo matemático com base no datum e sistemas de coordenadas, que tranforma as coordenadas geográficas em um plano cartesiano.

A projeção tem diversos tipos:

Cilindricas (Normal, Transversa, Obliqua), Planas (Polar, Equatorial, Obliqua), além de outros tipos como Gnomonica, Estereográfica e etc.

Cada uma delas é ideal para determinadas regiões ou cenários de uso.

O que é um Sistema de Informação Geográfica (SIG)?

É um sistema computacional que utiliza dados de localização geográfica como: coordenadas ou endereços, em conjunto com algoritmos que consumam estes dados para contruir informações.

Não necessariamente um sistema GIS precisa exibir um mapa, ele pode por exemplo informar o tempo estimado para uma entrega ser concluída ou enviar um SMS indicando que seu bairro passará por uma instabilidade elétrica.

Checklist

Nesta seção apresentamos um checklist de como iniciar a definição de seu SIG. São perguntas importantes, que devem ser respondidas antes de sua construção. É uma etapa crucial, para que o SIG, atenda as necessidades da sua organização.

Qual é o sistema de referência de seu dado geográfico?

Por mais que para os desenvolvedores de sistema, este seja uma assunto muito complexo, é extremamente importante ter o conhecimento sobre alguns detalhes do dado geográfico utilizado.

A parte mais importante à se pensar ao criar um sistema de informação geográfica é qual sistema de referência vamos utilizar. Mas como escolher?

Respondendo as questões:

  • Qual abrangência da área de trabalho, cidade, estado, países?
  • Qual principal requisito: precisão de área e comprimento ou precisão de posicionamento?

A resposta destas duas questões é geralmente respondida pela equipe cartográfica de seu cliente ou por geográfos, porém é importante compreender os motivadores destas escolhas.

Qual a forma de obtenção das coordenadas?

Para sistemas que requerem precisão é necessário coletar as informações geográficas com equipamentos avançados, que possuam precisão métrica (ou submetrica) e permitam seu pós processamento, aumentando ainda mais sua precisão.

Para casos em que isso não é necessário, somente as coordenadas gps de um smartphone são suficientes.

Mas tenha em mente que toda iteração (ou interação) com o mapa para criar dados geográficos à mão livre é imprecisa, pois o nível de zoom e a referência pixels para coordenada geográfica prejudicam a precisão.

Qual é a informação que será produzida com este dado geográfico?

É muito importante pensar nisso quando vai contruir um sistema, pois ter uma mapa em sua aplicação a enriquece bastante, mas se não há uma utilidade funcional isso pode acabar tornando-se um grande problema.

Então é crucial pensar no resultado final, ou na informação que queremos produzir e mostrar aos nossos usuários.

Demo

A demonstração vai exibir código que permite importar dados de um arquivo shp, em seguida como apresentá-los no mapa e por fim sua consulta.

Shapefile: Formato binário de arquivos espaciais da ESRI, que se tornou bastante popular.
PostGIS: Banco de dados geográfico.
GEOS: Biblioteca de Operações Espaciais e Conversões;
TileStache: Servidor GIS de Vector Tiles;
Django TileStache: APP Django que cria um endpoint tilestache para suas entidades geográficas.
Django Rest Framework: Permite a criação de endpoints rest para seus django models.
Django Rest Framework GIS: Permite a serialização de Atributos geométricos e operações espaciais através do DRF endpoint;

Referências:

UFABC Flavia Feitosa: https://flaviafeitosa.files.wordpress.com/2015/06/02a_sistreferencia-compressed.pdf
Geodésia: https://pt.wikipedia.org/wiki/Geod%C3%A9sia
Curso de PostGIS Sigma: https://github.com/sigma-geosistemas/sigma.universidade.postgis/wiki/aula02
imagem qgis: https://flic.kr/p/UGGiGu

Cartogram Mapbox

Na semana passada (ou retrasada) o Mapbox lançou um novo aplicativo interessante: o Cartogram. Ele a princípio, mais parece um brinquedo do que uma ferramenta na realidade e seu propósito é bem simples:

O usuário (você), faz o upload de uma imagem no aplicativo Cartogram e o mesmo calcula e monta um mapa usando as cores das imagens, automaticamente.

Além disso, você pode escolher alguns pontos na imagem original, para selecionar como input para as cores do mapa.

Veja alguns exemplos que gerei:

Meu cachorro

Este exemplo foi gerado com um imagem feita pelo Prisma do meu cachorro.

POTD Nasa

O segundo exemplo foi gerado com a “Imagem do Dia” da NASA (disponível aqui).

Apesar de ser um aplicativo simples, é bastante útil, principamente se você já usa o Mapbox. Quando você está logado, ele permite que você salve o estilo diretamnte na sua biblioteca de estilos na conta principal, podendo ser utilizado em outros mapas.