taller geodjango - inicio - sección nacional del ecuador ... · ¿por qué necesitas un framework?...

59
Taller GeoDjango

Upload: hanga

Post on 10-Nov-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

Taller GeoDjango

Contenido: 1.- Django 2.- Ejercicios 3.- GeoDjango 4.- Ejercicios

¿Qué es Django? Django es un framework para aplicaciones web gratuito y open source, escrito en Python. Es un WEB framework - un conjunto de componentes que te ayudan a desarrollar sitios web más fácil y rápidamente. Cuando estás construyendo un sitio web, frecuentemente necesitas un conjunto de componentes similares: una manera de manejar la autenticación de usuarios (registrarse, iniciar sesión, cerrar sesión), un panel de administración para tu sitio web, formularios, una forma de subir archivos, etc. Por suerte para ti, hace tiempo varias personas notaron que los desarrolladores web enfrentan problemas similares cuando construyen un sitio nuevo, por eso juntaron cabezas y crearon frameworks (Django es uno de ellos) que te ofrecen componentes listos para usarse. Los frameworks existen para ahorrarte tener que reinventar la rueda y ayudarte a aliviar la carga cuando construyes un sitio.

¿Por qué necesitas un framework?

Para entender para que es Django, necesitamos mirar mas de cerca a los servidores. Lo primero es que el servidor necesita saber que quieres que te sirva una página web. Imagina un buzón (puerto) el cual es monitoreado por cartas entrantes (peticiones). Esto es realizado por un servidor web. El servidor web lee la carta, y envía una respuesta con una página web. Pero cuando quieres enviar algo, tienes que tener algún contenido. Y Django es algo que te ayuda a crear el contenido.

Cosas que debemos saber

•PIP Herramienta para instalar paquetes de

python sudo yum install python-pip

•VirtualEnv

Entorno virtual de python sudo yum install python-virtualenv

Creando el ambiente virtual del proyecto

mkdir miproyecto cd miproyecto virtualenv venv --distribute > Installing Setuptools...........................................done. > Installing Pip.............................................done. source venv/bin/activate pip install django pip freeze > requirements.txt

Nuestra primera pagina en Django

django-admin.py startproject misitio . python manage.py syncdb python manage.py startapp libreria python manage.py runserver

Nombre de los archivos

Estos son los principales nombres convencionales para trabajar con django:

•models.py. •views.py •admin.py

•urls.py •settings.py

EJERCICIOS 1

GeoDjango

Que es GeoDjango? ● API de Django sirve para almacenar datos geográficos y

aplicar matemáticas sobre esos datos. ●  Por "matemáticas" significa: •  . cálculo de distancias entre puntos •  . encontrar el área de un polígono •  . encontrar puntos dentro de un polígono •  . encontrar puntos y polígonos dentro de un radio dado •  . y mucho más …..

¿Por qué no MySQL? Sólo apoyo parcial

Características que faltan: Contiene, Cruces, Disjuntos, Intersectos, Solapamientos, Toques, Dentro

● https://docs.djangoproject.com/en/dev/ref/contrib/gis/db-api/#compatibility-tables

¿Por qué no MySQL? Sólo apoyo parcial Características que faltan: Contiene, Cruces, Disjuntos, Intersectos, Solapamientos, Toques, Dentro

Requirements and Versions

https://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#ge

Install the requirements sudo aptitude install python-virtualenv sudo apt-get install binutils gdal-bin libproj-dev postgresql-9.1-postgis postgresql-9.1-server python-psycopg2 python-setuptools mkdir -p /sites/myproject/proj/ cd /sites/myproject/ virtualenv --no-site-packages . . ./bin/activate pip install django psycopg2 cd proj/; django-admin startproject testa ./manage.py startapp abc # Add abc to INSTALLED_APPS in settings.py # Add django.contrib.gis to INSTALLED_APPS

POSTGIS_SQL_PATH=`pg_config --sharedir`/contrib/postgis-1.5 # Creating the template spatial database. sudo -u postgres createdb -E UTF8 template_postgis sudo -u postgres createlang -d template_postgis plpgsql # Adding PLPGSQL language support. # Allows non-superusers the ability to create from this template sudo -u postgres psql -d postgres -c "UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis';" # Loading the PostGIS SQL routines sudo -u postgres psql -d template_postgis -f $POSTGIS_SQL_PATH/postgis.sql sudo -u postgres psql -d template_postgis -f $POSTGIS_SQL_PATH/spatial_ref_sys.sql # Enabling users to alter spatial tables. sudo -u postgres psql -d template_postgis -c "GRANT ALL ON geometry_columns TO PUBLIC;" sudo -u postgres psql -d template_postgis -c "GRANT ALL ON geography_columns TO PUBLIC;" sudo -u postgres psql -d template_postgis -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;"

