Tải bản đầy đủ (.pdf) (383 trang)

apress beginning google maps applications with php and ajax from novice to professional

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (15.37 MB, 383 trang )

this print for content only—size & color not accurate spine = 0.8927" 384 page count
BOOKS FOR PROFESSIONALS BY PROFESSIONALS
®
Michael Purvis
US $34.99
Shelve in
Web development
User level:
Beginner–Intermediate
Purvis,
Sambells,
Turner
THE EXPERT’S VOICE
®
IN WEB DEVELOPMENT
Michael Purvis, Jeffrey Sambells,
and
Cameron Turner
Foreword by Mike Pegg,
Founder of the Google Maps Mania Blog
Beginning
Google Maps
Applications
with PHP and Ajax
From Novice to Professional
CYAN
MAGENTA
YELLOW
BLACK
PANTONE 123 CV
ISBN 1-59059-707-9


9 781590 597071
53499
6 89253 59707 1
Companion
eBook Available
Build awesome web-based mapping applications with this powerful API!
Covers
API Version 2, including
Google’s geocoder!
Covers
API Version 2, including
Google’s geocoder!
www.apress.com
SOURCE CODE ONLINE
Companion eBook
See last page for details
on $10 eBook version
forums.apress.com
FOR PROFESSIONALS
BY PROFESSIONALS

Join online discussions:
THE APRESS ROADMAP
Beginning JavaScript
with DOM and Ajax
Beginning CSS
Web Development
Pro CSS Techniques
Beginning Google Maps Application
Development with PHP and Ajax

Beginning PHP and MySQL 5,
Second Edition
Jeffrey Sambells, ZCE
Cameron Turner
Beginning Google Maps Applications with PHP and Ajax:
From Novice to Professional
Dear Reader,
Until recently, building interactive web-based mapping applications has been a
cumbersome affair. That changed when Google released its powerful Maps API.
We’ve written this book to help you take advantage of this technology in your
own endeavors—whether you’re an enthusiast playing for fun or a professional
building for profit.
We get rolling with examples that require hardly any code at all, but you’ll
quickly become acquainted with many facets of the Maps API. We demonstrate
powerful methods for simultaneously plotting large data sets, creating your
own map overlays, and harvesting and geocoding sets of addresses. You’ll see
how to set up alternative tile sets and where to access imagery to use for them.
We even show you how to build your own geocoder from scratch, for those
high-volume batch jobs.
We’ve had a blast researching and writing this book, and we really think it
has turned into a great, comprehensive resource. As well as providing hands-on
examples of real mapping projects, this book supplies a complete reference for
the API, along with the relevant aspects of JavaScript, CSS, PHP, and SQL.
If you enjoy this book or you’ve built something cool related to Google
Maps, we encourage you to drop by and let us
know. We’re keeping a blog there that’s an ongoing stream of new pointers,
ideas, and resources to help out fellow mappers.
Now, go forth and map the world!
Mike Purvis, Jeffrey Sambells, and Cameron Turner
Beginning

Google Maps Applications
with
PHP
and
Ajax
Beginning Google Maps
Applications with
PHP and Ajax
From Novice to Professional
Michael Purvis
Jeffrey Sambells
and Cameron Turner
7079ch00FM.qxd 7/27/06 3:18 PM Page i
Beginning Google Maps Applications with PHP and Ajax: From Novice to Professional
Copyright © 2006 by Michael Purvis, Jeffrey Sambells, and Cameron Turner
All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording, or by any information storage or retrieval
system, without the prior written permission of the copyright owner and the publisher.
ISBN-13 (pbk): 978-1-59059-707-1
ISBN-10 (pbk): 1-59059-707-9
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Jason Gilmore
Technical Reviewer: Terrill Dent
Editorial Board: Steve Anglin, Ewan Buckingham, Gary Cornell, Jason Gilmore, Jonathan Gennick,
Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser,
Keir Thomas, Matt Wade
Project Manager: Elizabeth Seymour

