GOOGLE GEOGROUP
           Yiannis Doxaras*
               Niobium Labs
                @doxaras




  OCG regional technical committee member
GOOGLE GEOGROUP ?

• organize   web information

• google   is not a mapping company

• geospatial   content for organization

• OGC    open standards

•   Street View, Sketchup, Gmaps
MAPS API

• program    in flash or javascript

• display   a base map

• display
        your data on the map(markers, polylines, polygons, info
 boxes, 3D models, tips and image overlays)

• Access Google data and services (navigation, street view,
 elevation, geocoding)

• Interact   with users (drag & drop, editable objects)
MAPS API                       as of oct 2010
                                                          350K web sites


• program    in flash or javascript

• display   a base map

• display
        your data on the map(markers, polylines, polygons, info
 boxes, 3D models, tips and image overlays)

• Access Google data and services (navigation, street view,
 elevation, geocoding)

• Interact   with users (drag & drop, editable objects)
API FROM 30,000FT
WHAT’S NEW ?

• New     Maps Features

• Google    Geo APIs

• Fusion Tables

• Earth   & KML

• Latitude API
PROBLEMS SOLVING?


              Get rid of all
            synchronous API’s


        “latency was the first priority that
           apple introduced along with
          aggressive modularization and
             iPhone/Android support”
NEW MAP FEATURES     Flash

         Mobile
                  Earth




Static
STYLED MAPS
STYLING IN CODE
var stylez = [{
  featureType: 'road.local',
  elementType: 'geometry',
  stylers: [{
     hue: '#00ff00'
  }, {
     saturation: 100
  }]
}, {
  featureType: 'landscape',
  elementType: 'geometry',
  stylers: [{
     hue: '#000000'
  }]
}];

var styledMapType = new google.maps.StyledMapType(stylez, {
  map: map,
  name: 'Coffee Map!'
});

map.mapTypes.set('coffee-style', styledMapType);
map.setMapTypeId('coffee-style');
WHAT YOU CAN STYLE
•   Change size, color, and visibility of

    •   Points of Interest

    •   Labels

    •   Roads

    •   Water

    •   Borders

    •   and more
WHAT YOU CAN STYLE
•   Change size, color, and visibility of    laterally
    •   Points of Interest
                                            everything

    •   Labels

    •   Roads

    •   Water

    •   Borders

    •   and more
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
  html { height: 100% }
  body { height: 100%; margin: 0px; padding: 0px }
  #map_canvas { height: 100% }
</style>
<script type="text/javascript"
    src="http://maps.google.com/maps/api/js?sensor=set_to_true_or_false">
</script>
<script type="text/javascript">
  function initialize() {
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
  }

</script>
</head>
<body onload="initialize()">
  <div id="map_canvas" style="width:100%; height:100%"></div>
</body>
</html>
<!DOCTYPE html>
<html>                                                                set your
                                                                       app as
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
  html { height: 100% }                                               HTML5
  body { height: 100%; margin: 0px; padding: 0px }
  #map_canvas { height: 100% }
</style>
<script type="text/javascript"
    src="http://maps.google.com/maps/api/js?sensor=set_to_true_or_false">
</script>
<script type="text/javascript">
  function initialize() {
    var latlng = new google.maps.LatLng(-34.397, 150.644);
    var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
  }

</script>
</head>
<body onload="initialize()">
  <div id="map_canvas" style="width:100%; height:100%"></div>
</body>
</html>
FUSION TABLES
•   Upload large (100MB) tabular data

•   Easy visualization

•   Easy mapping

•   Customize info windows

•   Customize shapes

•   Spatial Queries!

•   FusionTableLayer in Maps API

•   Fusion Tables API
FUSION TABLES     GIS on
                                         the Cloud


•   Upload large (100MB) tabular data

•   Easy visualization

•   Easy mapping

•   Customize info windows

•   Customize shapes

•   Spatial Queries!

•   FusionTableLayer in Maps API

