GeoDjango e HTML5Lucio Grenzil.grenzi@gmail.com
Who am I?• Delphi developer for 11 years• Now freelance and Web developer• Javascript addicted    Nonantolando.blogspot.co...
Agenda•   HTML 5 geolocalization: the new parts•   About GeoDjango•   GIS data format troubles•   GeoDjango apis•   GeoDja...
Once upon a time                                Lucio Grenzi   4              l.grenzi@gmail.com – Freelance
HTML 5 and Geolocation• Supported by IE 9,  Firefox, Safari, Chrome• All the smartphone has a  GPS or a Wifi network  card...
HTML 5 Geolocation apis (1/3)Example of requesting a potentially cached position.  // Request a position. We accept positi...
HTML 5 Geolocation apis (2/3)function getLocationUpdate(){    if(navigator.geolocation){        // timeout 60 seconds     ...
HTML 5 Geolocation apis (3/3)interface Position {                       interface Coordinates {  readonly attribute Coordi...
GeoDjangoGeoDjango intends to be a world-class   geographic Web framework.Its goal is to make it as easy   as possible to ...
Install GeoDjango• django.contrib.gis• Spatial database• Geospatial libraries                                             ...
Spatial databaseDatabase     Library            Supported Versions Notes             RequirementsPostgreSQL   GEOS, PROJ.4...
Geospatial librariesProgram      Description              Required                    Supported VersionsGEOS         Geome...
GIS problems• The Earth is not like  a ball!• How to store data  efficiently  – Different vendor    implementation        ...
GIS data formats• Lots of GIS file formats:  – Raster formats: DRG, GeoTIFF, ..  – Vector formats: DXF, GeoJSON, KML, GML ...
ABC GeoDjango                             Lucio Grenzi   15           l.grenzi@gmail.com – Freelance
GeoDjango Model layerA model is the single, definitive source of data   about your data.It contains the essential fields a...
GeoDjango Template layerDjango’s template language is designed to strike  a balance between power and ease.The Django temp...
GeoDjango View layerA view function, or view for short, is simply a  Python function that takes a Web request and  returns...
GeoDjango Model APIField type                        Field optionsclass GeometryField               sridclass PointField  ...
GeoQuerySet API• Measurement: distance,area, length, perimeter• Relationship: centroid, envelop, point_on_surface• Editor:...
GeoQuerySet API• Measurement: distance,area, length, perimeter   GeoQuerySet.distance(geom, **kwargs)                     ...
GeoQuerySet API• Relationship: centroid, envelop, point_on_surface  GeoQuerySet.envelope(**kwargs)                        ...
GeoQuerySet API• Editor: force_rhr, reverse_geom, scale, snap_to_grid,  transform(srid), translate  GeoQuerySet.transform(...
GeoQuerySet API• Opertion: difference, intersection, sym_difference, union GeoQuerySet.intersection(geom)                 ...
GeoQuerySet API• Output: geohash, geojson, gml, kml, svg GeoQuerySet.svg(**kwargs)                                        ...
Google Maps licensehttp://www.google.com/intl/it_it/help/terms_maps.html                                                  ...
OpenstreetMap recent licensing changes  http://blog.openstreetmap.it/2012/04/01/cambio-licenza/                           ...
GeoDjango & Google Maps                                   Lucio Grenzi   28                 l.grenzi@gmail.com – Freelance
GeoDjango & Google Maps: recipe•   Web server•   Python and GeoDjango•   PostgreSQL (postgresql-9.1-postgis)•   libgeos   ...
Step 1 : create db and a new django project• createdb -U postgres -T template_postgis -O geouser  geodatabase• python mana...
Step 2 : Geospatial information• Edit model.py in order to setup the spatial  reference system• Google Maps api use srid =...
Step 3 : HTML page<!DOCTYPE html><head>  <script src="http://maps.google.com/maps?file=api&v=2&key=abcdefg" type="text/jav...
Get Current position<script language="javascript">    var lat=50;    var lon=-110;    function load() {      if (GBrowserI...
Record Locationclass RecordLocation(webapp.RequestHandler): def post(self):   session=SessionManager(self)     if session....
Generate Markerclass GenerateMarkers(webapp.RequestHandler):   def get(self):     session=SessionManager(self)     if sess...
Openlayer<html> <head>  <script src="http://openlayers.org/api/OpenLayers.js"></script>  <script> var points = []; </scrip...
Openlayer js script<script type="text/javascript">  var map, base_layer, kml;  function init(){     map = new OpenLayers.M...
Openlayer django scriptvectors = OpenLayers.Layer.Vector("Simple Geometry");for (var i = 0; i < points.length; i++) {     ...
References• http://www.geodjango.com• http://invisibleroads.com/tutorials/geodjango-googlemaps-build.html• http://code.goo...
Questions?                               Lucio Grenzi   40             l.grenzi@gmail.com – Freelance
Thank youCreative Commons via tcmaker.org                                                     Lucio Grenzi   41           ...
Upcoming SlideShare
Loading in...5
×

Geodjango

2,885

Published on

Published in: Technology
1 Comment
10 Likes
Statistics
Notes
  • Ferroxcube von Phillips – Megatron ist Ihr Partner dazu- http://www.megatron.ch/de/ferroxcube-service
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
2,885
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
1
Likes
10
Embeds 0
No embeds

No notes for slide

Geodjango

  1. 1. GeoDjango e HTML5Lucio Grenzil.grenzi@gmail.com
  2. 2. Who am I?• Delphi developer for 11 years• Now freelance and Web developer• Javascript addicted Nonantolando.blogspot.com https://plus.google.com/108943068354277861330 http://it.linkedin.com/pub/lucio-grenzi/27/2bb/2a Lucio Grenzi 2 l.grenzi@gmail.com – Freelance
  3. 3. Agenda• HTML 5 geolocalization: the new parts• About GeoDjango• GIS data format troubles• GeoDjango apis• GeoDjango and Google Maps / OpenStreetMaps Lucio Grenzi 3 l.grenzi@gmail.com – Freelance
  4. 4. Once upon a time Lucio Grenzi 4 l.grenzi@gmail.com – Freelance
  5. 5. HTML 5 and Geolocation• Supported by IE 9, Firefox, Safari, Chrome• All the smartphone has a GPS or a Wifi network card• Location based services Lucio Grenzi 5 l.grenzi@gmail.com – Freelance
  6. 6. HTML 5 Geolocation apis (1/3)Example of requesting a potentially cached position. // Request a position. We accept positions whose age is not greater than 10 minutes. If the user // agent does not have a fresh enough cached position object, it will automatically // acquire a new one. navigator.geolocation.getCurrentPosition(successCallback, errorCallback, {maximumAge:600000}); function successCallback(position) { // By using the maximumAge option above, the position object is guaranteed to be at most 10 // minutes old. } function errorCallback(error) { // Update a div element with error.message. } Lucio Grenzi 6 l.grenzi@gmail.com – Freelance
  7. 7. HTML 5 Geolocation apis (2/3)function getLocationUpdate(){ if(navigator.geolocation){ // timeout 60 seconds var options = {timeout:60000}; watchID = navigator.geolocation.watchPosition(showLocation, errorHandler, options); }else{ alert("Sorry, browser does not support geolocation!"); }} Lucio Grenzi 7 l.grenzi@gmail.com – Freelance
  8. 8. HTML 5 Geolocation apis (3/3)interface Position { interface Coordinates { readonly attribute Coordinates coords; readonly attribute double latitude; readonly attribute DOMTimeStamp readonly attribute double longitude; timestamp; readonly attribute double altitude; }; readonly attribute double accuracy; readonly attribute double altitudeAccuracy; readonly attribute double heading; readonly attribute double speed; }; Lucio Grenzi 8 l.grenzi@gmail.com – Freelance
  9. 9. GeoDjangoGeoDjango intends to be a world-class geographic Web framework.Its goal is to make it as easy as possible to build GIS Web applications and harness the power of spatially enabled data. Lucio Grenzi 9 l.grenzi@gmail.com – Freelance
  10. 10. Install GeoDjango• django.contrib.gis• Spatial database• Geospatial libraries Lucio Grenzi 10 l.grenzi@gmail.com – Freelance
  11. 11. Spatial databaseDatabase Library Supported Versions Notes RequirementsPostgreSQL GEOS, PROJ.4, 8.1+ Requires PostGIS PostGISMySQL GEOS 5.x limited functionalityOracle GEOS 10.2, 11 XE not supportedSQLite GEOS, GDAL, 3.6.+ Requires SpatiaLite PROJ.4, SpatiaLite 2.3+, pysqlite2 2.5+, and Django 1.1. Lucio Grenzi 11 l.grenzi@gmail.com – Freelance
  12. 12. Geospatial librariesProgram Description Required Supported VersionsGEOS Geometry Engine Yes 3.3, 3.2, 3.1, 3.0 Open SourcePROJ.4 Cartographic Yes (PostgreSQL and 4.7, 4.6, 4.5, 4.4 Projections library SQLite only)GDAL Geospatial Data No (but, required for 1.8, 1.7, 1.6, 1.5, 1.4 Abstraction Library SQLite)GeoIP IP-based geolocation No 1.4 libraryPostGIS Spatial extensions for Yes (PostgreSQL 1.5, 1.4, 1.3 PostgreSQL only)SpatiaLite Spatial extensions for Yes (SQLite only) 3.0, 2.4, 2.3 SQLite Lucio Grenzi 12 l.grenzi@gmail.com – Freelance
  13. 13. GIS problems• The Earth is not like a ball!• How to store data efficiently – Different vendor implementation Lucio Grenzi 13 l.grenzi@gmail.com – Freelance
  14. 14. GIS data formats• Lots of GIS file formats: – Raster formats: DRG, GeoTIFF, .. – Vector formats: DXF, GeoJSON, KML, GML – http://en.wikipedia.org/wiki/GIS_file_formats Lucio Grenzi 14 l.grenzi@gmail.com – Freelance
  15. 15. ABC GeoDjango Lucio Grenzi 15 l.grenzi@gmail.com – Freelance
  16. 16. GeoDjango Model layerA model is the single, definitive source of data about your data.It contains the essential fields and behaviors of the data you’re storing. Generally, each model maps to a single database table. Lucio Grenzi 16 l.grenzi@gmail.com – Freelance
  17. 17. GeoDjango Template layerDjango’s template language is designed to strike a balance between power and ease.The Django template system provides tags which function similarly to some programming constructs – an if tag for boolean tests, a for tag for looping, etc. – but these are not simply executed as the corresponding Python code Lucio Grenzi 17 l.grenzi@gmail.com – Freelance
  18. 18. GeoDjango View layerA view function, or view for short, is simply a Python function that takes a Web request and returns a Web response. This response can be the HTML contents of a Web page, or a redirect, or a 404 error Lucio Grenzi 18 l.grenzi@gmail.com – Freelance
  19. 19. GeoDjango Model APIField type Field optionsclass GeometryField sridclass PointField spatial_indexclass LineStringField dimclass PolygonField geographyclass MultiPointField geography Typeclass MultiLineStringFieldclass MultiPolygonFieldGeometryCollectionFieldclass GeometryCollectionField Lucio Grenzi 19 l.grenzi@gmail.com – Freelance
  20. 20. GeoQuerySet API• Measurement: distance,area, length, perimeter• Relationship: centroid, envelop, point_on_surface• Editor: force_rhr, reverse_geom, scale, snap_to_grid, transform(srid), translate• Opertion: difference, intersection, sym_difference, union• Output: geohash, geojson, gml, kml, svg• Miscellaneous: mem_size, num_geom, num_points Lucio Grenzi 20 l.grenzi@gmail.com – Freelance
  21. 21. GeoQuerySet API• Measurement: distance,area, length, perimeter GeoQuerySet.distance(geom, **kwargs) Lucio Grenzi 21 l.grenzi@gmail.com – Freelance
  22. 22. GeoQuerySet API• Relationship: centroid, envelop, point_on_surface GeoQuerySet.envelope(**kwargs) Lucio Grenzi 22 l.grenzi@gmail.com – Freelance
  23. 23. GeoQuerySet API• Editor: force_rhr, reverse_geom, scale, snap_to_grid, transform(srid), translate GeoQuerySet.transform(srid=4326, **kwargs) Lucio Grenzi 23 l.grenzi@gmail.com – Freelance
  24. 24. GeoQuerySet API• Opertion: difference, intersection, sym_difference, union GeoQuerySet.intersection(geom) Lucio Grenzi 24 l.grenzi@gmail.com – Freelance
  25. 25. GeoQuerySet API• Output: geohash, geojson, gml, kml, svg GeoQuerySet.svg(**kwargs) Lucio Grenzi 25 l.grenzi@gmail.com – Freelance
  26. 26. Google Maps licensehttp://www.google.com/intl/it_it/help/terms_maps.html Lucio Grenzi 26 l.grenzi@gmail.com – Freelance
  27. 27. OpenstreetMap recent licensing changes http://blog.openstreetmap.it/2012/04/01/cambio-licenza/ Lucio Grenzi 27 l.grenzi@gmail.com – Freelance
  28. 28. GeoDjango & Google Maps Lucio Grenzi 28 l.grenzi@gmail.com – Freelance
  29. 29. GeoDjango & Google Maps: recipe• Web server• Python and GeoDjango• PostgreSQL (postgresql-9.1-postgis)• libgeos Lucio Grenzi 29 l.grenzi@gmail.com – Freelance
  30. 30. Step 1 : create db and a new django project• createdb -U postgres -T template_postgis -O geouser geodatabase• python manage.py syncdb• django-admin.py startproject geodjangomaps• Changes affect settings.pyDATABASES = { default: { ENGINE : django.contrib.gis.db.backends.postgis, NAME: geodatabase, USER: geouser, PASSWORD: geopassword, }} Lucio Grenzi 30 l.grenzi@gmail.com – Freelance
  31. 31. Step 2 : Geospatial information• Edit model.py in order to setup the spatial reference system• Google Maps api use srid = 4126name = models.CharField(max_length=32)geometry = models.PointField(srid=4326)objects = models.GeoManager() Lucio Grenzi 31 l.grenzi@gmail.com – Freelance
  32. 32. Step 3 : HTML page<!DOCTYPE html><head> <script src="http://maps.google.com/maps?file=api&v=2&key=abcdefg" type="text/javascript"></ script> </head><body onload="load()" onunload="GUnload()"><span style=" font-family:Verdana; background-color:#95877f; cursor:default;" onclick="get_location();">Find me!</span><div id="map" style="width: 400px; height: 400px"></div></body> Lucio Grenzi 32 l.grenzi@gmail.com – Freelance
  33. 33. Get Current position<script language="javascript"> var lat=50; var lon=-110; function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); map.setCenter(new GLatLng(lat, lon), 13);} } function map(position) { lat = position.coords.latitude; lon = position.coords.longitude; load(); } function get_location() { navigator.geolocation.getCurrentPosition(map);} </script> Lucio Grenzi 33 l.grenzi@gmail.com – Freelance
  34. 34. Record Locationclass RecordLocation(webapp.RequestHandler): def post(self): session=SessionManager(self) if session.is_set(): marker=Markers(lat=self.request.get(lat),lon=self.request.get(lon),user_id=self.request.get(u ser)) marker.put() self.response.out.write(<html><body>) self.response.out.write(" Location Updated<br/>") self.response.out.write(</body></html>) Lucio Grenzi 34 l.grenzi@gmail.com – Freelance
  35. 35. Generate Markerclass GenerateMarkers(webapp.RequestHandler): def get(self): session=SessionManager(self) if session.is_set(): markers=db.GqlQuery("SELECT * FROM Markers") doc=<?xml version="1.0"?> doc+=<markers> for marker in markers: doc+=<marker doc+=lat="+marker.lat+" doc+=lon="+marker.lon+" doc+=type="restaurant" doc+=/> doc+=</markers> self.response.out.write(doc) Lucio Grenzi 35 l.grenzi@gmail.com – Freelance
  36. 36. Openlayer<html> <head> <script src="http://openlayers.org/api/OpenLayers.js"></script> <script> var points = []; </script> <ul> {% for point in interesting_points %} <li>{{ point.name }} -- {{point.interestingness}}</li> <script>points.push({{point.geometry.geojson|safe}});</script> {% endfor %} </ul> </scrpit> </head><body onload="init()"> Intersting Points.<br /> <div id="map"></div> </body></html> Lucio Grenzi 36 l.grenzi@gmail.com – Freelance
  37. 37. Openlayer js script<script type="text/javascript"> var map, base_layer, kml; function init(){ map = new OpenLayers.Map(map); base_layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", "http://labs.metacarta.com/wms/vmap0", {layers: basic} ); var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry"); var point = new OpenLayers.Geometry.Point(-100.01, 55.78); var pointFeature = new OpenLayers.Feature.Vector(point,null,null); map.addLayer(vectorLayer); map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5); vectorLayer.addFeatures([pointFeature]); }</script> Lucio Grenzi 37 l.grenzi@gmail.com – Freelance
  38. 38. Openlayer django scriptvectors = OpenLayers.Layer.Vector("Simple Geometry");for (var i = 0; i < points.length; i++) { point = format.read(points[i])[0]; point.attributes = {type:point}; vectors.addFeatures(point); } Lucio Grenzi 38 l.grenzi@gmail.com – Freelance
  39. 39. References• http://www.geodjango.com• http://invisibleroads.com/tutorials/geodjango-googlemaps-build.html• http://code.google.com/p/geodjango-basic-apps/wiki/FOSS4GWorkshop Lucio Grenzi 39 l.grenzi@gmail.com – Freelance
  40. 40. Questions? Lucio Grenzi 40 l.grenzi@gmail.com – Freelance
  41. 41. Thank youCreative Commons via tcmaker.org Lucio Grenzi 41 l.grenzi@gmail.com – Freelance

×