Material da palestra – Criando mapas com soluções livres

Transcrição

Material da palestra – Criando mapas com soluções livres
GeoDjango
Christiano Anderson
Twitter: @dump
[email protected]
Sobre o palestrante
•
•
•
•
•
Sócio fundador da Propus Science;
Trabalha com software livre desde 1995;
Trabalha com Python desde 2000;
Membro da Associação Python Brasil;
Já foi colaborador de diversos projetos de
software livre;
Twitter: @dump
Blog: http://christiano.me
Agenda
•
•
•
•
•
•
•
•
•
Georreferenciamento;
Padrões GIS;
Bases Geográficas;
Tecnologias;
GeoDjango;
Admin;
OpenStreetMap;
MapBox;
OpenLayers;
Geographic Information
System (GIS)
•
Padrões, dados geográficos, sistemas
de coordenadas geográficas;
•
Os mapas são planos, mas a Terra
não é;
Projeções
•
Representação plana da Terra;
Projeções
Os padrões GEO
1. OGC (Open Geospatial Consortium);
2. WKT (Well Known Text);
3. WKB (Well Know Binary);
4. GML (Geometry Markup Language);
5. KML (Keyhole Markup Language);
6. WMS (Web Mapping Service);
7. GeoJSON (Geometry JSON);
8. SRID (Spatial Reference Indentifier);
Principais objetos geográficos
1. Point (ponto);
2. LineString (linha);
3. Polygon (Polígono);
4. MultiPoint (Múltiplos Pontos);
5. MultiPolygon (Múltiplos Polígonos);
Bibliotecas e ferramentas
1. GEOS (Geometry Engine Open
Source);
2. GDAL (Geospatial Data Abstraction
Library);
3. GeoIP (Biblioteca de localização de
IPs);
4. PROJ4 (Biblioteca de Projeções
Geográficas);
Projetos
•
•
•
•
•
•
OpenStreetMap;
OpenLayers;
MapBox;
PostGIS;
Google Maps;
GeoDjango;
GeoDjango
•
•
•
•
Módulo nativo do Django para criar
aplicações geográficas;
Já está presente na seção de contrib
do Django, não é necessário instalar
nada de fora;
Oferece toda facilidade do ORM do
Django para aplicações geográficas;
Bastante completo e bem integrado
com bancos geográficos;
Banco de Dados Geográfico
•
•
•
Permite armazenar objetos
geográficos em uma estrutura de
banco de dados convencional;
Possui funções geográficas, exemplo,
com um select, é possível pegar todo
o trajeto de um rio e identificar quais
municípios ele cruza;
O GeoDjango integrou funções
geográficas ao seu ORM;
Comparativo bases geográficas
Fonte: https://docs.djangoproject.com/en/1.5/ref/contrib/gis/db-api/
Instalação do PostGIS
A maioria das distribuições já possuem
o pacote pronto do PostGIS;
Portanto, se deseja a versão 2, é
necessário compilar na mão ou usar
repositório alternativo;
Configuração
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'culturaeduca',
'USER': 'anderson',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
models.py
from django.contrib.gis.db import models
from django.contrib.gis import admin
models.py
class Municipio(models.Model):
'''Municipios segundo o IBGE'''
cd_geocodm = models.IntegerField('Codigo IBGE', unique=True,
primary_key=True)
nome = models.CharField('Municipio', max_length=60)
estado = models.ForeignKey(Uf, null=True, blank=True)
area = models.MultiPolygonField()
objects = models.GeoManager()
Exemplo no Admin do Django
ESRI Shapefiles
•
Formato de arquivos para
informações geográficas e vetoriais;
•
Descreve geometrias, pontos e
polígonos de áreas geográficas;
Arquivos Shape
•
•
•
shp -> shape, armazena a forma
geográfica do objeto;
shx -> índices e informações de
busca sobre o shape;
dbf -> colunas e atributos existentes
no shape;
Analisando Shapes
$ ogrinfo -so 43MUE250GC_SIR.shp 43MUE250GC_SIR
INFO: Open of `43MUE250GC_SIR.shp'
using driver `ESRI Shapefile' successful.
Layer name: 43MUE250GC_SIR
Geometry: Polygon
Feature Count: 498
Extent: (-57.643885, -33.752081) - (-49.691352, -27.082302)
Layer SRS WKT:
GEOGCS["SIRGAS 2000",
DATUM["SIRGAS2000",
SPHEROID["Geodetic_Reference_System_of_1980",6378137,298.2572221009113]],
PRIMEM["Greenwich",0],
UNIT["Degree",0.017453292519943295]]
ID: Real (11.0)
CD_GEOCODM: String (20.0)
NM_MUNICIP: String (60.0)
Importando Shape com GeoDjango
import os
from django.contrib.gis.utils import LayerMapping
from models import Municipio
mun_mapping = {
'codigo_ibge': 'ID',
'cd_geocodm' : 'CD_GEOCODM',
'nome' : 'NM_MUNICIP',
'area' : 'MULTIPOLYGON',
}
mun_shp = os.path.abspath(os.path.join(os.path.dirname(__file__),
'43MUE250GC_SIR.shx'))
def run(verbose=True):
lm = LayerMapping(Municipio, mun_shp, mun_mapping,
transform=False, encoding='iso-8859-1')
lm.save(strict=True, verbose=verbose)
Consultando pontos no banco
Em qual Município está localizado o
ponto abaixo?
Latitude: -23.5006659999999989
Longitude: -46.6165799999999990
Consulta de ponto no banco
>>> from django.contrib.gis.geos import Point
>>> from ibge.models import Municipio
>>> ponto = Point(-46.6165799999999990,
-23.5006659999999989)
>>> res = Municipio.objects.get(area__bbcontains=ponto)
>>> print res.nome
SÃO PAULO
Objeto geográfico do registro
>>> res.area
<MultiPolygon object at 0x10e40f0a0>
Representa o contorno (polígono) do município.
É possível exportar o contorno em GeoJSON:
>> res.area.geojson
u'{ "type": "MultiPolygon", "coordinates": [ [ [ [ -46.575473, -23.374018 ], [
-46.57540883044129, -23.374040620923594 ], [ -46.575195, -23.374116 ], [ -46.574706,
-23.374336 ], [ -46.574044, -23.37499 ], [ -46.57361, -23.375254 ], [
-46.573461199200892, -23.375336342015196 ], [ -46.573254, -23.375451 ], [ -46.572757,
-23.375579 ], [ -46.572661701429197, -23.375598923531598 ], [ -46.572073,
-23.375722 ], [ -46.571326, -23.375845 ], [ -46.570697, -23.376002 ], [
-46.570435846461493, -23.376064365024099 ], [ -46.570161, -23.37613 ], [ -46.56981,
-23.376126 ], [ -46.569405, -23.376094 ], [ -46.568904, -23.375948 ], [ -46.56852,
-23.375736 ], [ -46.568299, -23.375479 ], [ -46.568058, -23.374863 ], [ -46.567912,
-23.374383 ], [ -46.567691, -23.374097 ], [ -46.567234, -23.373735 ] (continua)...
API de Mapa
•
•
•
O GeoDjango não faz plotagem
automática no mapa;
Por respeitar todos os padrões Geo,
você escolhe a API de mapa que
desejar.
É possível plotar pontos no Google
Maps, OpenStreetMap, MapBox,
Bing Maps e qualquer outro que
possuir API padrão Geo;
OpenStreetMap
•
•
•
•
•
•
Ótima alternativa ao Google Maps;
Funciona como um "wiki" de mapas;
Totalmente colaborativo;
API bastante completa;
Possibilidade de subir seu próprio
servidor de mapas;
http://www.openstreetmap.org/
MapBox
•
•
•
•
•
•
Alternativa "freemium" ao Google
Maps;
Utiliza estrutura do OpenStreetMap;
Possibilidade de estilizar os mapas;
Várias ferramentas, como o TileMill,
permite uma melhor customização da
aplicação de mapa;
mapbox.js é uma API web bem
simples e eficiente;
http://www.mapbox.com/
Leaflet
•
•
•
•
Biblioteca JavaScript para criar
mapas mobile-friendly;
Baseado no OpenStreetMap e
MapBox;
Permite uma melhor interatividade
de mapas com dispositiveis móveis;
http://leafletjs.com/
OpenLayers
•
•
•
•
API JavaScript para criação de
mapas dinâmicos e multi camadas;
Permite escolher qual backend de
mapas será utilizado (Google Maps,
OpenStreetMap, Bing Maps, entre
outros);
Possui uma comunidade bastante
atuante;
http://openlayers.org/
OBRIGADO!
Twitter: @dump
Blog: http://christiano.me
E-mail: [email protected]

Documentos relacionados

exemplo - Elton Minetto

exemplo - Elton Minetto Criando um sistema de votação Para apresentar mais características do Django, vamos incrementar a aplicação adicionando um sistema de votações, para eleger o melhor livro cadastrado. Para isto irem...

Leia mais

Django - Elton Minetto

Django - Elton Minetto Antes que você se desespere, leia a documentação model_api. Deu para perceber que cada modelo é uma classe em Python, o método __str__ foi definido para que o nome do objeto seja retornado. A class...

Leia mais