SlideShare a Scribd company logo
1 of 41
GeoDjango e HTML5

Lucio Grenzi

l.grenzi@gmail.com
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
Agenda
•   HTML 5 geolocalization: the new parts
•   About GeoDjango
•   GIS data format troubles
•   GeoDjango api's
•   GeoDjango and Google Maps /
    OpenStreetMaps

                                                   Lucio Grenzi   3
                                 l.grenzi@gmail.com – Freelance
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
• Location based services

                                               Lucio Grenzi   5
                             l.grenzi@gmail.com – Freelance
HTML 5 Geolocation api's (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
HTML 5 Geolocation api's (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
HTML 5 Geolocation api's (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
GeoDjango
GeoDjango 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
Install GeoDjango
• django.contrib.gis
• Spatial database
• Geospatial libraries




                                               Lucio Grenzi   10
                             l.grenzi@gmail.com – Freelance
Spatial database

Database     Library            Supported Versions Notes
             Requirements
PostgreSQL   GEOS, PROJ.4,      8.1+                 Requires PostGIS
             PostGIS
MySQL        GEOS               5.x                  limited functionality

Oracle       GEOS               10.2, 11             XE not supported

SQLite       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
Geospatial libraries
Program      Description              Required                    Supported Versions
GEOS         Geometry Engine          Yes                         3.3, 3.2, 3.1, 3.0
             Open Source
PROJ.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
             library
PostGIS      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
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
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
ABC GeoDjango




                             Lucio Grenzi   15
           l.grenzi@gmail.com – Freelance
GeoDjango Model layer
A 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
GeoDjango Template layer
Django’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
GeoDjango View layer
A 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
GeoDjango Model API
Field type                        Field options


class GeometryField               srid
class PointField                  spatial_index
class LineStringField             dim
class PolygonField                geography
class MultiPointField             geography Type
class MultiLineStringField
class MultiPolygonField
GeometryCollectionField
class GeometryCollectionField
                                                                Lucio Grenzi   19
                                              l.grenzi@gmail.com – Freelance
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
GeoQuerySet API
• Measurement: distance,area, length, perimeter

   GeoQuerySet.distance(geom, **kwargs)




                                                           Lucio Grenzi   21
                                         l.grenzi@gmail.com – Freelance
GeoQuerySet API
• Relationship: centroid, envelop, point_on_surface

  GeoQuerySet.envelope(**kwargs)




                                                            Lucio Grenzi   22
                                          l.grenzi@gmail.com – Freelance
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
GeoQuerySet API
• Opertion: difference, intersection, sym_difference, union

 GeoQuerySet.intersection(geom)




                                                             Lucio Grenzi   24
                                           l.grenzi@gmail.com – Freelance
GeoQuerySet API
• Output: geohash, geojson, gml, kml, svg

 GeoQuerySet.svg(**kwargs)




                                                              Lucio Grenzi   25
                                            l.grenzi@gmail.com – Freelance
Google Maps license




http://www.google.com/intl/it_it/help/terms_maps.html
                                                         Lucio Grenzi   26
                                       l.grenzi@gmail.com – Freelance
OpenstreetMap recent licensing changes




  http://blog.openstreetmap.it/2012/04/01/cambio-licenza/
                                                        Lucio Grenzi   27
                                      l.grenzi@gmail.com – Freelance
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



                                                   Lucio Grenzi   29
                                 l.grenzi@gmail.com – Freelance
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.py
DATABASES = { 'default': {
     'ENGINE' : 'django.contrib.gis.db.backends.postgis',
     'NAME': 'geodatabase',
     'USER': 'geouser',
     'PASSWORD': 'geopassword',
  }}
                                                                              Lucio Grenzi   30
                                                            l.grenzi@gmail.com – Freelance
Step 2 : Geospatial information
• Edit model.py in order to setup the spatial
  reference system
• Google Maps api use srid = 4126
name = models.CharField(max_length=32)
geometry = models.PointField(srid=4326)
objects = models.GeoManager()



                                                            Lucio Grenzi   31
                                          l.grenzi@gmail.com – Freelance
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
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
Record Location
class 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
Generate Marker
class 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
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
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
Openlayer django script
vectors = 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
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
Questions?




                               Lucio Grenzi   40
             l.grenzi@gmail.com – Freelance
Thank you




Creative Commons via tcmaker.org



                                                     Lucio Grenzi   41
                                   l.grenzi@gmail.com – Freelance

More Related Content

Similar to Geodjango

Foss4 g 2017-kansai-ryoo-kim
Foss4 g 2017-kansai-ryoo-kimFoss4 g 2017-kansai-ryoo-kim
Foss4 g 2017-kansai-ryoo-kim
OSgeo Japan
 
Geo2tag LBS platform training at FRUCT12
Geo2tag LBS platform training at FRUCT12Geo2tag LBS platform training at FRUCT12
Geo2tag LBS platform training at FRUCT12
OSLL
 
Pycon 2012 Taiwan
Pycon 2012 TaiwanPycon 2012 Taiwan
Pycon 2012 Taiwan
Dongpo Deng
 