Install the requirements

$ models.py from django.contrib.gis.db import models class Location(models.Model): name = models.CharField(max_length=255) point = models.PointField() uuid = ext_fields.UUIDField(auto=True) objects = models.GeoManager() class Neighborhood(models.Model): name = models.CharField(max_length=255) area = models.PolygonField() uuid = ext_fields.UUIDField(auto=True) objects = models.GeoManager()

When declaring geo-spacial models, we do things slightly differently. ¿Cómo es diferente la definición de modelos?

¿Cómo es el Admin diferente?

$ admin.py from django.contrib.gis import admin from . import models class LocationAdmin(admin.GeoModelAdmin): pass admin.site.register(models.Location, LocationAdmin)

It doesn't differ by much.

... it maps points ...

... and regions !

¿Qué tipos de campos de modelo están disponibles?

PointField - stores standard latitude/longitude point on earth. PolygonField - stores basic polygon data. LineStringField - stores points connected by line segments. MultiPointField - stores multiple unconnected points.

MultiLineStringField - Stores zero or more LineStrings. MultiPolygonField - Stores zero or more polygons. GeometryCollectionField - Stores different types of shapes (Poly, points, etc).

"Well-known text" Primitives

http://en.wikipedia.org/wiki/Well-known_tex

"Well-known text" Multipart

http://en.wikipedia.org/wiki/Well-known_text

"Well-known text" Notes ● Points are specified as (longitude latitude) ● There is no comma between longitude and latitude. There

is a comma between multiple points. (long1 lat1, long2 lat2)

● Polygons must end with the same point that they start with. ((10 40, 11 22, 12 13, 10, 40))

● Geometry Collection Example: GEOMETRYCOLLECTION(POINT(4 6), LINESTRING(4 6,7 10))

Distance Objects

>>> d={'m':'20'} >>> D(**d) Distance(m=20.0) Math Can be done on distances >>> D(**m) - D(**m) Distance(m=0.0) >>> D(**m) + D(**m) Distance(m=40.0) Can convert between units >>> D(**{'mi':'5'}).km 8.0467200000000005 >>> D(**{'mi':'5'}).m 8046.7200000000003

django.contrib.gis.measure.D or Distance - Define a distance Supported Units: 'cm', 'mi', 'survey_ft', 'rod', 'british_yd', 'british_chain_sears', 'clarke_ft', 'chain_benoit', 'british_chain_benoit', 'chain', 'gold_coast_ft', 'link_sears', 'fathom', 'british_chain_sears_truncated', 'inch', 'ft', 'indian_yd', 'chain_sears', 'yd', 'nm_uk', 'link', 'sears_yd', 'nm', 'british_ft', 'mm', 'm', 'km', 'um', 'link_benoit', 'german_m', 'clarke_link'

Area Objects >>> a={'sq_mi':'20'} >>> A(**a) Area(sq_mi=20.0) Math Can be done on distances >>> A(sq_mi=3) - A(sq_mi=4) Area(sq_mi=-1.0) >>> A(sq_mi=3) + A(sq_mi=4) Area(sq_mi=7.0) Can convert between units >>> A(**{'sq_mi':'5'}).sq_km 12.949940551680001 >>> A(**{'sq_mi':'5'}).sq_m 12949940.55168

django.contrib.gis.measure.A or Area - Define a distance

Supported Units: 'sq_ft', 'sq_chain_sears', 'sq_german_m', 'sq_m', 'sq_indian_yd', 'sq_yd', 'sq_mm', 'sq_mi', 'sq_link_sears', 'sq_cm', 'sq_british_chain_benoit', 'sq_link_benoit', 'sq_sears_yd', 'sq_british_ft', 'sq_km', 'sq_link', 'sq_chain', 'sq_survey_ft', 'sq_british_yd', 'sq_inch', 'sq_rod', 'sq_british_chain_sears_truncated', 'sq_gold_coast_ft', 'sq_fathom', 'sq_clarke_ft', 'sq_british_chain_sears', 'sq_clarke_link', 'sq_um', 'sq_nm', 'sq_chain_benoit', 'sq_nm_uk'