Copy Edit Manager: Nicole LeClerc
Copy Editor: Marilyn Smith
Assistant Production Director: Kari Brooks-Copony
Production Editor: Katie Stence
Compositor: Kinetic Publishing Services, LLC
Proofreader: Liz Welch
Indexer: Beth Palmer
Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail , or
visit .
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley,
CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail , or visit .
The information in this book is distributed on an “as is” basis, without warranty. Although every precau-
tion has been taken in the preparation of this work, neither the author(s) nor Apress shall have any
liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly
or indirectly by the information contained in this work.
The source code for this book is available to readers at in the Source Code section
or at the official book site, .
7079ch00FM.qxd 7/27/06 3:18 PM Page ii
To Anne and Jim, that with God’s grace,
I might one day be so loving a parent.
—Michael Purvis
Dedicated to my loving wife, Stephanie, always by my side as my navigator in life.
May we never lose our way in this crazy world.
And also to my parents, Frank and Linda,
who taught me to always look beyond the horizon.
—Jeffrey Sambells
I dedicate this book to my amazing wife, Tanya, and our son, Owen.

Tanya is the ultimate teammate and life partner—
always willing to dive into an adventure or opportunity regardless of the size.
I’d also like to thank my parents, Barry and Lorna, for supporting me
in all my ambitions and encouraging me to take risks and pursue dreams.
Without all of you, I would never have agreed to write my first book
about a moving-target topic such as Google Maps,
on a compressed timeline, with a newborn baby!
To everyone else who helped out in the last few months, thank you.
We couldn’t have completed this book without your help and patience.
—Cameron Turner
7079ch00FM.qxd 7/27/06 3:18 PM Page iii
7079ch00FM.qxd 7/27/06 3:18 PM Page iv
Contents at a Glance
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
PART 1
■ ■ ■
Your First Google Maps
■CHAPTER 1 Introducing Google Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
■CHAPTER 2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
■CHAPTER 3 Interacting with the User and the Server . . . . . . . . . . . . . . . . . . . . . . . 31
■CHAPTER 4 Geocoding Addresses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
PART 2
■ ■ ■
Beyond the Basics
■CHAPTER 5 Manipulating Third-Party Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
■CHAPTER 6 Improving the User Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
■CHAPTER 7 Optimizing and Scaling for Large Data Sets. . . . . . . . . . . . . . . . . . . . 145

■CHAPTER 8 What’s Next for the Google Maps API?. . . . . . . . . . . . . . . . . . . . . . . . . 199
PART 3
■ ■ ■
Advanced Map Features
and Methods
■CHAPTER 9 Advanced Tips and Tricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
■CHAPTER 10 Lines, Lengths, and Areas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
■CHAPTER 11 Advanced Geocoding Topics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
PART 4
■ ■ ■
Appendixes
■APPENDIX A Finding the Data You Want . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
■APPENDIX B Google Maps API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
v
7079ch00FM.qxd 7/27/06 3:18 PM Page v
7079ch00FM.qxd 7/27/06 3:18 PM Page vi
Contents
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiii
PART 1
■ ■ ■
Your First Google Maps
■CHAPTER 1 Introducing Google Maps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
KML: Your First Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Wayfaring: Your Second Map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Adding the First Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Adding the Flight Route . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Adding the Destination Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Adding a Driving Route . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
What’s Next? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
■CHAPTER 2 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
The First Map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Keying Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Examining the Sample Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Specifying a New Location. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Separating Code from Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Cleaning Up. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Basic Interaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Using Map Control Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Creating Markers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Opening Info Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
A List of Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Using Arrays and Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Iterating . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
vii
7079ch00FM.qxd 7/27/06 3:18 PM Page vii
■CHAPTER 3 Interacting with the User and the Server. . . . . . . . . . . . . . . . . . 31
Going on a Treasure Hunt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Creating the Map and Marking Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Starting the Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Listening to User Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Asking for More Information with an Info Window. . . . . . . . . . . . . . . . . . . . 37
Creating an Info Window on the Map . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Embedding a Form into the Info Window. . . . . . . . . . . . . . . . . . . . . . . 39
Avoiding an Ambiguous State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Controlling the Info Window Size. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

Using Google’s Ajax Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Saving Data with GXmlHttp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Parsing the XML Document Using DOM Methods . . . . . . . . . . . . . . . 54
Retrieving Markers from the Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Adding Some Flair. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
■CHAPTER 4 Geocoding Addresses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Creating an XML File with the Address Data. . . . . . . . . . . . . . . . . . . . . . . . . 63
Using Geocoding Web Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Requirements for Consuming Geocoding Services . . . . . . . . . . . . . . 66
The Google Maps API Geocoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
The Yahoo Geocoding API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Geocoder.us . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Geocoder.ca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Services for Geocoding Addresses Outside Google’s Coverage. . . . 85
Caching Lookups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Building a Store Location Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
PART 2
■ ■ ■
Beyond the Basics
■CHAPTER 5 Manipulating Third-Party Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Using Downloadable Text Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Downloading the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Parsing CSV Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Optimizing the Import . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Using Your New Database Schema. . . . . . . . . . . . . . . . . . . . . . . . . . . 106
■CONTENTSviii
7079ch00FM.qxd 7/27/06 3:18 PM Page viii
Screen Scraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

