GeoEtiquetas (2das Jornadas Latinoamérica y Caribe gvSIG)
Web Mapping con Django
1. El autor del presente documento lo ha publicado
bajo las condiciones que especifica la licencia
Creative Commons
Attribution-NonCommercial-ShareAlike 3.0
http://creativecommons.org/licenses/by-nc-sa/3.0/
En caso de dudas escriba a:
info@atmantree.com
2. Web Mapping con Django
Ing. Carlos Gustavo Ruiz
http://atmantree.com
Noviembre, 2012
CC BY-NC-SA 3.0
3. Temas
● ¿Qué es Geomática? ● GeoAdmin
● ¿Qué es Web ● Plantilla
Mapping? ● Vista
● Paso a paso ● OpenLayers
● Instalación
● Nuestro Portal
● Base de Datos
● Lo que sigue
● Proyecto Django ● A modo de Conclusión
● Modelo (Geo)
5. ¿Qué es Geomática?
Palabras clave:
● Conjunto de ciencias
● Integración
● Medios para la captura
● Tratamiento
● Análisis
● Interpretación
● Difusión
● Almacenamiento
● Información Geográfica.
6. ¿Qué es Geomática Libre?
Entendemos que la Geomática Libre es en cierto
modo un superconjunto del Software Libre pues
integra las 4 libertades de Uso, Introspección,
Mejora y Copias a aspectos como:
● Software
● Datos
● Estándares
7. ¿Qué es Web Mapping?
Es el proceso de diseñar, implementar, generar y despachar
mapas en la World Wide Web y sus productos.
Pueden ser:
● Analíticos (generalmente producto de un GIS)
● Animados (para mostrar eventos como cursos de agua,
comunicaciones, flujos, estudios sociales)
● Colaborativos (OSM, Google, Wikimapia)
● Dinámicos (creados a demanda del usuario)
● Atlas en línea
● Mapas en Tiempo Real (mapas de clima, tráfico, tracking)
● Mapas estáticos (generalmente imágenes y fotos)
http://en.wikipedia.org/wiki/Web_mapping
14. Paso a Paso
● Instalación
● Base de Datos
● Proyecto Django
● Modelo (Geo)
● GeoAdmin
● Plantillas
● Vista
● OpenLayers
● Portal
15. Paso a Paso
● Instalación
● En Debian y derivados
$ su
# aptitude install postgresql postgresql-client postgresql-server-dev-all
# aptitude install postgresql-8.4-postgis postgis
# aptitude install python-virtualenv virtualenvwrapper
# exit
$ mkdirvirtualenv gdj
......
(gdj) $ pip install Django psycopg2
....
(gdj) $
● No cierre esta consola
16. Paso a Paso
● Base de Datos
● pg_hba.conf (en /etc/postgresql/8.4/main/)
(solo para efectos del taller)
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 md5
● (Luego reiniciar PostgreSQL)
17. Paso a Paso
● Base de Datos
● Crear la base de datos e instalar esquema
PostGIS
$ su -
# su posrgres
# createdb -E utf-8 geodb
# createlang plpgsql geodb
# psql -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql geodb
# psql -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql geodb
# exit
# exit
$
18. Paso a Paso
● Proyecto Django
● En la consola inicial
(gdj) $ django-admin.py startproject web_mapping
(gdj) $ cd web_mapping/
(gdj) $ ls
manage.py web_mapping
(gdj) $ nano web_mapping/settings.py # ver siguiente lámina
19. Paso a Paso
● Proyecto Django
● En la consola inicial
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'geodb',
'USER': 'postgres', #sólo a efectos del taller
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.gis',
'app1',
)
20. Paso a Paso
● Proyecto Django
● En la consola inicial
(gdj) $ django-admin.py startproject web_mapping
(gdj) $ cd web_mapping/
(gdj) $ ls
manage.py web_mapping
(gdj) $ nano web_mapping/settings.py # ver siguiente lámina
(gdj) $ python manage.py startapp app1
(gdj) $ cd app1/
__init__.py models.py tests.py views.py
(gdj) $ nano models.py #ver siguiente lámina
.....
21. Paso a Paso
● Modelo (Geo)
from django.contrib.gis.db import models
# Este es un layer en su mapa para guardar los Puntos De Interes de su
# Aplicacion.
class PuntosDeInteres(models.Model):
nombre = models.CharField(max_length=50)
descripcion = models.TextField(blank=True, null=True)
# Aqui es donde GeoDjango hace su magia negra
pto = models.PointField()
objects = models.GeoManager()
def __unicode__(self):
return self.nombre
class Meta():
verbose_name = "Punto de Interes"
verbose_name_plural = "Puntos de Interes"
23. Paso a Paso
● Modelo (Geo)
You just installed Django's auth system, which means you don't have any
superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'atmantree'): admin
E-mail address: admin@adm.in
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
(gdj) $
24. Paso a Paso
● Modelo (Geo)
(gdj) $ python manage.py sql app1
BEGIN;
CREATE TABLE "app1_puntosdeinteres" (
"id" serial NOT NULL PRIMARY KEY,
"nombre" varchar(50) NOT NULL,
"descripcion" text
)
;
COMMIT;
(gdj) $ python manage.py dbshell
psql (8.4.13)
conexión SSL (cifrado: DHE-RSA-AES256-SHA, bits: 256)
Digite «help» para obtener ayuda.
geodb=# d app1_puntosdeinteres
25. Paso a Paso
● Modelo (Geo)
Tabla «public.app1_puntosdeinteres»
Columna | Tipo | Modificadores
-------------+-----------------------+-----------------------------------------------------------------------------
id | integer | not null valor por omisión nextval('app1_puntosdeinteres_id_seq'::regclass)
nombre | character varying(50) | not null
descripcion | text |
pto | geometry | not null
Índices:
"app1_puntosdeinteres_pkey" PRIMARY KEY, btree (id)
"app1_puntosdeinteres_pto_id" gist (pto)
Restricciones CHECK:
"enforce_dims_pto" CHECK (st_ndims(pto) = 2)
"enforce_geotype_pto" CHECK (geometrytype(pto) = 'POINT'::text OR pto IS NULL)
"enforce_srid_pto" CHECK (st_srid(pto) = 4326)
geodb=#
26. Paso a Paso
● Modelo (Geo)
geodb=# q
(gdj) $
● y con esto ya tenemos nuestro modelo geográfico
instalado en PostgreSQL. GeoDjango funciona con
otros backends de base de datos, sin embargo
PostGIS (PostgreSQL) es quien tiene mayor
cantidad de funcionalidades implemementadas.
27. Paso a Paso
● GeoAdmin
(gdj) $ nano app1/admin.py
....
from django.contrib.gis import admin
from models import PuntosDeInteres
admin.site.register(PuntosDeInteres, admin.OSMGeoAdmin)
....
(gdj) $ nano web_mapping/urls.py
....
from django.conf.urls import patterns, url, include
from django.contrib.gis import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
)
....
(gdj) $ python manage.py runserver
39. Paso a Paso
● OpenLayers
● KISS: Keep It Simple S...
● La mejor manera de aprender OpenLayers es
comparando los ejemplos con lo que queremos
hacer.
● Entre a la página http://www.openlayers.org/ y
revise los ejemplos para OpenStreetMap (OSM) y
KML
● En la carpeta de las plantillas escriba un archivo
llamado inicio.html
40. Paso a Paso
● OpenLayers
<html>
<head> <title>Web Mapping con Django</title>
<link rel="stylesheet"
href="http://openlayers.org/dev/theme/default/style.cs"
type="text/css">
<script src="http://openlayers.org/dev/OpenLayers.js"></script>
<script type="text/javascript">
/* aquí va el script de OpenLayers */
</script>
<style>
.map {border: 1px solid #ccc; width: 800px; height: 400px; }
</style>
</head>
<body onload="init()">
<h1>Web Mapping con Django</h1>
<hr />
<div id="map" class="map"></div>
</body>
</html>
41. Paso a Paso
● OpenLayers
var map, layer, kml;
function init(){
map = new OpenLayers.Map( 'map');
layer = new OpenLayers.Layer.OSM("OSM");
map.addLayer(layer);
kml = new OpenLayers.Layer.Vector("KML", {
strategies: [new OpenLayers.Strategy.Fixed()],
protocol: new OpenLayers.Protocol.HTTP({
url: "kml/",
format: new OpenLayers.Format.KML({
extractStyles: true, extractAttributes: true, maxDepth: 2 })
}) })
map.addLayer(kml);
map.setCenter(
new OpenLayers.LonLat(-66.83, 10.45).transform(
new OpenLayers.Projection("EPSG:4326"),
map.getProjectionObject()), 8);
}
42. Paso a Paso
● Portal
(gdj) $ nano web_mapping/urls.py
....
from django.conf.urls import patterns, include, url
from django.views.generic.simple import direct_to_template
from app1.views import kml
from django.contrib.gis import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^kml/$', kml),
url(r'^$', direct_to_template, {'template':'inicio.html'}),
)
....
(gdj) $
44. Lo que sigue
● Agregar Controles al ● Mejorar el diseño de
mapa la página
● Hacer un Popup que ● Crear un método de
muestre los datos del captura sin el
punto de interés GeoAdmin
● Agregar cambiar el ● Etc, etc, etc..
símbolo del punto de
interés
45. A modo de Conclusión
● Hacer Web Mapping con Django es directo, sin
embargo hay muchos temas intermedios que
deberá comenzar a manejar, como:
● Bases de datos espaciales
● Librería OpenLayers o Equivalente
● Fuentes de Datos (servicios WMS, WFS, Google
Maps, etc)
● Proyecciones de mapas
● Análisis Espacial
46. A modo de Conclusión
● Ya tiene unos primeros pasos adelantados,
ahora aplique lo aquí visto en su caso de
estudio.
● Además de los ejemplos de OpenLayers puede
usar el proyecto Geoportal como una referencia
o una plantilla para su proyecto particular
● https://bitbucket.org/atmantree/geoportal/
● Prefiera fuentes y estándares libres.
● Disfrute mapeando la red.
47. Gracias por su tiempo..
Licencia del documento: CC BY-NC-SA 3.0
http://creativecommons.org/licenses/by-nc-sa/3.0/