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

Team up Django and Web mapping - DjangoCon Euro...

Team up Django and Web mapping - DjangoCon Europe 2014

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

Avatar for Makina Corpus

Makina Corpus

May 20, 2014
Tweet

More Decks by Makina Corpus

Other Decks in Technology

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. Coordinates : position on Earth • Longitude (x) – Latitude

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

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

    plane ( compromises) → • Spatial reference transformation Illustration: http://mapschool.io
  7. 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)
  8. Vector data • Point (x, y, z) • Line (ordered

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

    …) • Atimetry data (DEM) Illustration: http://mapschool.io
  10. 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;
  11. 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
  12. 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
  13. Web map anatomy... • JavaScript + DOM • Initialization of

    a <div> • « Layers » • <img> (Backgrounds) • Vector SVG → • Lat/Long pixels → (CSS) • DOM Events (interactions)
  14. 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
  15. See also... D3 • SVG • Cool dataviz • Exotic

    map projections OpenLayers 3 • Canvas • GIS-oriented (advanced use-cases)
  16. 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)
  17. Formats (2/2) • GeoJSON for vector data • Projection 4326

    (GPS, WGS84) • Interactive ? • Volume ? • Frequency ? →Dynamic (from database) SELECT ST_AsGeoJSON(geom) FROM ...
  18. 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, ...
  19. 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)
  20. 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()
  21. 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)
  22. • 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)) )
  23. django-leaflet • Quick-start kit {% leafletmap "djangocon" %} • Assets

    (collecstatic) • Easy plugins integration • Global configuration (settings.py, plugins, ...) • Leaflet projections machinery (reprojection)
  24. 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
  25. 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)
  26. 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.
  27. … 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.
  28. Makina Corpus - Free Software | Cartography | Mobile Questions

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