A Scraping Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Screen Scraping Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
■CHAPTER 6 Improving the User Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
CSS: A Touch of Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Maximizing Your Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Adding Hovering Toolbars. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Creating Collapsible Side Panels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Scripted Style. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Switching Up the Body Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Resizing with the Power of JavaScript. . . . . . . . . . . . . . . . . . . . . . . . 129
Populating the Side Panel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Getting Side Panel Feedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Warning, Now Loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Data Point Filtering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Showing and Hiding Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Discovering Groupings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Creating Filter Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
■CHAPTER 7 Optimizing and Scaling for Large Data Sets . . . . . . . . . . . . . 145
Understanding the Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Streamlining Server-Client Communications . . . . . . . . . . . . . . . . . . . . . . . 146
Optimizing Server-Side Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Server-Side Boundary Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Server-Side Common Point Method . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Server-Side Clustering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Custom Detail Overlay Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Custom Tile Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Optimizing the Client-Side User Experience . . . . . . . . . . . . . . . . . . . . . . . 186
Client-Side Boundary Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

Client-Side Closest to a Common Point Method. . . . . . . . . . . . . . . . 188
Client-Side Clustering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Further Optimizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
■CONTENTS ix
7079ch00FM.qxd 7/27/06 3:18 PM Page ix
■CHAPTER 8 What’s Next for the Google Maps API? . . . . . . . . . . . . . . . . . . . 199
Driving Directions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Integrated Google Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
KML Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
More Data Layers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Beyond the Enterprise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Interface Improvements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
PART 3
■ ■ ■
Advanced Map Features
and Methods
■CHAPTER 9 Advanced Tips and Tricks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Debugging Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Interacting with the Map from the API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Helping You Find Your Place . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Force Triggering Events with GEvent . . . . . . . . . . . . . . . . . . . . . . . . . 212
Creating Your Own Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Creating Map Objects with GOverlay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Choosing the Pane for the Overlay . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Creating a Quick Tool Tip Overlay . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Creating Custom Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Creating the Control Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Creating the Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

Positioning the Container . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Using the Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Adding Tabs to Info Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Creating a Tabbed Info Window. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Gathering Info Window Information and Changing Tabs . . . . . . . . . 226
Creating a Custom Info Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Creating the Overlay Object and Containers . . . . . . . . . . . . . . . . . . . 232
Drawing a LittleInfoWindow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Implementing Your Own Map Type,Tiles, and Projection . . . . . . . . . . . . . 237
GMapType: Gluing It Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
GProjection: Locating Where Things Are . . . . . . . . . . . . . . . . . . . . . . 238
GTileLayer: Viewing Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
The Blue Marble Map: Putting It All Together . . . . . . . . . . . . . . . . . . 247
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
■CONTENTSx
7079ch00FM.qxd 7/27/06 3:18 PM Page x
■CHAPTER 10 Lines, Lengths, and Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Starting Flat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Lengths and Angles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Moving to Spheres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
The Great Circle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Great-Circle Lengths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Area on a Spherical Surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Working with Polylines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Building the Polylines Demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Expanding the Polylines Demo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
What About UTM Coordinates? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Running Afoul of the Date Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

■CHAPTER 11 Advanced Geocoding Topics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Where Does the Data Come From? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Sample Data from Government Sources . . . . . . . . . . . . . . . . . . . . . . 286
Sources of Raw GIS Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Geocoding Based on Postal Codes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Grabbing the TIGER/Line by the Tail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Understanding and Defining the Data . . . . . . . . . . . . . . . . . . . . . . . . 295
Parsing and Importing the Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Building a Geocoding Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
PART 4
■ ■ ■
Appendixes
■APPENDIX A Finding the Data You Want . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Knowing What to Look For: Search Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Finding the Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Specifying Search Terms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Watching for Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
The Cat Came Back: Revisiting the TIGER/Line . . . . . . . . . . . . . . . . . . . . . 316
More on Airports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
The Government Standard: The Geonames Data. . . . . . . . . . . . . . . . . . . . 319
Shake, Rattle, and Roll: The NOAA Goldmine . . . . . . . . . . . . . . . . . . . . . . . 319
■CONTENTS xi
7079ch00FM.qxd 7/27/06 3:18 PM Page xi
For the Space Aficionado in You . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Crater Impacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
UFO/UAP Sightings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
■APPENDIX B Google Maps API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
class GMap2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
GMap2 Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323

