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

  1. Agregar 'django.contrib.gis' a INSTALLED_APPS
  2. 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