•   Fusion Tables API
SPATIAL DATA MANAGEMENT
VISUAL DATA EDITING
CUSTOMIZE - MAP THEMING
FUSION TABLES EX #1
FUSION TABLES EX #2

            SELECT *
            FROM 297050 WHERE

              ST_INTERSECTS(Ad
              dress, RECTANGLE
                 (LATLNG(37.2,
                 -122.3),
                 LATLNG(37.6,
                 -121.9)))
FUSION TABLES EX #3
map = new
google.maps.Map(document.getElementById('map_c
anvas'), {
    center: new google.maps.LatLng(37.4,
-122.1),
    zoom: 10,
    mapTypeId: google.maps.MapTypeId.ROADMAP
});
tableid = 297050;
layer = new
google.maps.FusionTablesLayer(tableid, {
    query: "SELECT Address FROM " + tableid + "
WHERE ST_INTERSECTS(Address,
RECTANGLE(LATLNG(37.3, -122.3), LATLNG(37.6,
-121.9)))",
    map: map
});
FUSION AS A WEB DB
      http://www.google.com/fusiontables/api/query?sql=<statement>


                                     sql=INSERT INTO 274708 (CityDescription,
                                     CityLocation)
    <Polygon>                        VALUES ('Tokyo Metropolis', '35.69 139.69')
<outerBoundaryIs>
<coordinates> lng,lat[,alt]
lng,lat[,alt] ... </coordinates>     sql=UPDATE 274814
</outerBoundaryIs>                   SET Route = '<LineString> <coordinates>
</Polygon>                           78.47,17.37 -91.58,32.44 2.35,48.85 </
                                     coordinates> </LineString>'
