Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Aplicaciones geográficas con Django - No solo d...

Aplicaciones geográficas con Django - No solo de Javascript viven los mapas

La 'ubicación' es una de las variables más importantes en cualquier problema, y es una de las más complicadas de manejar.

Django - sin ser un servidor geográfico de primera clase - proporciona una buena plataforma para incorporar el "dónde" en nuestras aplicaciones.

Presentaremos - de forma práctica - las capacidades geográficas de Django (acceso a BB.DD espaciales, consultas geográficas) y sus limitaciones

Alicia Pérez Jiménez

September 23, 2017
Tweet

More Decks by Alicia Pérez Jiménez

Other Decks in Technology

Transcript

  1. “ Django is a high-level Python Web framework that encourages

    rapid development and clean, pragmatic design
  2. ¿Por qué? × Aprovecha la fama de librerías open source

    ampliamente reconocidas × Utiliza SWIG y ctypes para aprovechar la funcionalidad en C de estas librerías × El uso de librerías en C permite un alto grado de compatibilidad multiplataforma
  3. GEOS × Biblioteca en C ++ para realizar operaciones geométricas

    × Es la representación de geometría interna por defecto utilizada por GeoDjango × Licencia de BSD para las rutinas de geometría de GEOS, implementada puramente en Python usando ctypes
  4. GEOS >>> pnt = GEOSGeometry('POINT(5 23)') # WKT >>> pnt

    = GEOSGeometry('010100000000000000000014400000000000003740') # HEX >>> pnt = GEOSGeometry('{ "type": "Point", "coordinates": [ 5.000000, 23.000000 ] }') # GeoJSON × Creando geometrías >>> pnt = Point(5, 23) >>> ring = LinearRing((0, 0), (0, 50), (50, 50), (50, 0), (0, 0)) >>> poly = Polygon(ring) >>> print poly.contains(pnt) True
  5. GEOS >>> pnt = Point(5, 23) >>> [coord for coord

    in pnt] [5.0, 23.0] × Las geometrías son Pythonicas >>> line = LineString((0, 0), (0, 50), (50, 50), (50, 0), (0, 0)) >>> line[-2] (50.0, 0.0)
  6. GDAL × La navaja suiza de los datos GIS ×

    Utiliza la OGR Simple Features Library, especializada en la lectura y escritura de datos en variedad de formatos estándar × Muy potente en la transformación de coordenadas espaciales
  7. GDAL >>> from django.contrib.gis.gdal import DataSource >>> ds = DataSource('/path/to/your/cities.shp')>>>

    ds.layer_count # This file only contains one layer 1 × Carga de ficheros de datos >>> from django.contrib.gis.gdal import GDALRaster >>> rst = GDALRaster('/path/to/your/raster.tif', write=False)>>> rst.width, rst.height # This file has 163 x 174 pixels (163, 174)
  8. GDAL >>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, AUTHORITY["EPSG","4326"]]') >>> srs

    = SpatialReference(wkt) # could also use 'WGS84', or 4326 >>> print(srs['GEOGCS']) WGS 84 >>> print(srs['DATUM']) WGS_1984 >>> print(srs['AUTHORITY']) EPSG >>> ct = CoordTransform(SpatialReference('WGS84'), SpatialReference('NAD83')) >>> for feat in layer: ... geom = feat.geom # getting clone of feature geometry ... geom.transform(ct) # transforming × Sistemas de coordenadas
  9. GeoIP × Biblioteca para trabajar con información geográfica y de

    red basada en direcciones IP × La geolocalización IP es inherentemente imprecisa. Las ubicaciones están a menudo cerca del centro de la población
  10. GeoIP >>> from django.contrib.gis.geoip import GeoIP >>> g = GeoIP()

    >>> g.country('google.com') {'country_code': 'US', 'country_name': 'United States'} >>> g.city('72.14.207.99') {'area_code': 650, 'city': 'Mountain View', 'country_code': 'US', 'country_code3': 'USA', 'country_name': 'United States', 'dma_code': 807, 'latitude': 37.419200897216797, 'longitude': -122.05740356445312, 'postal_code': '94043', 'region': 'CA'}
  11. Modelos from django.contrib.gis.db import models class Lakes(models.Model): name = models.CharField(max_length=100)

    rate = models.IntegerField() geom = models.MultiPolygonField() × models.py
  12. LayerMapping import os from django.contrib.gis.utils import LayerMapping from land.models import

    Lakes lakes_mapping = { 'name' : 'name', 'rate' : 'rate', 'geom' : 'MULTIPOLYGON', } lake_shp = './data/lakes.shp')) def run(verbose=True): lm = LayerMapping(Lakes, lake_shp, lakes_mapping, transform=False, encoding='iso-8859-1') lm.save(strict=True, verbose=verbose)
  13. ogrinspect >>> python manage.py ogrinspect land/data/lakes.shp Lakes --mapping --multi -

    --mapping indica a ogrinspect que genere el diccionario de mapeo para el LayerMapping. - --multi habilita la opción de usar MultiPolygonField en lugar de PolygonField
  14. ogrinspect # This is an auto-generated Django model module created

    by ogrinspect. import os from django.contrib.gis.utils import LayerMapping from land.models import Lakes # Auto-generated `LayerMapping` dictionary for Lakes model lakes_mapping = { 'name' : 'name', 'rate' : 'rate', 'geom' : 'MULTIPOLYGON', }
  15. Administrador de Django from django.contrib.gis import admin from models import

    Lakes admin.site.register(Lakes, admin.GeoModelAdmin) × admin.py