GMap2 Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
class GMapOptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
GMapOptions Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
enum GMapPane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
GMapPane Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
class GKeyboardHandler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
GKeyboardHandler Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
GKeyboardHandler Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
interface GOverlay. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
GOverlay Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
GOverlay Static Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
GOverlay Abstract Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
class GInfoWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
GInfoWindow Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
GInfoWindow Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
class GInfoWindowTab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
GInfoWindowTab Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
class GInfoWindowOptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
GInfoWindowOptions Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
class GMarker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
GMarker Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
GMarker Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
GMarker Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
class GMarkerOptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
GMarkerOptions Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
class GPolyline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
GPolyline Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
GPolyline Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
GPolyline Event. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
class GIcon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334

GIcon Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
GIcon Constant. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
GIcon Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
■CONTENTSxii
7079ch00FM.qxd 7/27/06 3:18 PM Page xii
class GPoint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
GPoint Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
GPoint Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
GPoint Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
class GSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
GSize Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
GSize Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
GSize Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
class GBounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
GBounds Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
GBounds Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
GBounds Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
class GLatLng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
GLatLng Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
GLatLng Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
GLatLng Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
class GLatLngBounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
GLatLngBounds Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
GLatLngBounds Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
interface GControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
GControl Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
GControl Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
class GControl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
GControl Constructors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
class GControlPosition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339

GControlPosition Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
enum GControlAnchor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
GControlAnchor Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
class GMapType. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
GMapType Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
GMapType Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
GMapType Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
GMapType Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
class GMapTypeOptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
GMapTypeOptions Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
interface GTileLayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
GTileLayer Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
GTileLayer Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
GTileLayer Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
■CONTENTS xiii
7079ch00FM.qxd 7/27/06 3:18 PM Page xiii
class GCopyrightCollection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
GCopyrightCollection Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
GCopyrightCollection Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
GCopyrightCollection Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
class GCopyright . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
GCopyright Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
GCopyright Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
interface GProjection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
GProjection Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
class GMercatorProjection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
GMercatorProjection Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
GMercatorProjection Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
namespace GEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
GEvent Static Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345

GEvent Event. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
class GEventListener. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
namespace GXmlHttp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
GXmlHttp Static Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
namespace GXml. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
GXml Static Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
class GXslt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
GXslt Static Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
namespace GLog. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
GLog Static Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
enum GGeoStatusCode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
GGeoStatusCode Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
class GClientGeocoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
GClientGeocoder Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
GClientGeocoder Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
class GGeocodeCache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
GGeocodeCache Constructor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
GGeocodeCache Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
class GFactualGeocodeCache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
GFactualGeocodeCache Constructor . . . . . . . . . . . . . . . . . . . . . . . . . 349
GFactualGeocodeCache Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
■CONTENTSxiv
7079ch00FM.qxd 7/27/06 3:18 PM Page xiv
Foreword
In the Beginning. . .
In the history of the Internet, 2005–2006 will be remembered as the year when online mapping
finally came of age. Prior to 2005, MapQuest and other mapping services allowed you to look
up directions, search for locations, and map businesses, but these searches were limited, usu-

ally to the companies the services had partnered with, so you couldn’t search for any location.
On February 8, 2005, Google changed all that. As it does with many of its services, Google qui-
etly released the beta of Google Maps to its Labs incubator () and let
word-of-mouth marketing promote the new service.
By all accounts, Google Maps was an instant hit. It was the first free mapping service to
provide satellite map views of any location on the earth, allowing anyone to look for familiar
places. This started the “I can see my house from here” trend, and set the blogosphere abuzz
with links to Google Maps locations around the world.
Like other mapping services, Google Maps offered directions, city and town mapping,
and local business searches. However, what the Google Maps engineers buried within its
code was something that quickly set it apart from the rest. Although unannounced and pos-
sibly unplanned, they provided the means to manipulate the code of Google Maps to plot
your own locations. Moreover, you could combine this base mapping technology with an
external data source to instantly map many location-based points of information. And all of
this could be done on privately owned domains, seemingly independent of Google itself.
At first, mapping “hackers” unlocked this functionality, just as video gamers hack into
games by entering simple cheat codes. They created their own mapping services using Google
Maps and other sources. One of the first these was Housingmaps.com, which combined the
craigslist.org housing listings with a searchable Google Maps interface. Next came Adrian
Holovaty’s chicagocrime.org, which offered a compelling way to view crime data logged by the
Chicago Police Department. These home-brewed mapping applications were dubbed “hacks,”
since Google had not sanctioned the use of its code in external domains on the Web.
The major change came in June 2005, when Google officially introduced the Google Maps
API, which is the foundation for this book. By releasing this API, Google allowed programmers
the opportunity to build an endless array of applications on top of Google Maps. Hundreds of
API keys were registered immediately after the announcement, and many sites integrating
Google Maps appeared within days. The map mashup was born.
The Birth of the Google Maps Mania Blog
The Google Maps labs beta site had been public for barely a month when I tried it for the first
time. I was fascinated. While combing through the blogosphere looking for more information,