Point Objects from django.contrib.gis.geos import (Point, fromstr, fromfile, GEOSGeometry, MultiPoint, MultiPolygon, Polygon) longitude = decimal.Decimal("-87.627778") latitude = decimal.Decimal("41.881944") # these are equivalent point = fromstr('POINT(%s %s)' % (longitude, latitude)) point = Point((longitude, latitude)) point = Point((-87.627778, 41.881944))

Geometry Objects # Using WKT from django.contrib.gis.geos import GEOSGeometry poly = GEOSGeometry('POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))') OR # Using a more Pythonic form from django.contrib.gis.geos import Polygon poly = Polygon( ((10, 10), (10, 20), (20, 20), (20, 15), (10, 10))) Available types: Point, LineString , LinearRing, Polygon, MultiPoint, MultiLineString, MultiPolygon, GeometryCollection

Saving Geo Data to using the Django ORM Geo Data can be stored to the Django ORM just like any other data. Simply, assign your Geo object to the model field that you defined and save. from django.contrib.gis.geos import Point point = Point((-87.627778, 41.881944)) poly = Polygon( ((10, 10), (10, 20), (20, 20), (20, 15), (10, 10))) l = Location(name=”a”, point=point) l.save() n = Neighborhood(name=”b”, area=poly) n.save()

Búsquedas Espaciales ● contains, within ● distance_gt, distance_gte, distance_lt,

distance_lte ● intersects ● Etc.

Full List: https://docs.djangoproject.com/en/dev/ref/contrib/gis/db-api/#spatial-lookup-compatibility

Spatial Lookup Examples

from django.contrib.gis.geos import Point

from django.contrib.gis.measure import D

pt = Point((-87.627778, 41.881944))

# All neighborhoods containing point

Neighborhood.objects.filter(area__contains=pt)

# All locations five meters from the point

Location.objects.filter(point__distance_lt=(pt, D(mi=0.5)))

Neighborhood.objects.filter(area__distance_lt=(pt, D(mi=0.5)))

QuerySet Examples: Display Distance from django.contrib.gis.geos import Point

pt = Point((-87.627778, 41.881944))

# All locations five meters from the point

locations = Location.objects.all().distance(pt)

for l in locations:

print l.name, l.distance

for n in Neighborhood.objects.distance(pt):

print n.name, n.distance.km

QuerySet Examples: Sorting by Distance # Locations sorted by distance

from django.contrib.gis.geos import fromstr

from django.contrib.gis.measure import D

from decimal import Decimal

long=-87.627778; lat=41.881944

ref_pnt = fromstr('POINT(%s %s)' % (str(long), str(lat)))

Location.objects.filter(point__distance_lte=(ref_pnt,

D(**{'yd':Decimal("90")})

)).distance(ref_pnt).order_by('distance')

QuerySet Examples: Find Area Center Point

from django.contrib.gis.geos import fromstr long=-87.627778; lat=41.881944

ref_pnt = fromstr('POINT(%s %s)' % (str(long), str(lat))) for n in Neighborhood.objects.centroid():

print n.name, n.centroid

QuerySet Examples: Data Output ns = Neighborhood.objects.kml(): for n in ns: print ns.kml

# Same syntax works for outputting: geohash, geojson, gml, and svg.

QuerySet Examples: Encadenamiento # multiple queryset methods can be chained together and each Neighborhood object will gain multiple new attributes

from django.contrib.gis.geos import Point

qs = Neighborhood.objects.geohash().svg().geohash().\

kml().distance(Point(20,20)).centroid()

print qs[0].geohash, qs[0].svg, qs[0].kml, qs[0].distance, qs[0].centroid # etc..

KML Mapping on Google Maps http://maps.google.com/maps?q=http:%2F%2Fwindytransit.com%2Fkml%2F&hl=en&sll=44.302272,-116.037918&sspn=53.008714,117.421875&vpsrc=0&t=m&z=15

URL Params:

● q = URL-Encoded URL of KML feed

● hl = language

●  t = type

●  sll = lat long

● 1 = zoom level

KML Mapping on Google Maps

More Resources

● Django Docs http://geodjango.org/

● Djangcon 2011 Talk by Zain Memon

http://blip.tv/djangocon/making-interactive-maps-for-the-web-5573888

● Chicago Django GeoDjango Quickstart http://www.chicagodjango.com/blog/geo-django-quickstart/

EJERCICIOS 2