Team up Django and Web mapping - DjangoCon Europe 2014

Team up Django and Web mapping - DjangoCon Europe 2014

● Web mapping should be simple
● Google Maps should become unusual
● Demystify cartography !

A746319cbfd0236a4d0548e7d1fc1983?s=128

Makina Corpus

May 20, 2014
Tweet

Transcript

  1. Team up Django and Web mapping DjangoCon Europe 2014 Mathieu

    Leplatre @leplatrem www.makina-corpus.com
  2. Main goals... • Web mapping should be simple • Google

    Maps should become unusual • Demystify cartography !
  3. Main focus... • Fundamentals of cartography (projections, PostGIS) • Web

    mapping (GeoJSON, Leaflet) • Django toolbox (a.k.a. GeoDjango)
  4. Fundamentals of cartography

  5. Coordinates : position on Earth • Longitude (x) – Latitude

    (y) • Decimal degrees (-180 +180, -90 +90) → → • GPS
  6. Geodesy : shape of the Earth Ellipsoid (GPS, WGS 84)

    Illustration: http://mapschool.io
  7. Projections • Equations (lat/lng pixels) ↔ • Representation on a

    plane ( compromises) → • Spatial reference transformation Illustration: http://mapschool.io
  8. Spatial References • Coordinate system (cartesian) • Units (degrees, meters)

    • Main axis (equator, Greenwich) • Ellipsoid, geoid (WGS 84) • Conical, cylindrical, conformal, ... • … Store WGS 84 → (GPS, srid=4326) Display →Mercator (Google Maps, srid=3857)
  9. Vector data • Point (x, y, z) • Line (ordered

    list of points) • Polygon (enveloppe + holes) Illustration: http://mapschool.io
  10. Raster data • ~ Images • Map backgrounds (satellite, plan,

    …) • Atimetry data (DEM) Illustration: http://mapschool.io
  11. A PostGIS database • Column types (Point, LineString, Polygon, …Raster...)

    • Geographic functions (distance, area, extents ...) • Spatial Indexes (rectangles trees...) $ sudo apt-get install postgis $ psql -d mydatabase > CREATE EXTENSION postgis;
  12. Examples (1/2) CREATE TABLE island ( label VARCHAR(128), code INTEGER,

    geom geometry(Polygon, 4326) )
  13. Examples (1/2) CREATE TABLE island ( label VARCHAR(128), code INTEGER,

    geom geometry(Polygon, 4326) ) Usual table Usual columns Vector geometry column Geometry type Spatial Reference
  14. Examples (2/2) SELECT room.id FROM room, island WHERE ST_Intersects(room.geom, island.geom)

    Spatial join INSERT INTO room (geom) VALUES ( 'SRID=4326;POINT(3.12, 43.1)'::geometry ) EWKT format PostgreSQL cast
  15. Web mapping

  16. Web map anatomy... • JavaScript + DOM • Initialization of

    a <div> • « Layers »
  17. Web map anatomy... • JavaScript + DOM • Initialization of

    a <div> • « Layers » • <img> (Backgrounds) • Vector SVG → • Lat/Long pixels → (CSS) • DOM Events (interactions)
  18. Leaflet example <script src="leaflet.js"></script> <link rel="stylesheet" href="leaflet.css" /> <div id="simplemap"></div>

    <script> var map = L.map('simplemap') .fitWorld(); L.tileLayer('http://tile.osm.org/{z}/{x}/{y}.png') .addTo(map); L.marker([43.07, -5.78]) .addTo(map); </script> http://leafletjs.com
  19. None
  20. See also... D3 • SVG • Cool dataviz • Exotic

    map projections OpenLayers 3 • Canvas • GIS-oriented (advanced use-cases)
  21. Formats (1/2) • Raster images (PNG ou JPG) • z/x/y.png

    • Projection 3857 (Mercator, Google Maps) →Cold data (tile provider) … → or warm (rendering engine)
  22. Formats (2/2) • GeoJSON for vector data • Projection 4326

    (GPS, WGS84) • Interactive ? • Volume ? • Frequency ? →Dynamic (from database) SELECT ST_AsGeoJSON(geom) FROM ...
  23. Nothing new... Web Server Browser PostGIS Django Rendering Engine Vector

    overlay Raster overlay Raster background Images z/x/y.png GeoJSON z/x/y.png, UTFGrid, ...
  24. GeoDjango

  25. Django Ecosystem for Cartography from django.contrib.gis import ... • Models

    fields (syncdb) • GeoQuerySet (spatial queries) • Form fields (Django 1.6) • System libraries deps (GEOS, GDAL) • Widgets & AdminSite (OpenLayers 2)
  26. Examples (1/2) from django.contrib.gis.db import ( models as gismodels )

    class Island(gismodels.Model): label = models.CharField(max_length=128), code = models.IntegerField(), geom = gismodels.PolygonField(srid=4326) objects = gismodels.GeoManager()
  27. Examples (2/2) from django.contrib.gis.geos import Polygon embiez = Island(label='Embiez', geom=Polygon(((0.34,

    0.44), (0.36, 0.42), …))) ~ from django.contrib.gis.geos import fromstr myroom = fromstr('SRID=4326;POINT(3.12, 43.1)') Island.objects.filter(geom__intersects=myroom)
  28. • Views (Class-based) • Generalization & approximation (less details and

    decimals) • Serialization (dumpdata, loaddata) • Model fields (text, no GIS !) • Vector tiles (huge datasets) django-geojson from djgeojson.views import GeoJSONLayerView urlpatterns = patterns('', url(r'^buildings.geojson$', GeoJSONLayerView.as_view(model=Building)) )
  29. django-leaflet • Quick-start kit {% leafletmap "djangocon" %} • Assets

    (collecstatic) • Easy plugins integration • Global configuration (settings.py, plugins, ...) • Leaflet projections machinery (reprojection)
  30. django-leaflet (view) {% load leaflet_tags %} ... {% leaflet_js %}

    {% leaflet_css %} </head> <body> {% leafletmap "buildingmaps" callback="initMap" %} <script type="text/javascript"> function initMap(map) { // Ajax Load $.getJSON("{% url app:layer %}", function (data) { // Add GeoJSON to the map L.geoJSON(data).addTo(map); }); } GeoJSON view
  31. LAYER

  32. django-leaflet (edit) Forms • Fields (Django 1.6+ API) • Widgets

    (hidden <textarea> + Leaflet.draw) class BuildingForm(forms.ModelForm): class Meta: model = Building widgets = {'geom': LeafletWidget()} fields = ('code', 'geom') • Leaflet AdminSite admin.site.register(Building, LeafletGeoAdmin)
  33. SCREENSHOT FORM

  34. Conclusion

  35. Anyone can do Web mapping... Cartography is simple. • Just

    some special data types • Follows Django conventions • Few lines of code Illustration: Chef Gusteau, Pixar Inc.
  36. … with appropriate tools and strategies ! Cartography is hard.

    • Performance (Web) • Volume (precision) • Data refresh rate (caching) • User stories too far from data (modeling) Illustration: Anton Ego, Pixar Inc.
  37. Makina Corpus - Free Software | Cartography | Mobile Questions

    ? ...and answers ! PostGIS - Leaflet – JavaScript http://makina-corpus.com