I started to see a trend toward Google Maps hacks, how-to sites, Firefox extensions, and web-
sites indexing specific satellite images. I thought that others could benefit from an aggregation
of all of these ideas into one themed blog. Thus, my Google Maps Mania blog was born.
xv
7079ch00FM.qxd 7/27/06 3:18 PM Page xv
Google Maps Mania is more accurately described as a “meta-site,” as host Leo Laporte pointed
out when I was a guest on his NPR G4techTV radio show in November 2005.
April 13, 2005, saw these as my first posts:
Title: Google Maps Mania
If you’re like me you were absolutely floored when Google came out with the Google
Maps service. Sure, it’s just another mapping service. Until you realize it’s full potential.
The ability to toggle between regular street/road maps and a satellite view is unreal. I’ve
started to see a lot of buzz around the blogging community about Google Maps so I’ve
decided to help you keep up with the Google Maps related sites, blogs and tools that are
cropping up. Stay tuned.
Title: Google Sightseeing
The first Google Maps related site of note is Google Sightseeing. This blog tracks interest-
ing satellite shots as submitted by its visitors, then organizes them by interest area like
buildings, natural landmarks and stadiums. It’s a pretty nifty site. Google Sightseeing even
posted my suggestion of Toronto’s Rogers Centre (Skydome) and the CN Tower!
Title: Flickr Memory Maps
Here’s a Flickr group that took off fast. Memory Maps is a Flickr group that contains maps
with captions describing memories they have of those areas or specific notes about differ-
ent areas. Kind of cool.
Title: Make your own multimedia Google map
Google Blogoscoped tipped me off on this link. Seems Engadget has a page which gives
some pretty good directions on how to create your own annotated multimedia Google
map. There is some pretty serious direction here which includes inserting pictures and
movies from the annotations. I’d like to see an example of this.
Title: My GMaps

myGmaps enables you to create, save and host custom data files and display them with
Google Maps. Create push-pin spots on any map of your choice. Mark your house, where
an event will be held, or the route of a fun-run as a few examples. Then you can publish
the map that you’ve created to your own website.
These postings represented an interesting cross-section of the ideas, concepts, and web-
sites that I had come across in the two short months since Google Maps came to the Web. In
the year between the start of Google Maps Mania and the release of the second-generation API
(which this book is based on) in April 2006, I have made over 900 posts and attracted more than
6,000 daily readers to the blog, including the architects of the API itself. I’ve been Slashdotted,
Dug (at Digg), and linked to from the New York Times site, as well as the sites of hundreds of
other mainstream papers and magazines. In June 2006, Google arranged for my entire family to
travel across the country so I could speak at the Google Geo Developer Day in advance of the
Where 2.0 conference.
■FOREWORDxvi
7079ch00FM.qxd 7/27/06 3:18 PM Page xvi
So many interesting mashups have been created using the Google Maps API that it’s
becoming impossible to keep up with all of them. I liken this to the early days of the Web when
search directories began to manually catalog new web pages as they came online. The volume
of new sites quickly became too huge to handle manually, and Google itself was born.
You can see why the Google Maps API offers the key for the next killer apps on the Web. It
has been the missing link to take the Web to the next level.
This book will provide you the means to take part in this evolution of the Web. I hope to be
posting about the interesting and unique map creations that you build after reading this book.
Your creations will inspire others to do similar things, and together, we will continue to grow
the Internet, one mapping application at a time. Let me know if you build something cool!
Mike Pegg
Google Maps Mania ()
■FOREWORD xvii
7079ch00FM.qxd 7/27/06 3:18 PM Page xvii
7079ch00FM.qxd 7/27/06 3:18 PM Page xviii