<LineString>                         WHERE ROWID = '1'
<coordinates> lng,lat[,alt]
lng,lat[,alt] ... </coordinates>
</LineString>                        sql=INSERT INTO 274319 (volunteer_id, plot)
                                     VALUES (45,
<Point>                              '<Polygon> <outerBoundaryIs>
<coordinates> lng,lat[,alt] </       <coordinates> -117.85,35.3 -117.85,35.301
coordinates>                         -117.851,35.301 -117.851,35.3 -117.85,35.3 </
</Point>                             coordinates>
                                     </outerBoundaryIs> </Polygon>'
LOCATION

• location   data are more private than financial data

• huge    data generation that concern user context and location

• large   data mining startups get the highest valuation lately

•   recommendation systems are here not to stay, but to dominate.

• having   said that.......
GOOGLE LATITUDE
GOOGLE LATITUDE
              google’s wishful
             thinking but still
              a lot happening
             in the landscape
MAPVERTISING
                               Display advertising alongside local
                                business search results using the
                               Local Search Control (GoogleBar)




Display advertising based on
the Maps viewport using the
       Maps Ad Unit
WHAT TO CHOOSE ?
WHAT TO CHOOSE ?
              fusion
              tables
WHAT TO CHOOSE ?
              fusion
              tables

  app
 engine
WHAT TO CHOOSE ?
              fusion
              tables

  app
 engine


              Google
             I/O data
OPTIONS
APP ENGINE PRIMER
data model
from google.appengine.ext import db
class myLocation:
  name = db.StringProperty()
  location = db.GeoPtProperty()


  from google.appengine.ext import db import mylocation
  myLocations = MyLocation.gql("WHERE name= :1", 'foo')


 Disadvantages for a Spatial Apps
 • Very limited spatial support in queries
 • Inequality limitations on one property only – So no obvious bounding box
 • Different (but cooler) way of building applications
 • Geomodel is complex and does not scale
Type of data ? Amount of data ?
     Resources ? Effort ?
       Interactivity ?
     Performance ?
EXAMPLES
EXAMPLES
EXAMPLES
EXAMPLES
EXAMPLES
EXAMPLES
REFERENCES

• http://code.google.com/apis/fusiontables/

• http://www.google.com/fusiontables/public/tour/index.html

• http://earth.google.com/outreach/
 tutorial_fusion_yourowndata.html

• http://code.google.com/apis/maps/documentation/javascript/
 reference.html

• http://www.google.com/mobile/latitude/
NEVER QUIT PLANNING

Ioannis Doxaras on GIS and Gmaps at 1st GTUG meetup Greece

  • 1.
    GOOGLE GEOGROUP Yiannis Doxaras* Niobium Labs @doxaras OCG regional technical committee member
  • 2.
    GOOGLE GEOGROUP ? •organize web information • google is not a mapping company • geospatial content for organization • OGC open standards • Street View, Sketchup, Gmaps
  • 3.
    MAPS API • program in flash or javascript • display a base map • display your data on the map(markers, polylines, polygons, info boxes, 3D models, tips and image overlays) • Access Google data and services (navigation, street view, elevation, geocoding) • Interact with users (drag & drop, editable objects)
  • 4.
    MAPS API as of oct 2010 350K web sites • program in flash or javascript • display a base map • display your data on the map(markers, polylines, polygons, info boxes, 3D models, tips and image overlays) • Access Google data and services (navigation, street view, elevation, geocoding) • Interact with users (drag & drop, editable objects)
  • 5.
  • 6.
    WHAT’S NEW ? •New Maps Features • Google Geo APIs • Fusion Tables • Earth & KML • Latitude API
  • 7.
    PROBLEMS SOLVING? Get rid of all synchronous API’s “latency was the first priority that apple introduced along with aggressive modularization and iPhone/Android support”
  • 8.
    NEW MAP FEATURES Flash Mobile Earth Static
  • 9.
  • 10.
    STYLING IN CODE varstylez = [{ featureType: 'road.local', elementType: 'geometry', stylers: [{ hue: '#00ff00' }, { saturation: 100 }] }, { featureType: 'landscape', elementType: 'geometry', stylers: [{ hue: '#000000' }] }]; var styledMapType = new google.maps.StyledMapType(stylez, { map: map, name: 'Coffee Map!' }); map.mapTypes.set('coffee-style', styledMapType); map.setMapTypeId('coffee-style');
  • 11.
    WHAT YOU CANSTYLE • Change size, color, and visibility of • Points of Interest • Labels • Roads • Water • Borders • and more
  • 12.
    WHAT YOU CANSTYLE • Change size, color, and visibility of laterally • Points of Interest everything • Labels • Roads • Water • Borders • and more
  • 13.
    <!DOCTYPE html> <html> <head> <meta name="viewport"content="initial-scale=1.0, user-scalable=no" /> <style type="text/css">   html { height: 100% }   body { height: 100%; margin: 0px; padding: 0px }   #map_canvas { height: 100% } </style> <script type="text/javascript"     src="http://maps.google.com/maps/api/js?sensor=set_to_true_or_false"> </script> <script type="text/javascript">   function initialize() {     var latlng = new google.maps.LatLng(-34.397, 150.644);     var myOptions = {       zoom: 8,       center: latlng,       mapTypeId: google.maps.MapTypeId.ROADMAP     };     var map = new google.maps.Map(document.getElementById("map_canvas"),         myOptions);   } </script> </head> <body onload="initialize()">   <div id="map_canvas" style="width:100%; height:100%"></div> </body> </html>
  • 14.
    <!DOCTYPE html> <html> set your app as <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css">   html { height: 100% } HTML5   body { height: 100%; margin: 0px; padding: 0px }   #map_canvas { height: 100% } </style> <script type="text/javascript"     src="http://maps.google.com/maps/api/js?sensor=set_to_true_or_false"> </script> <script type="text/javascript">   function initialize() {     var latlng = new google.maps.LatLng(-34.397, 150.644);     var myOptions = {       zoom: 8,       center: latlng,       mapTypeId: google.maps.MapTypeId.ROADMAP     };     var map = new google.maps.Map(document.getElementById("map_canvas"),         myOptions);   } </script> </head> <body onload="initialize()">   <div id="map_canvas" style="width:100%; height:100%"></div> </body> </html>
  • 15.
    FUSION TABLES • Upload large (100MB) tabular data • Easy visualization • Easy mapping • Customize info windows • Customize shapes • Spatial Queries! • FusionTableLayer in Maps API • Fusion Tables API
  • 16.
    FUSION TABLES GIS on the Cloud • Upload large (100MB) tabular data • Easy visualization • Easy mapping • Customize info windows • Customize shapes • Spatial Queries! • FusionTableLayer in Maps API • Fusion Tables API
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
    FUSION TABLES EX#2 SELECT * FROM 297050 WHERE ST_INTERSECTS(Ad dress, RECTANGLE (LATLNG(37.2, -122.3), LATLNG(37.6, -121.9)))
  • 22.
    FUSION TABLES EX#3 map = new google.maps.Map(document.getElementById('map_c anvas'), { center: new google.maps.LatLng(37.4, -122.1), zoom: 10, mapTypeId: google.maps.MapTypeId.ROADMAP }); tableid = 297050; layer = new google.maps.FusionTablesLayer(tableid, { query: "SELECT Address FROM " + tableid + " WHERE ST_INTERSECTS(Address, RECTANGLE(LATLNG(37.3, -122.3), LATLNG(37.6, -121.9)))", map: map });
  • 23.
    FUSION AS AWEB DB http://www.google.com/fusiontables/api/query?sql=<statement> sql=INSERT INTO 274708 (CityDescription, CityLocation) <Polygon> VALUES ('Tokyo Metropolis', '35.69 139.69') <outerBoundaryIs> <coordinates> lng,lat[,alt] lng,lat[,alt] ... </coordinates> sql=UPDATE 274814 </outerBoundaryIs> SET Route = '<LineString> <coordinates> </Polygon> 78.47,17.37 -91.58,32.44 2.35,48.85 </ coordinates> </LineString>' <LineString> WHERE ROWID = '1' <coordinates> lng,lat[,alt] lng,lat[,alt] ... </coordinates> </LineString> sql=INSERT INTO 274319 (volunteer_id, plot) VALUES (45, <Point> '<Polygon> <outerBoundaryIs> <coordinates> lng,lat[,alt] </ <coordinates> -117.85,35.3 -117.85,35.301 coordinates> -117.851,35.301 -117.851,35.3 -117.85,35.3 </ </Point> coordinates> </outerBoundaryIs> </Polygon>'
  • 24.
    LOCATION • location data are more private than financial data • huge data generation that concern user context and location • large data mining startups get the highest valuation lately • recommendation systems are here not to stay, but to dominate. • having said that.......
  • 25.
  • 26.
    GOOGLE LATITUDE google’s wishful thinking but still a lot happening in the landscape
  • 27.
    MAPVERTISING Display advertising alongside local business search results using the Local Search Control (GoogleBar) Display advertising based on the Maps viewport using the Maps Ad Unit
  • 28.
  • 29.
    WHAT TO CHOOSE? fusion tables
  • 30.
    WHAT TO CHOOSE? fusion tables app engine
  • 31.
    WHAT TO CHOOSE? fusion tables app engine Google I/O data
  • 32.
  • 33.
    APP ENGINE PRIMER datamodel from google.appengine.ext import db class myLocation: name = db.StringProperty() location = db.GeoPtProperty() from google.appengine.ext import db import mylocation myLocations = MyLocation.gql("WHERE name= :1", 'foo') Disadvantages for a Spatial Apps • Very limited spatial support in queries • Inequality limitations on one property only – So no obvious bounding box • Different (but cooler) way of building applications • Geomodel is complex and does not scale
  • 34.
    Type of data? Amount of data ? Resources ? Effort ? Interactivity ? Performance ?
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
    REFERENCES • http://code.google.com/apis/fusiontables/ • http://www.google.com/fusiontables/public/tour/index.html •http://earth.google.com/outreach/ tutorial_fusion_yourowndata.html • http://code.google.com/apis/maps/documentation/javascript/ reference.html • http://www.google.com/mobile/latitude/
  • 42.