Introduccion a GeoDjango
Por: Leonardo Orozco
Que es GeoDjango?
Gis
Un sistema de información geográfica (también conocido con los acrónimos SIG en español o GIS en inglés) es un conjunto de herramientas que integra y relaciona diversos componentes (usuarios, hardware, software, procesos) que permiten la organización, almacenamiento, manipulación, análisis y modelización de grandes cantidades de datos procedentes del mundo real que están vinculados a una referencia espacial.
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.
Que Necesito para Empezar a Usarlo
- PostgreSQL
- MYSQL
- Oracle
- SQLite
PostgreSQL
- Python # preferible 3.5 o mayor
- Django # Framework
- GeoDjango # esta incluido en Django
- psycopg2 # conector a db
- Postgis # extencion de postgres para soportar objectos geograficos
- GEOS # dependencia de GeoDjango
- DAL # dependencia de GeoDjango
- PROJ.4 # dependencia de GeoDjango
Docker y Docker-compose
Configuracion
- Agregar 'django.contrib.gis' a INSTALLED_APPS
- Reemplazar el Engine en DATABASES por 'django.contrib.gis.db.backends.postgis'
GeoDjango Models
GeoDjango Model API
#from django.db import models
from django.contrib.gis.db import models
# Create your models here.
class Post(models.Model):
name = models.CharField(max_length=50)
point = models.PointField(srid=4326)
class Meta:
verbose_name = "data"
verbose_name_plural = "datas"
class Post2(models.Model):
name = models.CharField(max_length=50)
point = models.LineStringField(srid=4326)
class Meta:
verbose_name = "data2"
verbose_name_plural = "datas2"
GeoDjango Model API
- GeometryField
- PointField
- LineStringField
- PolygonField
- MultiPointField
- MultiLineStringField
- MultiPolygonField
- GeometryCollectionField
- RasterField # solo existe en postgis
GeoDjango Forms API
#forms.py
from django.contrib.gis import forms
class GeoForm(forms.Form):
name = forms.CharField()
point = forms.PointField(widget=forms.OSMWidget(attrs={'map_width': 800,
'map_height': 500}))
# html
<!DOCTYPE html>
<html>
<head>
<title>Forma</title>
{{ form.media }}
</head>
<body>
<form method="post">
{% csrf_token %}
{{form.as_p}}
<p>
<button type="submit">Guardar</button>
</p>
</form>
</body>
</html>
GeoDjango Forms API
- GeometryField
- PointField
- LineStringField
- PolygonField
- MultiPointField
- MultiLineStringField
- MultiPolygonField
- GeometryCollectionField
- RasterField # solo existe en postgis
Query Con GeoDjango
from django.contrib.gis.measure import D
from geo.models import Post
# comparando si un objecto esta a una distancia
Post.objects.filter(point__distance_lte=('Point(1 1)', D(m=5)))
Post.objects.annotate(distance=Distance('point', 'Point(1 1)'))
#distancia entre objectos
from django.contrib.gis.db.models.functions import Distance
Post.objects.annotate(distance=Distance("point", p.point)).values("distance")
#una geometria esta contenida en otra
Post.objects.filter(point__contained= p.point)
Reclutando
email: leonardoorozcop@gmail.com
Github: leonardoo
Twitter: @leon4rdoo_o
Alternativas
- http://www.geomesa.org/
- https://github.com/tidwall/tile38
GeoDjango
By Leonardo Fabio Orozco Padilla
GeoDjango
- 1,132