About the Authors
■MICHAEL PURVIS is a Mechatronics Engineering student at the
University of Waterloo, in Ontario. He is a mostly self-taught pro-
grammer. Prior to discovering PHP, he was busy making a LEGO®
Mindstorms kit play Connect 4. Currently, he maintains an active
community site for classmates, built mostly from home-brewed
extensions to PunBB and MediaWiki.
He has written about CSS for Position Is Everything, and occa-
sionally participates in the css-discuss mailing list. He particularly
enjoys those clever layouts that mix negative margins, relative posi-
tioning, and bizarre float tricks to create fiendish, cross-browser,
flexible-width concoctions. These and other nontechnical topics
are discussed on his weblog at uwmike.com.
Offline, he enjoys cooking, cycling, and social dancing. He has worked with We-Create, Inc.
on a number of PHP-based projects, and has a strong interest in independent web standards.
■JEFFREY SAMBELLS is a graphic designer and self-taught web appli-
cations developer best known for his unique ability to merge the
visual world of graphics with the mental realm of code. With a
Bachelor of Technology degree in Graphic Communications Man-
agement along with a minor in Multimedia, Jeffrey was originally
trained for the traditional paper-and-ink printing industry, but he
soon realized the world of pixels and code was where his ideas
would prosper. In late 1999, he cofounded We-Create, Inc., an Inter-
net software company based in Waterloo, Ontario, which began
many long nights of challenging and creative innovation. Currently,
as Director of Research and Development for We-Create, Jeffrey is
responsible for investigating new and emerging Internet technologies and integrating them using
web standards-compliant methods. In late 2005, he also became a Zend Certified Engineer.
When not playing at the office, Jeffrey enjoys a variety of hobbies from photography to
woodworking. When the opportunity arises, he also enjoys floating in a canoe on the lakes of

Algonquin Provincial Park or going on an adventurous, map-free, drive with his wife. Jeffrey
also maintains a personal website at JeffreySambells.com, where he shares thoughts, ideas,
and opinions about web technologies, photography, design, and more. He lives in Ontario,
Canada, eh, with his wife, Stephanie, and their little dog, Milo.
xix
7079ch00FM.qxd 7/27/06 3:18 PM Page xix
■CAMERON TURNER has been programming computers since his first
VIC 20 at age 7. He has been developing interactive websites since
1994. In 1999, he cofounded We-Create, Inc., which specializes in
Internet software development. He is now the company’s Chief
Technology Officer. Cam obtained his Honors degree in Computer
Science from the University of Waterloo with specialization in
applied cryptography, database design, and computer security.
Cam lives in Canada’s technology capital of Waterloo, Ontario,
with his wife, Tanya, son Owen, and dog Katie. His hobbies include
biking, hiking, water skiing, and painting. He maintains a personal
blog at CamTurner.com, discussing nontechnical topics, thoughts,
theories, and family life.
■ABOUT THE AUTHORSxx
7079ch00FM.qxd 7/27/06 3:18 PM Page xx
About the Technical Reviewer
■TERRILL DENT is enrolled in Honors Mathematics at the University of
Waterloo. His major interests center around Internet culture, twentieth
century history, and economic theory. Terrill.ca is home to his weblog,
and MapLet.ca is the front for his web application ventures, where he
lets his acute attention to detail show through. Apart from work, he busies
himself with fine arts, cycling, and an occasional novel.
xxi
7079ch00FM.qxd 7/27/06 3:18 PM Page xxi
7079ch00FM.qxd 7/27/06 3:18 PM Page xxii

Acknowledgments
The authors would like to thank Mike Pegg of Google Maps Mania for giving Apress our names
when contacted about doing a book on Google Maps. This book would not have been possible
without his encouragement, support, generosity, and friendship.
Thanks to Terrill for finding the errors of our bleary-eyed coding sessions and helping make
this book what it is today.
Thanks to Jason, Elizabeth, Marilyn, Katie, Julie, and the rest of the team at Apress. We hope
that working with us has been as much fun for you as working with you was for us.
xxiii
7079ch00FM.qxd 7/27/06 3:18 PM Page xxiii
7079ch00FM.qxd 7/27/06 3:18 PM Page xxiv

×