那些年 Python 攻佔了 GIS / The Year Python Takes Over GIS
那些年 Python 攻佔了 GIS / The Year Python Takes Over GIS那些年 Python 攻佔了 GIS / The Year Python Takes Over GIS
那些年 Python 攻佔了 GIS / The Year Python Takes Over GIS
pycontw
 

Similar to Geodjango (20)

Java Tech & Tools | Mapping, GIS and Geolocating Data in Java | Joachim Van d...
Java Tech & Tools | Mapping, GIS and Geolocating Data in Java | Joachim Van d...Java Tech & Tools | Mapping, GIS and Geolocating Data in Java | Joachim Van d...
Java Tech & Tools | Mapping, GIS and Geolocating Data in Java | Joachim Van d...
 
Developing Geospatial software with Python, Part 1
Developing Geospatial software with Python, Part 1Developing Geospatial software with Python, Part 1
Developing Geospatial software with Python, Part 1
 
Foss4 g 2017-kansai-ryoo-kim
Foss4 g 2017-kansai-ryoo-kimFoss4 g 2017-kansai-ryoo-kim
Foss4 g 2017-kansai-ryoo-kim
 
Saving Money with Open Source GIS
Saving Money with Open Source GISSaving Money with Open Source GIS
Saving Money with Open Source GIS
 
Using Geoscript Groovy
Using Geoscript GroovyUsing Geoscript Groovy
Using Geoscript Groovy
 
Comparing Vocabularies for Representing Geographical Features and Their Geometry
Comparing Vocabularies for Representing Geographical Features and Their GeometryComparing Vocabularies for Representing Geographical Features and Their Geometry
Comparing Vocabularies for Representing Geographical Features and Their Geometry
 
Geo2tag LBS platform training at FRUCT12
Geo2tag LBS platform training at FRUCT12Geo2tag LBS platform training at FRUCT12
Geo2tag LBS platform training at FRUCT12
 
New way for GIS Development(Gaia3D)
New way for  GIS Development(Gaia3D)New way for  GIS Development(Gaia3D)
New way for GIS Development(Gaia3D)
 
Gdal introduction
Gdal introductionGdal introduction
Gdal introduction
 
Android Developer Toolbox 2017
Android Developer Toolbox 2017Android Developer Toolbox 2017
Android Developer Toolbox 2017
 
Android dev toolbox - Shem Magnezi, WeWork
Android dev toolbox - Shem Magnezi, WeWorkAndroid dev toolbox - Shem Magnezi, WeWork
Android dev toolbox - Shem Magnezi, WeWork
 
Using python to analyze spatial data
Using python to analyze spatial dataUsing python to analyze spatial data
Using python to analyze spatial data
 
Up and Running with Leaflet.js
Up and Running with Leaflet.jsUp and Running with Leaflet.js
Up and Running with Leaflet.js
 
Pycon 2012 Taiwan
Pycon 2012 TaiwanPycon 2012 Taiwan
Pycon 2012 Taiwan
 
那些年 Python 攻佔了 GIS / The Year Python Takes Over GIS
那些年 Python 攻佔了 GIS / The Year Python Takes Over GIS那些年 Python 攻佔了 GIS / The Year Python Takes Over GIS
那些年 Python 攻佔了 GIS / The Year Python Takes Over GIS
 
Open Source GIS
Open Source GISOpen Source GIS
Open Source GIS
 
Postgis for Enterprise
Postgis for EnterprisePostgis for Enterprise
Postgis for Enterprise
 
Location based services for Nokia X and Nokia Asha using Geo2tag
Location based services for Nokia X and Nokia Asha using Geo2tagLocation based services for Nokia X and Nokia Asha using Geo2tag
Location based services for Nokia X and Nokia Asha using Geo2tag
 
FME-Based Tool for Automatic Updating of Geographical Git Repositories (Pushi...
FME-Based Tool for Automatic Updating of Geographical Git Repositories (Pushi...FME-Based Tool for Automatic Updating of Geographical Git Repositories (Pushi...
FME-Based Tool for Automatic Updating of Geographical Git Repositories (Pushi...
 
Debbie Liang Resume
Debbie Liang ResumeDebbie Liang Resume
Debbie Liang Resume
 

More from Lucio Grenzi

Jenkins djangovillage
Jenkins djangovillageJenkins djangovillage
Jenkins djangovillage
Lucio Grenzi
 

More from Lucio Grenzi (12)

How to use Postgresql in order to handle Prometheus metrics storage
How to use Postgresql in order to handle Prometheus metrics storageHow to use Postgresql in order to handle Prometheus metrics storage
How to use Postgresql in order to handle Prometheus metrics storage
 
Building serverless application on the Apache Openwhisk platform
Building serverless application on the Apache Openwhisk platformBuilding serverless application on the Apache Openwhisk platform
Building serverless application on the Apache Openwhisk platform
 
Patroni: PostgreSQL HA in the cloud
Patroni: PostgreSQL HA in the cloudPatroni: PostgreSQL HA in the cloud
Patroni: PostgreSQL HA in the cloud
 
Postgrest: the REST API for PostgreSQL databases
Postgrest: the REST API for PostgreSQL databasesPostgrest: the REST API for PostgreSQL databases
Postgrest: the REST API for PostgreSQL databases
 
Full slidescr16
Full slidescr16Full slidescr16
Full slidescr16
 
Use Ionic Framework to develop mobile application
Use Ionic Framework to develop mobile applicationUse Ionic Framework to develop mobile application
Use Ionic Framework to develop mobile application
 
Rabbitmq & Postgresql
Rabbitmq & PostgresqlRabbitmq & Postgresql
Rabbitmq & Postgresql
 
Jenkins djangovillage
Jenkins djangovillageJenkins djangovillage
Jenkins djangovillage
 
PLV8 - The PostgreSQL web side
PLV8 - The PostgreSQL web sidePLV8 - The PostgreSQL web side
PLV8 - The PostgreSQL web side
 
Pg tap
Pg tapPg tap
Pg tap
 
Yui app-framework
Yui app-frameworkYui app-framework
Yui app-framework
 
node.js e Postgresql
node.js e Postgresqlnode.js e Postgresql
node.js e Postgresql
 

Recently uploaded

Recently uploaded (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Geodjango

  • 1. GeoDjango e HTML5 Lucio Grenzi l.grenzi@gmail.com
  • 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. Agenda • HTML 5 geolocalization: the new parts • About GeoDjango • GIS data format troubles • GeoDjango api's • GeoDjango and Google Maps / OpenStreetMaps Lucio Grenzi 3 l.grenzi@gmail.com – Freelance
  • 4. Once upon a time Lucio Grenzi 4 l.grenzi@gmail.com – Freelance
  • 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. HTML 5 Geolocation api's (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. HTML 5 Geolocation api's (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. HTML 5 Geolocation api's (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. GeoDjango GeoDjango 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. Install GeoDjango • django.contrib.gis • Spatial database • Geospatial libraries Lucio Grenzi 10 l.grenzi@gmail.com – Freelance
  • 11. Spatial database Database Library Supported Versions Notes Requirements PostgreSQL GEOS, PROJ.4, 8.1+ Requires PostGIS PostGIS MySQL GEOS 5.x limited functionality Oracle GEOS 10.2, 11 XE not supported SQLite 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. Geospatial libraries Program Description Required Supported Versions GEOS Geometry Engine Yes 3.3, 3.2, 3.1, 3.0 Open Source PROJ.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 library PostGIS 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. 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. 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. ABC GeoDjango Lucio Grenzi 15 l.grenzi@gmail.com – Freelance
  • 16. GeoDjango Model layer A 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. GeoDjango Template layer Django’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. GeoDjango View layer A 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. GeoDjango Model API Field type Field options class GeometryField srid class PointField spatial_index class LineStringField dim class PolygonField geography class MultiPointField geography Type class MultiLineStringField class MultiPolygonField GeometryCollectionField class GeometryCollectionField Lucio Grenzi 19 l.grenzi@gmail.com – Freelance
  • 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. GeoQuerySet API • Measurement: distance,area, length, perimeter GeoQuerySet.distance(geom, **kwargs) Lucio Grenzi 21 l.grenzi@gmail.com – Freelance
  • 22. GeoQuerySet API • Relationship: centroid, envelop, point_on_surface GeoQuerySet.envelope(**kwargs) Lucio Grenzi 22 l.grenzi@gmail.com – Freelance
  • 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. GeoQuerySet API • Opertion: difference, intersection, sym_difference, union GeoQuerySet.intersection(geom) Lucio Grenzi 24 l.grenzi@gmail.com – Freelance
  • 25. GeoQuerySet API • Output: geohash, geojson, gml, kml, svg GeoQuerySet.svg(**kwargs) Lucio Grenzi 25 l.grenzi@gmail.com – Freelance
  • 26. Google Maps license http://www.google.com/intl/it_it/help/terms_maps.html Lucio Grenzi 26 l.grenzi@gmail.com – Freelance
  • 27. OpenstreetMap recent licensing changes http://blog.openstreetmap.it/2012/04/01/cambio-licenza/ Lucio Grenzi 27 l.grenzi@gmail.com – Freelance
  • 28. GeoDjango & Google Maps Lucio Grenzi 28 l.grenzi@gmail.com – Freelance
  • 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. 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.py DATABASES = { 'default': { 'ENGINE' : 'django.contrib.gis.db.backends.postgis', 'NAME': 'geodatabase', 'USER': 'geouser', 'PASSWORD': 'geopassword', }} Lucio Grenzi 30 l.grenzi@gmail.com – Freelance
  • 31. Step 2 : Geospatial information • Edit model.py in order to setup the spatial reference system • Google Maps api use srid = 4126 name = models.CharField(max_length=32) geometry = models.PointField(srid=4326) objects = models.GeoManager() Lucio Grenzi 31 l.grenzi@gmail.com – Freelance
  • 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. 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. Record Location class 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. Generate Marker class 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. 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. 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. Openlayer django script vectors = 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. 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. Questions? Lucio Grenzi 40 l.grenzi@gmail.com – Freelance
  • 41. Thank you Creative Commons via tcmaker.org Lucio Grenzi 41 l.grenzi@gmail.com – Freelance